From 20318b05c8b5f031599f50a561f69cf13d63824b Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 21 Aug 2017 10:10:12 +0800 Subject: [PATCH 001/150] change the sliceTake and sliceSkip behavior they will not throw for a n < 0 and n > list.Length. they return [] instead. this make arr.[..a] always the same with arr.[0..a] arr.[a..(arr.Length-1)] === arr.[a..] --- src/fsharp/FSharp.Core/prim-types.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 01404d469e5..2c6d24f8cdd 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -3622,7 +3622,7 @@ namespace Microsoft.FSharp.Collections // similar to 'take' but with n representing an index, not a number of elements // and with exceptions matching array slicing let sliceTake n l = - if n < 0 then outOfRange() + if n < 0 then [] match l with | [] -> outOfRange() | x::xs -> @@ -3637,7 +3637,7 @@ namespace Microsoft.FSharp.Collections match lst with | _ when i = 0 -> lst | _::t -> loop (i-1) t - | [] -> outOfRange() + | [] -> [] loop n l type List<'T> with From 61232e1c9c69f09a4e316aaf5902271e6f71c6f2 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 21 Aug 2017 17:50:15 +0800 Subject: [PATCH 002/150] fixed the compile error --- src/fsharp/FSharp.Core/prim-types.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 2c6d24f8cdd..4a0ebbfc406 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -3622,7 +3622,7 @@ namespace Microsoft.FSharp.Collections // similar to 'take' but with n representing an index, not a number of elements // and with exceptions matching array slicing let sliceTake n l = - if n < 0 then [] + if n < 0 then [] else match l with | [] -> outOfRange() | x::xs -> From 4788e9d024aad771a76b4eb86dd4455db7b7ec87 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 Oct 2017 00:12:23 +0300 Subject: [PATCH 003/150] use QuickParse to get proper full idents island in UnusedOpensDiagnosticAnalyzer --- .../Diagnostics/UnusedOpensDiagnosticAnalyzer.fs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 0dcb5c9da5d..1d0f33a32c6 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -74,11 +74,9 @@ module private UnusedOpens = | None -> [] let symbolIsFullyQualified (sourceText: SourceText) (sym: FSharpSymbolUse) (fullName: string) = - match RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, sym.RangeAlternate) with - | Some span // check that the symbol hasn't provided an invalid span - when sourceText.Length < span.Start - || sourceText.Length < span.End -> false - | Some span -> sourceText.ToString span = fullName + let lineStr = sourceText.Lines.[Line.toZ sym.RangeAlternate.StartLine].ToString() + match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with + | Some (island, _, _) -> island = fullName | None -> false let getUnusedOpens (sourceText: SourceText) (parsedInput: ParsedInput) (symbolUses: FSharpSymbolUse[]) = From c422581e399ba05388f0baff3fae8909f3481387 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 Oct 2017 17:16:31 +0300 Subject: [PATCH 004/150] module scope aware unused opens --- .../UnusedOpensDiagnosticAnalyzer.fs | 86 ++++++++++++------- 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 1d0f33a32c6..d470eefed8e 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -17,28 +17,39 @@ open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.SourceCodeServices open Symbols - module private UnusedOpens = - - - let rec visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) decls : (Set * range) list = + /// Represents single open statement. + type OpenStatement = + { /// Open namespace or module effective names. + Names: Set + /// Range of open statement itself. + Range: range + /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). + ModuleRange: range } + + let rec visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = [ for decl in decls do match decl with | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> yield - set [ yield (longId |> List.map(fun l -> l.idText) |> String.concat ".") - // `open N.M` can open N.M module from parent module as well, if it's non empty - if not (List.isEmpty parent) then - yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ], range - | SynModuleDecl.NestedModule(SynComponentInfo.ComponentInfo(longId = longId),_, decls,_,_) -> - yield! visitSynModuleOrNamespaceDecls longId decls + { Names = + set [ yield (longId |> List.map(fun l -> l.idText) |> String.concat ".") + // `open N.M` can open N.M module from parent module as well, if it's non empty + if not (List.isEmpty parent) then + yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ] + Range = range + ModuleRange = moduleRange } + + | SynModuleDecl.NestedModule(SynComponentInfo.ComponentInfo(longId = longId),_, decls,_,moduleRange) -> + yield! visitSynModuleOrNamespaceDecls longId decls moduleRange | _ -> () ] - let getOpenStatements = function + let getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = + match parsedInput with | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> [ for md in modules do - let SynModuleOrNamespace(longId = longId; decls = decls) = md - yield! visitSynModuleOrNamespaceDecls longId decls ] + let SynModuleOrNamespace(longId = longId; decls = decls; range = moduleRange) = md + yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] | _ -> [] let getAutoOpenAccessPath (ent:FSharpEntity) = @@ -79,7 +90,11 @@ module private UnusedOpens = | Some (island, _, _) -> island = fullName | None -> false - let getUnusedOpens (sourceText: SourceText) (parsedInput: ParsedInput) (symbolUses: FSharpSymbolUse[]) = + type NamespaceUse = + { Ident: string + Location: range } + + let getUnusedOpens (sourceText: SourceText) (parsedInput: ParsedInput) (symbolUses: FSharpSymbolUse[]) : range list = let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` @@ -117,25 +132,32 @@ module private UnusedOpens = yield! entityNamespace declaringEntity ] } |> Option.toList |> List.concat |> List.choose id - let namespacesInUse = + let namespacesInUse : NamespaceUse list = symbolUses - |> Seq.filter (fun (s: FSharpSymbolUse) -> not s.IsFromDefinition) - |> Seq.collect getPossibleNamespaces - |> Set.ofSeq - - let filter list: (Set * range) list = - let rec filterInner acc list (seenNamespaces: Set) = - let notUsed ns = not (namespacesInUse.Contains ns) || seenNamespaces.Contains ns + |> Array.filter (fun (s: FSharpSymbolUse) -> not s.IsFromDefinition) + |> Array.toList + |> List.collect (fun x -> + getPossibleNamespaces x + |> List.distinct + |> List.map (fun ns -> { Ident = ns; Location = x.RangeAlternate })) + + let filter list: OpenStatement list = + let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = + + let notUsed (os: OpenStatement) = + not (namespacesInUse |> List.exists (fun nsu -> rangeContainsRange os.ModuleRange nsu.Location && os.Names |> Set.contains nsu.Ident)) + || seenOpenStatements |> List.contains os + match list with - | (ns, range) :: xs when ns |> Set.forall notUsed -> - filterInner ((ns, range) :: acc) xs (seenNamespaces |> Set.union ns) - | (ns, _) :: xs -> - filterInner acc xs (seenNamespaces |> Set.union ns) + | os :: xs when notUsed os -> + filterInner (os :: acc) xs (os :: seenOpenStatements) + | os :: xs -> + filterInner acc xs (os :: seenOpenStatements) | [] -> List.rev acc - filterInner [] list Set.empty + + filterInner [] list [] - let openStatements = getOpenStatements parsedInput - openStatements |> filter |> List.map snd + parsedInput |> getOpenStatements |> filter |> List.map (fun os -> os.Range) [] type internal UnusedOpensDiagnosticAnalyzer() = @@ -158,7 +180,7 @@ type internal UnusedOpensDiagnosticAnalyzer() = override __.SupportedDiagnostics = ImmutableArray.Create Descriptor override this.AnalyzeSyntaxAsync(_, _) = Task.FromResult ImmutableArray.Empty - static member GetUnusedOpenRanges(document: Document, options, checker: FSharpChecker) = + static member GetUnusedOpenRanges(document: Document, options, checker: FSharpChecker) : Async> = asyncMaybe { do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() @@ -178,10 +200,10 @@ type internal UnusedOpensDiagnosticAnalyzer() = return unusedOpens - |> List.map (fun m -> + |> List.map (fun range -> Diagnostic.Create( Descriptor, - RoslynHelpers.RangeToLocation(m, sourceText, document.FilePath))) + RoslynHelpers.RangeToLocation(range, sourceText, document.FilePath))) |> Seq.toImmutableArray } |> Async.map (Option.defaultValue ImmutableArray.Empty) From 5f2eb3e72de369dc676bf153096e58021019e70e Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 Oct 2017 20:47:07 +0300 Subject: [PATCH 005/150] fix notUsed logic --- .../Diagnostics/UnusedOpensDiagnosticAnalyzer.fs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index d470eefed8e..17ae3e3dbc1 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -145,8 +145,17 @@ module private UnusedOpens = let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = let notUsed (os: OpenStatement) = - not (namespacesInUse |> List.exists (fun nsu -> rangeContainsRange os.ModuleRange nsu.Location && os.Names |> Set.contains nsu.Ident)) - || seenOpenStatements |> List.contains os + let notUsedAnywhere = not (namespacesInUse |> List.exists (fun nsu -> rangeContainsRange os.ModuleRange nsu.Location && os.Names |> Set.contains nsu.Ident)) + if notUsedAnywhere then true + else + let alreadySeen = + seenOpenStatements + |> List.exists (fun seenNs -> + // if such open statement has already been marked as used in this or outer module, we skip it + // (that is, do not mark as used so far) + (seenNs.ModuleRange = os.ModuleRange || rangeContainsRange seenNs.ModuleRange os.ModuleRange) && + not (os.Names |> Set.intersect seenNs.Names |> Set.isEmpty)) + alreadySeen match list with | os :: xs when notUsed os -> From 2899fb6b2542d4ce22ab78c95b0663fe3d2f44db Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 Oct 2017 22:01:46 +0300 Subject: [PATCH 006/150] start adding UnusedOpensDiagnosticAnalyzer tests --- .../UnusedOpensDiagnosticAnalyzer.fs | 17 +++-- .../UnusedOpensDiagnosticAnalyzerTests.fs | 62 +++++++++++++++++++ .../unittests/VisualFSharp.Unittests.fsproj | 3 + 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 17ae3e3dbc1..9b2aff4d31d 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -17,9 +17,9 @@ open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.SourceCodeServices open Symbols -module private UnusedOpens = +module internal UnusedOpens = /// Represents single open statement. - type OpenStatement = + type private OpenStatement = { /// Open namespace or module effective names. Names: Set /// Range of open statement itself. @@ -27,7 +27,7 @@ module private UnusedOpens = /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). ModuleRange: range } - let rec visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = + let rec private visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = [ for decl in decls do match decl with | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> @@ -44,7 +44,7 @@ module private UnusedOpens = yield! visitSynModuleOrNamespaceDecls longId decls moduleRange | _ -> () ] - let getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = + let private getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = match parsedInput with | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> [ for md in modules do @@ -52,7 +52,7 @@ module private UnusedOpens = yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] | _ -> [] - let getAutoOpenAccessPath (ent:FSharpEntity) = + let private getAutoOpenAccessPath (ent:FSharpEntity) = // Some.Namespace+AutoOpenedModule+Entity // HACK: I can't see a way to get the EnclosingEntity of an Entity @@ -63,7 +63,7 @@ module private UnusedOpens = else None) - let entityNamespace (entOpt: FSharpEntity option) = + let private entityNamespace (entOpt: FSharpEntity option) = match entOpt with | Some ent -> if ent.IsFSharpModule then @@ -84,18 +84,17 @@ module private UnusedOpens = ] | None -> [] - let symbolIsFullyQualified (sourceText: SourceText) (sym: FSharpSymbolUse) (fullName: string) = + let private symbolIsFullyQualified (sourceText: SourceText) (sym: FSharpSymbolUse) (fullName: string) = let lineStr = sourceText.Lines.[Line.toZ sym.RangeAlternate.StartLine].ToString() match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with | Some (island, _, _) -> island = fullName | None -> false - type NamespaceUse = + type private NamespaceUse = { Ident: string Location: range } let getUnusedOpens (sourceText: SourceText) (parsedInput: ParsedInput) (symbolUses: FSharpSymbolUse[]) : range list = - let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn diff --git a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs new file mode 100644 index 00000000000..0bd04c38c8b --- /dev/null +++ b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs @@ -0,0 +1,62 @@ +// 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 Microsoft.VisualStudio.FSharp.Editor.Tests.Roslyn + +open System + +open NUnit.Framework + +open Microsoft.CodeAnalysis.Text +open Microsoft.VisualStudio.FSharp.Editor +open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.FSharp.Compiler.Range +open FsUnit + +[] +[] +type UnusedOpensDiagnosticAnalyzer() = + + let filePath = "C:\\test.fs" + + let projectOptions : FSharpProjectOptions = + { ProjectFileName = "C:\\test.fsproj" + SourceFiles = [| filePath |] + ReferencedProjects = [| |] + OtherOptions = [| |] + IsIncompleteTypeCheckEnvironment = true + UseScriptResolutionRules = false + LoadTime = DateTime.MaxValue + OriginalLoadReferences = [] + UnresolvedReferences = None + ExtraProjectInfo = None + Stamp = None } + + let mutable checker = lazy (FSharpChecker.Create()) + + let (=>) (source: string) (expectedRanges: (int * (int * int)) list) = + let sourceText = SourceText.From(source) + + let parsedInput, checkFileResults = + let parseResults, checkFileAnswer = checker.Value.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously + match checkFileAnswer with + | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" + | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> + match parseResults.ParseTree with + | None -> failwith "Parse returns None ParseTree" + | Some parsedInput -> parsedInput, checkFileResults + + let allSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let unusedOpenRanges = UnusedOpens.getUnusedOpens sourceText parsedInput allSymbolUses + + unusedOpenRanges + |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) + |> shouldEqual expectedRanges + + [] + member __.``top level module``() = + """ +module TopModule +open System +open System.IO +let _ = DateTime.Now +""" + => [ 4, (5, 14) ] diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index 5603dd80587..ff32aba7b3c 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -134,6 +134,9 @@ Roslyn\DocumentHighlightsServiceTests.fs + + Roslyn\UnusedOpensDiagnosticAnalyzerTests.fs + VisualFSharp.Unittests.dll.config {VisualStudioVersion} From 1e156fc151067348743bb22aacbf20d9dc31922d Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 Oct 2017 22:42:07 +0300 Subject: [PATCH 007/150] port all UnusedOpensDiagnosticAnalyzer tests from VFPT --- .../UnusedOpensDiagnosticAnalyzerTests.fs | 682 ++++++++++++++++-- 1 file changed, 639 insertions(+), 43 deletions(-) diff --git a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs index 0bd04c38c8b..099bd0527e9 100644 --- a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs @@ -1,58 +1,54 @@ // 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 Microsoft.VisualStudio.FSharp.Editor.Tests.Roslyn +[] +[] +module Microsoft.VisualStudio.FSharp.Editor.Tests.Roslyn.UnusedOpensDiagnosticAnalyzer open System - open NUnit.Framework - open Microsoft.CodeAnalysis.Text open Microsoft.VisualStudio.FSharp.Editor open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler.Range open FsUnit -[] -[] -type UnusedOpensDiagnosticAnalyzer() = - - let filePath = "C:\\test.fs" +let private filePath = "C:\\test.fs" + +let private projectOptions : FSharpProjectOptions = + { ProjectFileName = "C:\\test.fsproj" + 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) (expectedRanges: (int * (int * int)) list) = + let sourceText = SourceText.From(source) + + let parsedInput, checkFileResults = + let parseResults, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously + match checkFileAnswer with + | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" + | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> + match parseResults.ParseTree with + | None -> failwith "Parse returns None ParseTree" + | Some parsedInput -> parsedInput, checkFileResults + + let allSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let unusedOpenRanges = UnusedOpens.getUnusedOpens sourceText parsedInput allSymbolUses - let projectOptions : FSharpProjectOptions = - { ProjectFileName = "C:\\test.fsproj" - SourceFiles = [| filePath |] - ReferencedProjects = [| |] - OtherOptions = [| |] - IsIncompleteTypeCheckEnvironment = true - UseScriptResolutionRules = false - LoadTime = DateTime.MaxValue - OriginalLoadReferences = [] - UnresolvedReferences = None - ExtraProjectInfo = None - Stamp = None } - - let mutable checker = lazy (FSharpChecker.Create()) - - let (=>) (source: string) (expectedRanges: (int * (int * int)) list) = - let sourceText = SourceText.From(source) - - let parsedInput, checkFileResults = - let parseResults, checkFileAnswer = checker.Value.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously - match checkFileAnswer with - | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" - | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> - match parseResults.ParseTree with - | None -> failwith "Parse returns None ParseTree" - | Some parsedInput -> parsedInput, checkFileResults - - let allSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let unusedOpenRanges = UnusedOpens.getUnusedOpens sourceText parsedInput allSymbolUses - - unusedOpenRanges - |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) - |> shouldEqual expectedRanges + unusedOpenRanges + |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) + |> shouldEqual expectedRanges - [] - member __.``top level module``() = +[] +let ``unused open declaration in top level module``() = """ module TopModule open System @@ -60,3 +56,603 @@ open System.IO let _ = DateTime.Now """ => [ 4, (5, 14) ] + +[] +let ``unused open declaration in namespace``() = + """ +namespace TopNamespace +open System +open System.IO +module Nested = + let _ = DateTime.Now +""" + => [ 4, (5, 14) ] + +[] +let ``unused open declaration in nested module``() = + """ +namespace TopNamespace +module Nested = + open System + open System.IO + let _ = DateTime.Now +""" + => [ 5, (9, 18) ] + +[] +let ``unused open declaration due to partially qualified symbol``() = + """ +module TopModule +open System +open System.IO +let _ = IO.File.Create "" +""" + => [ 4, (5, 14) ] + +[] +let ``unused parent open declaration due to partially qualified symbol``() = + """ +module TopModule +open System +open System.IO +let _ = File.Create "" +""" + => [ 3, (5, 11) ] + +[] +let ``open statement duplication in parent module is unused``() = + """ +module TopModule +open System.IO +module Nested = + open System.IO + let _ = File.Create "" +""" + => [ 5, (9, 18) ] + +[] +let ``open statement duplication in parent module is marked as unused even though it seems to be used in its scope``() = + """ +module TopModule +open System.IO +module Nested = + open System.IO + let _ = File.Create "" +let _ = File.Create "" +""" + => [ 5, (9, 18) ] + +[] +let ``multiple open declaration in the same line``() = + """ +open System.IO; let _ = File.Create "";; open System.IO +""" + => [ 2, (46, 55) ] + +[] +let ``open a nested module inside another one is not unused``() = + """ +module Top +module M1 = + let x = () +module M2 = + open M1 + let y = x +""" + => [] + +[] +let ``open a nested module inside another one is not unused, complex hierarchy``() = + """ +module Top = + module M1 = + module M11 = + let x = () + module M2 = + module M22 = + open M1.M11 + let y = x +""" + => [] + +[] +let ``open a nested module inside another one is not unused, even more complex hierarchy``() = + """ +module Top = + module M1 = + module M11 = + module M111 = + module M1111 = + let x = () + module M2 = + module M22 = + open M1.M11.M111.M1111 + let y = x +""" + => [] + +[] +let ``last of several equivalent open declarations is market as used, the rest of them are marked as unused``() = + """ +module NormalModule = + [] + module AutoOpenModule1 = + module NestedNormalModule = + [] + module AutoOpenModule2 = + [] + module AutoOpenModule3 = + type Class() = class end + +open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 +open NormalModule.AutoOpenModule1.NestedNormalModule +let _ = Class() +""" + => [ 12, (5, 68) ] + +[] +let ``open declaration is not marked as unused if there is a shortened attribute symbol from it``() = + """ +open System +[] +type Class() = class end +""" + => [] + +[] +let ``open declaration is not marked as unused if an extension property is used``() = + """ +module Module = + type System.String with + member __.ExtensionProperty = () +open Module +let _ = "a long string".ExtensionProperty +""" + => [] + +[] +let ``open declaration is marked as unused if an extension property is not used``() = + """ +module Module = + type System.String with + member __.ExtensionProperty = () +open Module +let _ = "a long string".Trim() +""" + => [ 5, (5, 11) ] + +[] +let ``open declaration is not marked as unused if an extension method is used``() = + """ +type Class() = class end +module Module = + type Class with + member __.ExtensionMethod() = () +open Module +let x = Class() +let _ = x.ExtensionMethod() +""" + => [] + +[] +let ``open declaration is marked as unused if an extension method is not used``() = + """ +type Class() = class end +module Module = + type Class with + member __.ExtensionMethod() = () +open Module +let x = Class() +""" + => [ 6, (5, 11) ] + +[] +let ``open declaration is not marked as unused if one of its types is used in a constructor signature``() = + """ +module M = + type Class() = class end +open M +type Site (x: Class -> unit) = class end +""" + => [] + +[] +let ``open declaration is marked as unused if nothing from it is used``() = + """ +module M = + type Class() = class end +open M +type Site (x: int -> unit) = class end +""" + => [ 4, (5, 6) ] + +[] +let ``static extension method applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = + """ +module Extensions = + type System.DateTime with + static member ExtensionMethod() = () +open System +open Extensions +let _ = DateTime.ExtensionMethod +""" + => [] + +[] +let ``static extension property applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = + """ +module Extensions = + type System.DateTime with + static member ExtensionProperty = () +open System +open Extensions +let _ = DateTime.ExtensionProperty +""" + => [] + +[] +let ``accessing property on a variable should not force the namespace in which the type is declared to be marked as used``() = + """ +let dt = System.DateTime.Now +module M = + open System + let _ = dt.Hour +""" + => [4, (9, 15) ] + +[] +let ``either of two open declarations are not marked as unused if symbols from both of them are used``() = + """ +module M1 = + module M2 = + let func1 _ = () + module M3 = + let func2 _ = () +open M1.M2.M3 +open M1.M2 +let _ = func1() +let _ = func2() +""" + => [] + +[] +let ``open module with ModuleSuffix attribute value applied is not marked as unused if a symbol declared in it is used``() = + """ +[] +module M = + let func _ = () +open M +let _ = func() +""" + => [] + +[] +let ``open module all of which symbols are used by qualifier is marked as unused``() = + """ +module M = + let func _ = () +open M +let _ = M.func 1 +""" + => [4, (5, 6) ] + +[] +let ``open module is not marked as unused if a symbol defined in it is used in OCaml-style type annotation``() = + """ +module M = + type Class() = class end +open M +let func (arg: Class list) = () +""" + => [] + +[] +let ``auto open module``() = + """ +module Top = + [] + module M = + let func _ = () +open Top +let _ = func() +""" + => [] + +[] +let ``auto open module in the middle of hierarchy``() = + """ +namespace Ns +module M1 = + [] + module MA1 = + let func _ = () +open M1 +module M2 = + let _ = func() +""" + => [] + +[] +let ``open declaration is not marked as unused if a delegate defined in it is used``() = + """ +open System +let _ = Func(fun _ -> 1) +""" + => [] + +[] +let ``open declaration is not marked as unused if a unit of measure defined in it is used``() = + """ +module M = + type [] m +module N = + open M + let _ = 1 +""" + => [] + +[] +let ``open declaration is not marked as unused if an attribute defined in it is applied on an interface member argument``() = + """ +open System.Runtime.InteropServices +type T = abstract M: [] ?x: int -> unit +""" + => [] + +[] +let ``relative module open declaration``() = + """ +module Top = + module Nested = + let x = 1 +open Top +open Nested +let _ = x +""" + => [] + +[] +let ``open declaration is used if a symbol defined in it is used in a module top-level do expression``() = + """ +module Top +open System.IO +File.ReadAllLines "" +|> ignore +""" + => [] + +[] +let ``redundant opening a module with ModuleSuffix attribute value is marks as unused``() = + """ +[] +module InternalModuleWithSuffix = + let func1 _ = () +module M = + open InternalModuleWithSuffix + let _ = InternalModuleWithSuffix.func1() +""" + => [ 6, (9, 33) ] + +[] +let ``redundant opening a module is marks as unused``() = + """ +module InternalModuleWithSuffix = + let func1 _ = () +module M = + open InternalModuleWithSuffix + let _ = InternalModuleWithSuffix.func1() +""" + => [ 5, (9, 33) ] + +[] +let ``usage of an unqualified union case doesn't make an opening module where it's defined to be marked as unused``() = + """ +module M = + type DU = Case1 +open M +let _ = Case1 +""" + => [] + +[] +let ``usage of qualified union case doesn't make an opening module where it's defined to be marked as unused``() = + """ +module M = + type DU = Case1 +open M +let _ = DU.Case1 +""" + => [] + +[] +let ``type with different DisplayName``() = + """ +open Microsoft.FSharp.Quotations +let _ = Expr.Coerce (<@@ 1 @@>, typeof) +""" + => [] + +[] +let ``auto open module with ModuleSuffix attribute value``() = + """ +module Top = + [] + module Module = + let func _ = () +open Top +module Module1 = + let _ = func() +""" + => [] + +[] +let ``a type which has more than one DisplayName causes the namespace it's defined in to be not marked as unused``() = + """ +open System +let _ = IntPtr.Zero +""" + => [] + +[] +let ``usage of an operator makes the module it's defined in to be not marked as unused``() = + """ +module M = + let (++|) x y = () +open M +let _ = 1 ++| 2 +""" + => [] + +[] +let ``usage of an operator makes the module /with Module suffix/ it's defined in to be not marked as unused``() = + """ +[] +module M = + let (++|) x y = () +open M +let _ = 1 ++| 2 +""" + => [] + +[] +let ``type used in pattern matching with "as" keyword causes the module in which the type is defined to be not marked as unused``() = + """ +module M = + type Class() = class end +open M +let _ = match obj() with + | :? Class as c -> () + | _ -> () +""" + => [] + +[] +let ``a function from printf family prevents Printf module from marking as unused``() = + """ +open Microsoft.FSharp.Core.Printf +open System.Text +let _ = bprintf (StringBuilder()) "%A" 1 +""" + => [] + +[] +let ``assembly level attribute prevents namespace in which it's defined to be marked as unused``() = + """ +open System +[] +() +""" + => [] + +[] +let ``open declaration is not marked as unused if a related type extension is used``() = + """ +module Module = + open System + type String with + member __.Method() = () +""" + => [] + +[] +let ``open declaration is not marked as unused if a symbol defined in it is used in type do block``() = + """ +open System.IO.Compression + +type OutliningHint() as self = + do self.E.Add (fun (e: GZipStream) -> ()) + member __.E: IEvent<_> = Unchecked.defaultof<_> +""" + => [] + +[] +let ``should not mark open declaration with global prefix``() = + """ +module Module = + open global.System + let _ = String("") +""" + => [] + +[] +let ``should mark open declaration with global prefix in double backticks``() = + """ +module Module = + open ``global``.Namesp + let _ = System.String("") +""" + => [ 3, (9, 26) ] + +[] +let ``record fields should be taken into account``() = + """ +module M1 = + type Record = { Field: int } +module M2 = + open M1 + let x = { Field = 0 } +""" + => [] + +[] +let ``handle type alias``() = + """ +module TypeAlias = + type MyInt = int +module Usage = + open TypeAlias + let f (x:MyInt) = x +""" + => [] + +[] +let ``handle override members``() = + """ +type IInterface = + abstract Property: int + +type IClass() = + interface IInterface with + member __.Property = 0 + +let f (x: IClass) = (x :> IInterface).Property +""" + => [] + +[] +let ``active pattern cases should be taken into account``() = + """ +module M = + let (|Pattern|_|) _ = Some() +open M +let f (Pattern _) = () +""" + => [] + +[] +let ``active patterns applied as a function should be taken into account``() = + """ +module M = + let (|Pattern|_|) _ = Some() +open M +let _ = (|Pattern|_|) () +""" + => [] + +[] +let ``not used active pattern does not make the module in which it's defined to not mark as unused``() = + """ +module M = + let (|Pattern|_|) _ = Some() +open M +let _ = 1 +""" + => [ 4, (5, 6) ] + +[] +let ``type in type parameter constraint should be taken into account``() = + """ +open System +let f (x: 'a when 'a :> IDisposable) = () +""" + => [] From 7673c14696397b0560999171437ce0ffc3abf0fd Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 12:15:46 +0300 Subject: [PATCH 008/150] fix some test, ignore other --- .../UnusedOpensDiagnosticAnalyzer.fs | 52 ++++++++++++++----- .../UnusedOpensDiagnosticAnalyzerTests.fs | 12 ++++- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 9b2aff4d31d..890b3bd75e2 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -20,8 +20,10 @@ open Symbols module internal UnusedOpens = /// Represents single open statement. type private OpenStatement = - { /// Open namespace or module effective names. - Names: Set + { /// Full namespace or module identifier as it's presented in source code. + LiteralIdent: string + /// All possible namespace or module identifiers, including the literal one. + AllPossibleIdents: Set /// Range of open statement itself. Range: range /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). @@ -31,9 +33,11 @@ module internal UnusedOpens = [ for decl in decls do match decl with | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> + let literalIdent = longId |> List.map(fun l -> l.idText) |> String.concat "." yield - { Names = - set [ yield (longId |> List.map(fun l -> l.idText) |> String.concat ".") + { LiteralIdent = literalIdent + AllPossibleIdents = + set [ yield literalIdent // `open N.M` can open N.M module from parent module as well, if it's non empty if not (List.isEmpty parent) then yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ] @@ -127,24 +131,45 @@ module internal UnusedOpens = return [ for name in fullNames do - yield getPartNamespace symbolUse name + let partNamespace = getPartNamespace symbolUse name + yield partNamespace yield! entityNamespace declaringEntity ] } |> Option.toList |> List.concat |> List.choose id let namespacesInUse : NamespaceUse list = - symbolUses - |> Array.filter (fun (s: FSharpSymbolUse) -> not s.IsFromDefinition) + let importantSymbolUses = + symbolUses + |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> + not symbolUse.IsFromDefinition && + match symbolUse.Symbol with + | :? FSharpEntity as e -> not e.IsNamespace + | _ -> true + ) + + importantSymbolUses |> Array.toList - |> List.collect (fun x -> - getPossibleNamespaces x - |> List.distinct - |> List.map (fun ns -> { Ident = ns; Location = x.RangeAlternate })) + |> List.collect (fun su -> + let lineStr = sourceText.Lines.[Line.toZ su.RangeAlternate.StartLine].ToString() + let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) + let qualifier = partialName.QualifyingIdents |> String.concat "." + getPossibleNamespaces su + |> List.distinct + |> List.choose (fun ns -> + if qualifier = "" then Some ns + elif ns = qualifier then None + elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] + else None) + |> List.map (fun ns -> + { Ident = ns + Location = su.RangeAlternate })) let filter list: OpenStatement list = let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = let notUsed (os: OpenStatement) = - let notUsedAnywhere = not (namespacesInUse |> List.exists (fun nsu -> rangeContainsRange os.ModuleRange nsu.Location && os.Names |> Set.contains nsu.Ident)) + let notUsedAnywhere = + not (namespacesInUse |> List.exists (fun nsu -> + rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) if notUsedAnywhere then true else let alreadySeen = @@ -152,8 +177,7 @@ module internal UnusedOpens = |> List.exists (fun seenNs -> // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) - (seenNs.ModuleRange = os.ModuleRange || rangeContainsRange seenNs.ModuleRange os.ModuleRange) && - not (os.Names |> Set.intersect seenNs.Names |> Set.isEmpty)) + rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) alreadySeen match list with diff --git a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs index 099bd0527e9..6bdc6ff5daf 100644 --- a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs @@ -28,7 +28,7 @@ let private projectOptions : FSharpProjectOptions = let private checker = FSharpChecker.Create() -let (=>) (source: string) (expectedRanges: (int * (int * int)) list) = +let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * (*end column*)int)) list) = let sourceText = SourceText.From(source) let parsedInput, checkFileResults = @@ -142,6 +142,7 @@ module M2 = => [] [] +[] let ``open a nested module inside another one is not unused, complex hierarchy``() = """ module Top = @@ -156,6 +157,7 @@ module Top = => [] [] +[] let ``open a nested module inside another one is not unused, even more complex hierarchy``() = """ module Top = @@ -172,6 +174,7 @@ module Top = => [] [] +[] let ``last of several equivalent open declarations is market as used, the rest of them are marked as unused``() = """ module NormalModule = @@ -200,6 +203,7 @@ type Class() = class end => [] [] +[] let ``open declaration is not marked as unused if an extension property is used``() = """ module Module = @@ -222,6 +226,7 @@ let _ = "a long string".Trim() => [ 5, (5, 11) ] [] +[] let ``open declaration is not marked as unused if an extension method is used``() = """ type Class() = class end @@ -327,6 +332,7 @@ let _ = func() => [] [] +[] let ``open module all of which symbols are used by qualifier is marked as unused``() = """ module M = @@ -381,6 +387,7 @@ let _ = Func(fun _ -> 1) => [] [] +[] let ``open declaration is not marked as unused if a unit of measure defined in it is used``() = """ module M = @@ -422,6 +429,7 @@ File.ReadAllLines "" => [] [] +[] let ``redundant opening a module with ModuleSuffix attribute value is marks as unused``() = """ [] @@ -434,6 +442,7 @@ module M = => [ 6, (9, 33) ] [] +[] let ``redundant opening a module is marks as unused``() = """ module InternalModuleWithSuffix = @@ -545,6 +554,7 @@ open System => [] [] +[] let ``open declaration is not marked as unused if a related type extension is used``() = """ module Module = From bf88499644b9a2e1f5840bdba678390673b912ef Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 14:04:09 +0300 Subject: [PATCH 009/150] fix and ignore tests --- .../UnusedOpensDiagnosticAnalyzer.fs | 28 ++++++++++--------- .../UnusedOpensDiagnosticAnalyzerTests.fs | 4 +++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 890b3bd75e2..7130c30cb4f 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -166,21 +166,23 @@ module internal UnusedOpens = let filter list: OpenStatement list = let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = - let notUsed (os: OpenStatement) = - let notUsedAnywhere = - not (namespacesInUse |> List.exists (fun nsu -> - rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) - if notUsedAnywhere then true + let notUsed (os: OpenStatement) = + if os.LiteralIdent.StartsWith "`global`" then false else - let alreadySeen = - seenOpenStatements - |> List.exists (fun seenNs -> - // if such open statement has already been marked as used in this or outer module, we skip it - // (that is, do not mark as used so far) - rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) - alreadySeen + let notUsedAnywhere = + not (namespacesInUse |> List.exists (fun nsu -> + rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) + if notUsedAnywhere then true + else + let alreadySeen = + seenOpenStatements + |> List.exists (fun seenNs -> + // if such open statement has already been marked as used in this or outer module, we skip it + // (that is, do not mark as used so far) + rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) + alreadySeen - match list with + match list with | os :: xs when notUsed os -> filterInner (os :: acc) xs (os :: seenOpenStatements) | os :: xs -> diff --git a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs index 6bdc6ff5daf..e97f4d78a40 100644 --- a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs @@ -272,6 +272,7 @@ type Site (x: int -> unit) = class end => [ 4, (5, 6) ] [] +[] let ``static extension method applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = @@ -284,6 +285,7 @@ let _ = DateTime.ExtensionMethod => [] [] +[] let ``static extension property applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = @@ -594,6 +596,7 @@ module Module = => [ 3, (9, 26) ] [] +[] let ``record fields should be taken into account``() = """ module M1 = @@ -605,6 +608,7 @@ module M2 = => [] [] +[] let ``handle type alias``() = """ module TypeAlias = From 2335589db18b19e3b3744b869d207ab4e51ac519 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 16:26:48 +0300 Subject: [PATCH 010/150] move Unused Opens analyzer core logic to FCS --- ...FSharp.Compiler.Service.netstandard.fsproj | 12 + .../FSharp.Compiler.Service.fsproj | 12 + .../FSharp.Compiler.Private.fsproj | 12 + .../FSharp.Compiler.Private.fsproj | 14 +- src/fsharp/symbols/SymbolPatterns.fs | 222 ++++++++++++++++++ src/fsharp/symbols/SymbolPatterns.fsi | 40 ++++ src/fsharp/vs/ServiceAnalysis.fs | 183 +++++++++++++++ src/fsharp/vs/ServiceAnalysis.fsi | 13 + .../UnusedOpensDiagnosticAnalyzer.fs | 180 +------------- .../FSharp.Editor/LanguageService/Symbols.fs | 216 +---------------- ...icAnalyzerTests.fs => UnusedOpensTests.fs} | 9 +- .../unittests/VisualFSharp.Unittests.fsproj | 6 +- 12 files changed, 516 insertions(+), 403 deletions(-) create mode 100644 src/fsharp/symbols/SymbolPatterns.fs create mode 100644 src/fsharp/symbols/SymbolPatterns.fsi create mode 100644 src/fsharp/vs/ServiceAnalysis.fs create mode 100644 src/fsharp/vs/ServiceAnalysis.fsi rename vsintegration/tests/unittests/{UnusedOpensDiagnosticAnalyzerTests.fs => UnusedOpensTests.fs} (97%) diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index cbf108a68e4..3b8ed6361e6 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -536,6 +536,12 @@ Symbols/Exprs.fs + + Symbols/SymbolPatterns.fsi + + + Symbols/SymbolPatterns.fs + Service/IncrementalBuild.fsi @@ -632,6 +638,12 @@ Service/ServiceStructure.fs + + Service/ServiceAnalysis.fsi + + + Service/ServiceAnalysis.fs + Service/fsi.fsi diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index fa10b3664ea..1d5057aae1c 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -512,6 +512,12 @@ Symbols/Exprs.fs + + Symbols/SymbolPatterns.fsi + + + Symbols/SymbolPatterns.fs + Service/IncrementalBuild.fsi @@ -608,6 +614,12 @@ Service/ServiceStructure.fs + + Service/ServiceAnalysis.fsi + + + Service/ServiceAnalysis.fs + Service/fsi.fsi diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 3b2d07dac41..30ce1548b6b 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -492,6 +492,12 @@ Symbols/Exprs.fs + + Symbols/SymbolPatterns.fsi + + + Symbols/SymbolPatterns.fs + @@ -590,6 +596,12 @@ Service/ServiceStructure.fs + + Service/ServiceAnalysis.fsi + + + Service/ServiceAnalysis.fs + diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 4b72bcf00f0..24f3ea8f576 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -546,6 +546,12 @@ Symbols/Exprs.fs + + Symbols/SymbolPatterns.fsi + + + Symbols/SymbolPatterns.fs + @@ -644,7 +650,13 @@ Service/ServiceStructure.fs - + + Service/ServiceAnalysis.fsi + + + Service/ServiceAnalysis.fs + + FSIstrings.txt diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs new file mode 100644 index 00000000000..2b60c182e0d --- /dev/null +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -0,0 +1,222 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Compiler.SourceCodeServices + +/// Active patterns over `FSharpSymbolUse`. +[] +module SymbolUse = + + let (|ActivePatternCase|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpActivePatternCase as ap -> ActivePatternCase(ap) |> Some + | _ -> None + + let private attributeSuffixLength = "Attribute".Length + + let (|Entity|_|) (symbol : FSharpSymbolUse) : (FSharpEntity * (* cleanFullNames *) string list) option = + match symbol.Symbol with + | :? FSharpEntity as ent -> + // strip generic parameters count suffix (List`1 => List) + let cleanFullName = + // `TryFullName` for type aliases is always `None`, so we have to make one by our own + if ent.IsFSharpAbbreviation then + [ent.AccessPath + "." + ent.DisplayName] + else + ent.TryFullName + |> Option.toList + |> List.map (fun fullName -> + if ent.GenericParameters.Count > 0 && fullName.Length > 2 then + fullName.[0..fullName.Length - 3] + else fullName) + + let cleanFullNames = + cleanFullName + |> List.collect (fun cleanFullName -> + if ent.IsAttributeType then + [cleanFullName; cleanFullName.[0..cleanFullName.Length - attributeSuffixLength - 1]] + else [cleanFullName] + ) + Some (ent, cleanFullNames) + | _ -> None + + let (|Field|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpField as field-> Some field + | _ -> None + + let (|GenericParameter|_|) (symbol: FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpGenericParameter as gp -> Some gp + | _ -> None + + let (|MemberFunctionOrValue|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpMemberOrFunctionOrValue as func -> Some func + | _ -> None + + let (|ActivePattern|_|) = function + | MemberFunctionOrValue m when m.IsActivePattern -> Some m | _ -> None + + let (|Parameter|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpParameter as param -> Some param + | _ -> None + + let (|StaticParameter|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpStaticParameter as sp -> Some sp + | _ -> None + + let (|UnionCase|_|) (symbol : FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpUnionCase as uc-> Some uc + | _ -> None + + let (|Constructor|_|) = function + | MemberFunctionOrValue func when func.IsConstructor || func.IsImplicitConstructor -> Some func + | _ -> None + + let (|TypeAbbreviation|_|) = function + | Entity (entity, _) when entity.IsFSharpAbbreviation -> Some entity + | _ -> None + + let (|Class|_|) = function + | Entity (entity, _) when entity.IsClass -> Some entity + | Entity (entity, _) when entity.IsFSharp && + entity.IsOpaque && + not entity.IsFSharpModule && + not entity.IsNamespace && + not entity.IsDelegate && + not entity.IsFSharpUnion && + not entity.IsFSharpRecord && + not entity.IsInterface && + not entity.IsValueType -> Some entity + | _ -> None + + let (|Delegate|_|) = function + | Entity (entity, _) when entity.IsDelegate -> Some entity + | _ -> None + + let (|Event|_|) = function + | MemberFunctionOrValue symbol when symbol.IsEvent -> Some symbol + | _ -> None + + let (|Property|_|) = function + | MemberFunctionOrValue symbol when symbol.IsProperty || symbol.IsPropertyGetterMethod || symbol.IsPropertySetterMethod -> Some symbol + | _ -> None + + let inline private notCtorOrProp (symbol:FSharpMemberOrFunctionOrValue) = + not symbol.IsConstructor && not symbol.IsPropertyGetterMethod && not symbol.IsPropertySetterMethod + + type FSharpSymbol with + member x.IsOperatorOrActivePattern = + let name = x.DisplayName + if name.StartsWith "( " && name.EndsWith " )" && name.Length > 4 + then name.Substring (2, name.Length - 4) |> String.forall (fun c -> c <> ' ') + else false + + type FSharpMemberOrFunctionOrValue with + member x.FullTypeSafe = try Some x.FullType with _ -> None + + let (|Method|_|) (symbolUse:FSharpSymbolUse) = + match symbolUse with + | MemberFunctionOrValue symbol when + symbol.IsModuleValueOrMember && + not symbolUse.IsFromPattern && + not symbol.IsOperatorOrActivePattern && + not symbol.IsPropertyGetterMethod && + not symbol.IsPropertySetterMethod -> Some symbol + | _ -> None + + let (|Function|_|) (symbolUse:FSharpSymbolUse) = + match symbolUse with + | MemberFunctionOrValue symbol when + notCtorOrProp symbol && + symbol.IsModuleValueOrMember && + not symbol.IsOperatorOrActivePattern && + not symbolUse.IsFromPattern -> + + match symbol.FullTypeSafe with + | Some fullType when fullType.IsFunctionType -> Some symbol + | _ -> None + | _ -> None + + let (|Operator|_|) (symbolUse:FSharpSymbolUse) = + match symbolUse with + | MemberFunctionOrValue symbol when + notCtorOrProp symbol && + not symbolUse.IsFromPattern && + not symbol.IsActivePattern && + symbol.IsOperatorOrActivePattern -> + + match symbol.FullTypeSafe with + | Some fullType when fullType.IsFunctionType -> Some symbol + | _ -> None + | _ -> None + + let (|Pattern|_|) (symbolUse:FSharpSymbolUse) = + match symbolUse with + | MemberFunctionOrValue symbol when + notCtorOrProp symbol && + not symbol.IsOperatorOrActivePattern && + symbolUse.IsFromPattern -> + + match symbol.FullTypeSafe with + | Some fullType when fullType.IsFunctionType -> Some symbol + | _ -> None + | _ -> None + + let (|ClosureOrNestedFunction|_|) = function + | MemberFunctionOrValue symbol when + notCtorOrProp symbol && + not symbol.IsOperatorOrActivePattern && + not symbol.IsModuleValueOrMember -> + + match symbol.FullTypeSafe with + | Some fullType when fullType.IsFunctionType -> Some symbol + | _ -> None + | _ -> None + + let (|Val|_|) = function + | MemberFunctionOrValue symbol when notCtorOrProp symbol && + not symbol.IsOperatorOrActivePattern -> + match symbol.FullTypeSafe with + | Some _fullType -> Some symbol + | _ -> None + | _ -> None + + let (|Enum|_|) = function + | Entity (entity, _) when entity.IsEnum -> Some entity + | _ -> None + + let (|Interface|_|) = function + | Entity (entity, _) when entity.IsInterface -> Some entity + | _ -> None + + let (|Module|_|) = function + | Entity (entity, _) when entity.IsFSharpModule -> Some entity + | _ -> None + + let (|Namespace|_|) = function + | Entity (entity, _) when entity.IsNamespace -> Some entity + | _ -> None + + let (|Record|_|) = function + | Entity (entity, _) when entity.IsFSharpRecord -> Some entity + | _ -> None + + let (|Union|_|) = function + | Entity (entity, _) when entity.IsFSharpUnion -> Some entity + | _ -> None + + let (|ValueType|_|) = function + | Entity (entity, _) when entity.IsValueType && not entity.IsEnum -> Some entity + | _ -> None + + let (|ComputationExpression|_|) (symbol:FSharpSymbolUse) = + if symbol.IsFromComputationExpression then Some symbol + else None + + let (|Attribute|_|) = function + | Entity (entity, _) when entity.IsAttributeType -> Some entity + | _ -> None \ No newline at end of file diff --git a/src/fsharp/symbols/SymbolPatterns.fsi b/src/fsharp/symbols/SymbolPatterns.fsi new file mode 100644 index 00000000000..7c297a9e907 --- /dev/null +++ b/src/fsharp/symbols/SymbolPatterns.fsi @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Compiler.SourceCodeServices + +[] +#if COMPILER_PUBLIC_API +module SymbolUse = +#else +module internal SymbolUse = +#endif + val (|ActivePatternCase|_|) : FSharpSymbolUse -> FSharpActivePatternCase option + val (|Entity|_|) : FSharpSymbolUse -> (FSharpEntity * (* cleanFullNames *) string list) option + val (|Field|_|) : FSharpSymbolUse -> FSharpField option + val (|GenericParameter|_|) : FSharpSymbolUse -> FSharpGenericParameter option + val (|MemberFunctionOrValue|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|ActivePattern|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Parameter|_|) : FSharpSymbolUse -> FSharpParameter option + val (|StaticParameter|_|) : FSharpSymbolUse -> FSharpStaticParameter option + val (|UnionCase|_|) : FSharpSymbolUse -> FSharpUnionCase option + val (|Constructor|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|TypeAbbreviation|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Class|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Delegate|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Event|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Property|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Method|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Function|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Operator|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Pattern|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|ClosureOrNestedFunction|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Val|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option + val (|Enum|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Interface|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Module|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Namespace|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Record|_|) : FSharpSymbolUse -> FSharpEntity option + val (|Union|_|) : FSharpSymbolUse -> FSharpEntity option + val (|ValueType|_|) : FSharpSymbolUse -> FSharpEntity option + val (|ComputationExpression|_|) : FSharpSymbolUse -> FSharpSymbolUse option + val (|Attribute|_|) : FSharpSymbolUse -> FSharpEntity option \ No newline at end of file diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs new file mode 100644 index 00000000000..116a656f51b --- /dev/null +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Compiler.SourceCodeServices + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.Range + +module internal UnusedOpens = + /// Represents single open statement. + type private OpenStatement = + { /// Full namespace or module identifier as it's presented in source code. + LiteralIdent: string + /// All possible namespace or module identifiers, including the literal one. + AllPossibleIdents: Set + /// Range of open statement itself. + Range: range + /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). + ModuleRange: range } + + let rec private visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = + [ for decl in decls do + match decl with + | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> + let literalIdent = longId |> List.map(fun l -> l.idText) |> String.concat "." + yield + { LiteralIdent = literalIdent + AllPossibleIdents = + set [ yield literalIdent + // `open N.M` can open N.M module from parent module as well, if it's non empty + if not (List.isEmpty parent) then + yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ] + Range = range + ModuleRange = moduleRange } + + | SynModuleDecl.NestedModule(SynComponentInfo.ComponentInfo(longId = longId),_, decls,_,moduleRange) -> + yield! visitSynModuleOrNamespaceDecls longId decls moduleRange + | _ -> () ] + + let private getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = + match parsedInput with + | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> + [ for md in modules do + let SynModuleOrNamespace(longId = longId; decls = decls; range = moduleRange) = md + yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] + | _ -> [] + + let private getAutoOpenAccessPath (ent:FSharpEntity) = + // Some.Namespace+AutoOpenedModule+Entity + + // HACK: I can't see a way to get the EnclosingEntity of an Entity + // Some.Namespace + Some.Namespace.AutoOpenedModule are both valid + ent.TryFullName |> Option.bind(fun _ -> + if (not ent.IsNamespace) && ent.QualifiedName.Contains "+" then + Some ent.QualifiedName.[0..ent.QualifiedName.IndexOf "+" - 1] + else + None) + + let private entityNamespace (entOpt: FSharpEntity option) = + match entOpt with + | Some ent -> + if ent.IsFSharpModule then + [ yield Some ent.QualifiedName + yield Some ent.LogicalName + yield Some ent.AccessPath + yield Some ent.FullName + yield Some ent.DisplayName + yield ent.TryGetFullDisplayName() + if ent.HasFSharpModuleSuffix then + yield Some (ent.AccessPath + "." + ent.DisplayName)] + else + [ yield ent.Namespace + yield Some ent.AccessPath + yield getAutoOpenAccessPath ent + for path in ent.AllCompilationPaths do + yield Some path + ] + | None -> [] + + let private symbolIsFullyQualified (getSourceLineStr: int -> string) (sym: FSharpSymbolUse) (fullName: string) = + let lineStr = getSourceLineStr sym.RangeAlternate.StartLine + match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with + | Some (island, _, _) -> island = fullName + | None -> false + + type private NamespaceUse = + { Ident: string + Location: range } + + let getUnusedOpens (symbolUses: FSharpSymbolUse[], parsedInput: ParsedInput, getSourceLineStr: int -> string) : range list = + let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = + // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` + let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn + let lengthDiff = fullName.Length - length - 2 + if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None + else Some fullName.[0..lengthDiff] + + let getPossibleNamespaces (symbolUse: FSharpSymbolUse) : string list = + let isQualified = symbolIsFullyQualified getSourceLineStr symbolUse + + (match symbolUse with + | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> + Some (cleanFullNames, Some ent) + | SymbolUse.Field f when not (isQualified f.FullName) -> + Some ([f.FullName], Some f.DeclaringEntity) + | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> + Some ([mfv.FullName], mfv.EnclosingEntity) + | SymbolUse.Operator op when not (isQualified op.FullName) -> + Some ([op.FullName], op.EnclosingEntity) + | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> + Some ([ap.FullName], ap.EnclosingEntity) + | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> + Some ([apc.FullName], apc.Group.EnclosingEntity) + | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> + Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) + | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> + Some ([p.FullName], Some p.Type.TypeDefinition) + | _ -> None) + |> Option.map (fun (fullNames, declaringEntity) -> + [ for name in fullNames do + let partNamespace = getPartNamespace symbolUse name + yield partNamespace + yield! entityNamespace declaringEntity ]) + |> Option.toList + |> List.concat + |> List.choose id + + let namespacesInUse : NamespaceUse list = + let importantSymbolUses = + symbolUses + |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> + not symbolUse.IsFromDefinition && + match symbolUse.Symbol with + | :? FSharpEntity as e -> not e.IsNamespace + | _ -> true + ) + + importantSymbolUses + |> Array.toList + |> List.collect (fun su -> + let lineStr = getSourceLineStr su.RangeAlternate.StartLine + let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) + let qualifier = partialName.QualifyingIdents |> String.concat "." + getPossibleNamespaces su + |> List.distinct + |> List.choose (fun ns -> + if qualifier = "" then Some ns + elif ns = qualifier then None + elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] + else None) + |> List.map (fun ns -> + { Ident = ns + Location = su.RangeAlternate })) + + let filter list: OpenStatement list = + let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = + + let notUsed (os: OpenStatement) = + if os.LiteralIdent.StartsWith "`global`" then false + else + let notUsedAnywhere = + not (namespacesInUse |> List.exists (fun nsu -> + rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) + if notUsedAnywhere then true + else + let alreadySeen = + seenOpenStatements + |> List.exists (fun seenNs -> + // if such open statement has already been marked as used in this or outer module, we skip it + // (that is, do not mark as used so far) + rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) + alreadySeen + + match list with + | os :: xs when notUsed os -> + filterInner (os :: acc) xs (os :: seenOpenStatements) + | os :: xs -> + filterInner acc xs (os :: seenOpenStatements) + | [] -> List.rev acc + + filterInner [] list [] + + parsedInput |> getOpenStatements |> filter |> List.map (fun os -> os.Range) diff --git a/src/fsharp/vs/ServiceAnalysis.fsi b/src/fsharp/vs/ServiceAnalysis.fsi new file mode 100644 index 00000000000..f2b3dd03d2a --- /dev/null +++ b/src/fsharp/vs/ServiceAnalysis.fsi @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Compiler.SourceCodeServices + +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.Range + +#if COMPILER_PUBLIC_API +module UnusedOpens = +#else +module internal UnusedOpens = +#endif + val getUnusedOpens : symbolUses: FSharpSymbolUse[] * parsedInput: ParsedInput * getSourceLineStr: (int -> string) -> range list \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 7130c30cb4f..487e6520a9b 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -15,183 +15,7 @@ open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.SourceCodeServices -open Symbols - -module internal UnusedOpens = - /// Represents single open statement. - type private OpenStatement = - { /// Full namespace or module identifier as it's presented in source code. - LiteralIdent: string - /// All possible namespace or module identifiers, including the literal one. - AllPossibleIdents: Set - /// Range of open statement itself. - Range: range - /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). - ModuleRange: range } - - let rec private visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = - [ for decl in decls do - match decl with - | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> - let literalIdent = longId |> List.map(fun l -> l.idText) |> String.concat "." - yield - { LiteralIdent = literalIdent - AllPossibleIdents = - set [ yield literalIdent - // `open N.M` can open N.M module from parent module as well, if it's non empty - if not (List.isEmpty parent) then - yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ] - Range = range - ModuleRange = moduleRange } - - | SynModuleDecl.NestedModule(SynComponentInfo.ComponentInfo(longId = longId),_, decls,_,moduleRange) -> - yield! visitSynModuleOrNamespaceDecls longId decls moduleRange - | _ -> () ] - - let private getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = - match parsedInput with - | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> - [ for md in modules do - let SynModuleOrNamespace(longId = longId; decls = decls; range = moduleRange) = md - yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] - | _ -> [] - - let private getAutoOpenAccessPath (ent:FSharpEntity) = - // Some.Namespace+AutoOpenedModule+Entity - - // HACK: I can't see a way to get the EnclosingEntity of an Entity - // Some.Namespace + Some.Namespace.AutoOpenedModule are both valid - ent.TryFullName |> Option.bind(fun _ -> - if (not ent.IsNamespace) && ent.QualifiedName.Contains "+" then - Some ent.QualifiedName.[0..ent.QualifiedName.IndexOf "+" - 1] - else - None) - - let private entityNamespace (entOpt: FSharpEntity option) = - match entOpt with - | Some ent -> - if ent.IsFSharpModule then - [ yield Some ent.QualifiedName - yield Some ent.LogicalName - yield Some ent.AccessPath - yield Some ent.FullName - yield Some ent.DisplayName - yield ent.TryGetFullDisplayName() - if ent.HasFSharpModuleSuffix then - yield Some (ent.AccessPath + "." + ent.DisplayName)] - else - [ yield ent.Namespace - yield Some ent.AccessPath - yield getAutoOpenAccessPath ent - for path in ent.AllCompilationPaths do - yield Some path - ] - | None -> [] - - let private symbolIsFullyQualified (sourceText: SourceText) (sym: FSharpSymbolUse) (fullName: string) = - let lineStr = sourceText.Lines.[Line.toZ sym.RangeAlternate.StartLine].ToString() - match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with - | Some (island, _, _) -> island = fullName - | None -> false - - type private NamespaceUse = - { Ident: string - Location: range } - - let getUnusedOpens (sourceText: SourceText) (parsedInput: ParsedInput) (symbolUses: FSharpSymbolUse[]) : range list = - let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = - // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` - let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn - let lengthDiff = fullName.Length - length - 2 - if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None - else Some fullName.[0..lengthDiff] - - let getPossibleNamespaces (symbolUse: FSharpSymbolUse) : string list = - let isQualified = symbolIsFullyQualified sourceText symbolUse - maybe { - let! fullNames, declaringEntity = - match symbolUse with - | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> - Some (cleanFullNames, Some ent) - | SymbolUse.Field f when not (isQualified f.FullName) -> - Some ([f.FullName], Some f.DeclaringEntity) - | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> - Some ([mfv.FullName], mfv.EnclosingEntity) - | SymbolUse.Operator op when not (isQualified op.FullName) -> - Some ([op.FullName], op.EnclosingEntity) - | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> - Some ([ap.FullName], ap.EnclosingEntity) - | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> - Some ([apc.FullName], apc.Group.EnclosingEntity) - | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> - Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) - | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> - Some ([p.FullName], Some p.Type.TypeDefinition) - | _ -> None - - return - [ for name in fullNames do - let partNamespace = getPartNamespace symbolUse name - yield partNamespace - yield! entityNamespace declaringEntity ] - } |> Option.toList |> List.concat |> List.choose id - - let namespacesInUse : NamespaceUse list = - let importantSymbolUses = - symbolUses - |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition && - match symbolUse.Symbol with - | :? FSharpEntity as e -> not e.IsNamespace - | _ -> true - ) - - importantSymbolUses - |> Array.toList - |> List.collect (fun su -> - let lineStr = sourceText.Lines.[Line.toZ su.RangeAlternate.StartLine].ToString() - let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) - let qualifier = partialName.QualifyingIdents |> String.concat "." - getPossibleNamespaces su - |> List.distinct - |> List.choose (fun ns -> - if qualifier = "" then Some ns - elif ns = qualifier then None - elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] - else None) - |> List.map (fun ns -> - { Ident = ns - Location = su.RangeAlternate })) - - let filter list: OpenStatement list = - let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = - - let notUsed (os: OpenStatement) = - if os.LiteralIdent.StartsWith "`global`" then false - else - let notUsedAnywhere = - not (namespacesInUse |> List.exists (fun nsu -> - rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) - if notUsedAnywhere then true - else - let alreadySeen = - seenOpenStatements - |> List.exists (fun seenNs -> - // if such open statement has already been marked as used in this or outer module, we skip it - // (that is, do not mark as used so far) - rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) - alreadySeen - - match list with - | os :: xs when notUsed os -> - filterInner (os :: acc) xs (os :: seenOpenStatements) - | os :: xs -> - filterInner acc xs (os :: seenOpenStatements) - | [] -> List.rev acc - - filterInner [] list [] - - parsedInput |> getOpenStatements |> filter |> List.map (fun os -> os.Range) +open Microsoft.VisualStudio.FSharp.Editor.Symbols [] type internal UnusedOpensDiagnosticAnalyzer() = @@ -220,7 +44,7 @@ type internal UnusedOpensDiagnosticAnalyzer() = let! sourceText = document.GetTextAsync() let! _, parsedInput, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) let! symbolUses = checkResults.GetAllUsesOfAllSymbolsInFile() |> liftAsync - return UnusedOpens.getUnusedOpens sourceText parsedInput symbolUses + return UnusedOpens.getUnusedOpens(symbolUses, parsedInput, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) } override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken) = diff --git a/vsintegration/src/FSharp.Editor/LanguageService/Symbols.fs b/vsintegration/src/FSharp.Editor/LanguageService/Symbols.fs index 1ed87724e3f..13de16c081c 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/Symbols.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/Symbols.fs @@ -130,218 +130,4 @@ type FSharpEntity with | _ -> () | _ -> () ] - allBaseTypes x - - - - -/// Active patterns over `FSharpSymbolUse`. -module SymbolUse = - - let (|ActivePatternCase|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpActivePatternCase as ap-> ActivePatternCase(ap) |> Some - | _ -> None - - let private attributeSuffixLength = "Attribute".Length - - let (|Entity|_|) (symbol : FSharpSymbolUse) : (FSharpEntity * (* cleanFullNames *) string list) option = - match symbol.Symbol with - | :? FSharpEntity as ent -> - // strip generic parameters count suffix (List`1 => List) - let cleanFullName = - // `TryFullName` for type aliases is always `None`, so we have to make one by our own - if ent.IsFSharpAbbreviation then - [ent.AccessPath + "." + ent.DisplayName] - else - ent.TryFullName - |> Option.toList - |> List.map (fun fullName -> - if ent.GenericParameters.Count > 0 && fullName.Length > 2 then - fullName.[0..fullName.Length - 3] - else fullName) - - let cleanFullNames = - cleanFullName - |> List.collect (fun cleanFullName -> - if ent.IsAttributeType then - [cleanFullName; cleanFullName.[0..cleanFullName.Length - attributeSuffixLength - 1]] - else [cleanFullName] - ) - Some (ent, cleanFullNames) - | _ -> None - - - let (|Field|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpField as field-> Some field - | _ -> None - - let (|GenericParameter|_|) (symbol: FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpGenericParameter as gp -> Some gp - | _ -> None - - let (|MemberFunctionOrValue|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpMemberOrFunctionOrValue as func -> Some func - | _ -> None - - let (|ActivePattern|_|) = function - | MemberFunctionOrValue m when m.IsActivePattern -> Some m | _ -> None - - let (|Parameter|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpParameter as param -> Some param - | _ -> None - - let (|StaticParameter|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpStaticParameter as sp -> Some sp - | _ -> None - - let (|UnionCase|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpUnionCase as uc-> Some uc - | _ -> None - - //let (|Constructor|_|) = function - // | MemberFunctionOrValue func when func.IsConstructor || func.IsImplicitConstructor -> Some func - // | _ -> None - - let (|TypeAbbreviation|_|) = function - | Entity (entity, _) when entity.IsFSharpAbbreviation -> Some entity - | _ -> None - - let (|Class|_|) = function - | Entity (entity, _) when entity.IsClass -> Some entity - | Entity (entity, _) when entity.IsFSharp && - entity.IsOpaque && - not entity.IsFSharpModule && - not entity.IsNamespace && - not entity.IsDelegate && - not entity.IsFSharpUnion && - not entity.IsFSharpRecord && - not entity.IsInterface && - not entity.IsValueType -> Some entity - | _ -> None - - let (|Delegate|_|) = function - | Entity (entity, _) when entity.IsDelegate -> Some entity - | _ -> None - - let (|Event|_|) = function - | MemberFunctionOrValue symbol when symbol.IsEvent -> Some symbol - | _ -> None - - let (|Property|_|) = function - | MemberFunctionOrValue symbol when symbol.IsProperty || symbol.IsPropertyGetterMethod || symbol.IsPropertySetterMethod -> Some symbol - | _ -> None - - let inline private notCtorOrProp (symbol:FSharpMemberOrFunctionOrValue) = - not symbol.IsConstructor && not symbol.IsPropertyGetterMethod && not symbol.IsPropertySetterMethod - - let (|Method|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - symbol.IsModuleValueOrMember && - not symbolUse.IsFromPattern && - not symbol.IsOperatorOrActivePattern && - not symbol.IsPropertyGetterMethod && - not symbol.IsPropertySetterMethod -> Some symbol - | _ -> None - - let (|Function|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - symbol.IsModuleValueOrMember && - not symbol.IsOperatorOrActivePattern && - not symbolUse.IsFromPattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|Operator|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbolUse.IsFromPattern && - not symbol.IsActivePattern && - symbol.IsOperatorOrActivePattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|Pattern|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern && - symbolUse.IsFromPattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType ->Some symbol - | _ -> None - | _ -> None - - - let (|ClosureOrNestedFunction|_|) = function - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern && - not symbol.IsModuleValueOrMember -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - - let (|Val|_|) = function - | MemberFunctionOrValue symbol when notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern -> - match symbol.FullTypeSafe with - | Some _fullType -> Some symbol - | _ -> None - | _ -> None - - let (|Enum|_|) = function - | Entity (entity, _) when entity.IsEnum -> Some entity - | _ -> None - - let (|Interface|_|) = function - | Entity (entity, _) when entity.IsInterface -> Some entity - | _ -> None - - let (|Module|_|) = function - | Entity (entity, _) when entity.IsFSharpModule -> Some entity - | _ -> None - - let (|Namespace|_|) = function - | Entity (entity, _) when entity.IsNamespace -> Some entity - | _ -> None - - let (|Record|_|) = function - | Entity (entity, _) when entity.IsFSharpRecord -> Some entity - | _ -> None - - let (|Union|_|) = function - | Entity (entity, _) when entity.IsFSharpUnion -> Some entity - | _ -> None - - let (|ValueType|_|) = function - | Entity (entity, _) when entity.IsValueType && not entity.IsEnum -> Some entity - | _ -> None - - let (|ComputationExpression|_|) (symbol:FSharpSymbolUse) = - if symbol.IsFromComputationExpression then Some symbol - else None - - let (|Attribute|_|) = function - | Entity (entity, _) when entity.IsAttributeType -> Some entity - | _ -> None \ No newline at end of file + allBaseTypes x \ No newline at end of file diff --git a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs similarity index 97% rename from vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs rename to vsintegration/tests/unittests/UnusedOpensTests.fs index e97f4d78a40..527e5e7c5d1 100644 --- a/vsintegration/tests/unittests/UnusedOpensDiagnosticAnalyzerTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -1,12 +1,9 @@ // 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. [] -[] -module Microsoft.VisualStudio.FSharp.Editor.Tests.Roslyn.UnusedOpensDiagnosticAnalyzer +module Tests.ServiceAnalysis.UnusedOpens open System open NUnit.Framework -open Microsoft.CodeAnalysis.Text -open Microsoft.VisualStudio.FSharp.Editor open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler.Range open FsUnit @@ -29,7 +26,7 @@ let private projectOptions : FSharpProjectOptions = let private checker = FSharpChecker.Create() let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * (*end column*)int)) list) = - let sourceText = SourceText.From(source) + let sourceLines = source.Split ([|"\n\r"; "\n"; "\r"|], StringSplitOptions.None) let parsedInput, checkFileResults = let parseResults, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously @@ -41,7 +38,7 @@ let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * | Some parsedInput -> parsedInput, checkFileResults let allSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let unusedOpenRanges = UnusedOpens.getUnusedOpens sourceText parsedInput allSymbolUses + let unusedOpenRanges = UnusedOpens.getUnusedOpens (allSymbolUses, parsedInput, fun lineNum -> sourceLines.[Line.toZ lineNum]) unusedOpenRanges |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index ff32aba7b3c..177beb3bbd2 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -92,6 +92,9 @@ ProjectOptionsTests.fs + + ServiceAnalysis\UnusedOpensTests.fs + Roslyn\ColorizationServiceTests.fs @@ -134,9 +137,6 @@ Roslyn\DocumentHighlightsServiceTests.fs - - Roslyn\UnusedOpensDiagnosticAnalyzerTests.fs - VisualFSharp.Unittests.dll.config {VisualStudioVersion} From f8e4b40fb33a0189921c3b8e510c753f3cda03e4 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 16:54:31 +0300 Subject: [PATCH 011/150] fix tests --- vsintegration/tests/unittests/UnusedOpensTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 527e5e7c5d1..f1bb4c03a79 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -26,7 +26,7 @@ let private projectOptions : FSharpProjectOptions = let private checker = FSharpChecker.Create() let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * (*end column*)int)) list) = - let sourceLines = source.Split ([|"\n\r"; "\n"; "\r"|], StringSplitOptions.None) + let sourceLines = source.Split ([|"\r\n"; "\n"; "\r"|], StringSplitOptions.None) let parsedInput, checkFileResults = let parseResults, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously From ef55edb1c4780b3ba7f10170589606ecb2d9b184 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 18:10:32 +0300 Subject: [PATCH 012/150] fix build --- src/fsharp/vs/ServiceAnalysis.fs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 116a656f51b..8419bbdc43f 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -6,9 +6,9 @@ open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Range -module internal UnusedOpens = +module UnusedOpens = /// Represents single open statement. - type private OpenStatement = + type OpenStatement = { /// Full namespace or module identifier as it's presented in source code. LiteralIdent: string /// All possible namespace or module identifiers, including the literal one. @@ -18,7 +18,7 @@ module internal UnusedOpens = /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). ModuleRange: range } - let rec private visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = + let rec visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = [ for decl in decls do match decl with | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> @@ -37,7 +37,7 @@ module internal UnusedOpens = yield! visitSynModuleOrNamespaceDecls longId decls moduleRange | _ -> () ] - let private getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = + let getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = match parsedInput with | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> [ for md in modules do @@ -45,7 +45,7 @@ module internal UnusedOpens = yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] | _ -> [] - let private getAutoOpenAccessPath (ent:FSharpEntity) = + let getAutoOpenAccessPath (ent:FSharpEntity) = // Some.Namespace+AutoOpenedModule+Entity // HACK: I can't see a way to get the EnclosingEntity of an Entity @@ -56,7 +56,7 @@ module internal UnusedOpens = else None) - let private entityNamespace (entOpt: FSharpEntity option) = + let entityNamespace (entOpt: FSharpEntity option) = match entOpt with | Some ent -> if ent.IsFSharpModule then @@ -77,13 +77,13 @@ module internal UnusedOpens = ] | None -> [] - let private symbolIsFullyQualified (getSourceLineStr: int -> string) (sym: FSharpSymbolUse) (fullName: string) = + let symbolIsFullyQualified (getSourceLineStr: int -> string) (sym: FSharpSymbolUse) (fullName: string) = let lineStr = getSourceLineStr sym.RangeAlternate.StartLine match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with | Some (island, _, _) -> island = fullName | None -> false - type private NamespaceUse = + type NamespaceUse = { Ident: string Location: range } From f81fea22f41a384aa1f12ec0b5b6385ab2042cc4 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 22:17:04 +0300 Subject: [PATCH 013/150] collect open declarations EntityRefs during compilation --- src/fsharp/NameResolution.fs | 16 +++++ src/fsharp/NameResolution.fsi | 20 +++++++ src/fsharp/TypeChecker.fs | 15 +++-- src/fsharp/vs/IncrementalBuild.fs | 5 ++ src/fsharp/vs/IncrementalBuild.fsi | 3 + src/fsharp/vs/ServiceAnalysis.fs | 58 ++++++++----------- src/fsharp/vs/ServiceAnalysis.fsi | 3 +- src/fsharp/vs/service.fs | 17 ++++-- src/fsharp/vs/service.fsi | 3 + .../UnusedOpensDiagnosticAnalyzer.fs | 9 ++- 10 files changed, 103 insertions(+), 46 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index cc50d5bb15d..412f2194417 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1222,12 +1222,17 @@ type ItemOccurence = /// Result gets suppressed over this text range | RelatedText +type OpenDeclaration = + | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * scopem: range + | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * scopem: range + /// 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 let (|ValRefOfProp|_|) (pi : PropInfo) = pi.ArbitraryValRef @@ -1460,6 +1465,7 @@ type TcResultsSinkImpl(g, ?source: string) = member __.GetHashCode((p:pos,i)) = p.Line + 101 * p.Column + hash i member __.Equals((p1,i1),(p2,i2)) = posEq p1 p2 && i1 = i2 } ) let capturedMethodGroupResolutions = ResizeArray<_>() + let capturedOpenDeclarations = ResizeArray<_>() let allowedRange (m:range) = not m.IsSynthetic member this.GetResolutions() = @@ -1468,6 +1474,8 @@ type TcResultsSinkImpl(g, ?source: string) = member this.GetSymbolUses() = TcSymbolUses(g, capturedNameResolutions, capturedFormatSpecifierLocations.ToArray()) + member this.OpenDeclarations = Seq.toList capturedOpenDeclarations + interface ITypecheckResultsSink with member sink.NotifyEnvWithScope(m,nenv,ad) = if allowedRange m then @@ -1504,6 +1512,9 @@ type TcResultsSinkImpl(g, ?source: string) = member sink.NotifyFormatSpecifierLocation(m, numArgs) = capturedFormatSpecifierLocations.Add((m, numArgs)) + member sink.NotifyOpenDeclaration(openDeclaration) = + capturedOpenDeclarations.Add(openDeclaration) + member sink.CurrentSource = source @@ -1550,6 +1561,11 @@ let CallExprHasTypeSink (sink:TcResultsSink) (m:range,nenv,typ,denv,ad) = | None -> () | Some sink -> sink.NotifyExprHasType(m.End,typ,denv,nenv,ad,m) +let CallOpenDeclarationSink (sink:TcResultsSink) (openDeclaration: OpenDeclaration) = + match sink.CurrentSink with + | None -> () + | Some sink -> sink.NotifyOpenDeclaration(openDeclaration) + //------------------------------------------------------------------------- // Check inferability of type parameters in resolved items. //------------------------------------------------------------------------- diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 60ea7a0e660..0ead2dac861 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -307,6 +307,16 @@ type internal TcSymbolUses = /// Get the locations of all the printf format specifiers in the file member GetFormatSpecifierLocationsAndArity : unit -> (range * int)[] +/// Represents open declaration statement. +#if COMPILER_PUBLIC_API +type OpenDeclaration = +#else +type internal OpenDeclaration = +#endif + /// Ordinary open declaration, i.e. one which opens a namespace or module. + | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * scopem: range + /// Syntethic open declaration generated for auto open modules. + | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * scopem: range /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = @@ -323,6 +333,9 @@ type ITypecheckResultsSink = /// Record that a printf format specifier occurred at a specific location in the source abstract NotifyFormatSpecifierLocation : range * int -> unit + /// Record that an open declaration occured in a given scope range + abstract NotifyOpenDeclaration : OpenDeclaration -> unit + /// Get the current source abstract CurrentSource : string option @@ -337,6 +350,10 @@ type internal TcResultsSinkImpl = /// Get all the uses of all symbols reported to the sink member GetSymbolUses : unit -> TcSymbolUses + + /// Get all open declarations reported to the sink + member OpenDeclarations : OpenDeclaration list + interface ITypecheckResultsSink /// An abstract type for reporting the results of name resolution and type checking, and which allows @@ -364,6 +381,9 @@ val internal CallNameResolutionSinkReplacing : TcResultsSink -> range * Name /// Report a specific name resolution at a source range val internal CallExprHasTypeSink : TcResultsSink -> range * NameResolutionEnv * TType * DisplayEnv * AccessorDomain -> unit +/// Report an open declaration +val internal CallOpenDeclarationSink : TcResultsSink -> OpenDeclaration -> unit + /// Get all the available properties of a type (both intrinsic and extension) val internal AllPropInfosOfTypeInScope : InfoReader -> NameResolutionEnv -> string option * AccessorDomain -> FindMemberFlag -> range -> TType -> PropInfo list diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 95c4b119d95..421b252bda8 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -441,11 +441,12 @@ let AddLocalTyconsAndReport tcSink scopem g amap m tycons env = // Open a structure or an IL namespace //------------------------------------------------------------------------- -let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs = +let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs openDeclaration = let env = if isNil mvvs then env else ModifyNameResEnv (fun nenv -> AddModulesAndNamespacesContentsToNameEnv g amap env.eAccessRights scopem root nenv mvvs) env CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) + CallOpenDeclarationSink tcSink openDeclaration env let AddRootModuleOrNamespaceRefs g amap m env modrefs = @@ -691,7 +692,9 @@ let ImplicitlyOpenOwnNamespace tcSink g amap scopem enclosingNamespacePath env = let ad = env.eAccessRights match ResolveLongIndentAsModuleOrNamespace ResultCollectionSettings.AllResults amap scopem OpenQualified env.eNameResEnv ad enclosingNamespacePathToOpen with - | Result modrefs -> OpenModulesOrNamespaces tcSink g amap scopem false env (List.map p23 modrefs) + | Result modrefs -> + let modrefs = List.map p23 modrefs + OpenModulesOrNamespaces tcSink g amap scopem false env modrefs (OpenDeclaration.Open (enclosingNamespacePathToOpen, modrefs, scopem)) | Exception _ -> env @@ -1837,6 +1840,7 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv = nameResolutions.Add(pos, item, itemGroup, itemTyparInst, occurence, denv, nenv, ad, m, replacing) member this.NotifyExprHasType(_, _, _, _, _, _) = assert false // no expr typings in MakeSimpleVals member this.NotifyFormatSpecifierLocation(_, _) = () + member this.NotifyOpenDeclaration(_) = () member this.CurrentSource = None } use _h = WithNewTypecheckResultsSink(sink, cenv.tcSink) @@ -12067,9 +12071,10 @@ let TcOpenDecl tcSink (g:TcGlobals) amap m scopem env (longId : Ident list) = if IsPartiallyQualifiedNamespace modref then errorR(Error(FSComp.SR.tcOpenUsedWithPartiallyQualifiedPath(fullDisplayTextOfModRef modref), m))) - modrefs |> List.iter (fun (_, modref, _) -> CheckEntityAttributes g modref m |> CommitOperationResult) + let modrefs = List.map p23 modrefs + modrefs |> List.iter (fun modref -> CheckEntityAttributes g modref m |> CommitOperationResult) - let env = OpenModulesOrNamespaces tcSink g amap scopem false env (List.map p23 modrefs) + let env = OpenModulesOrNamespaces tcSink g amap scopem false env modrefs (OpenDeclaration.Open (longId, modrefs, scopem)) env @@ -16834,7 +16839,7 @@ let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env let modref = mkNonLocalTyconRef (mkNonLocalEntityRef ccu (Array.ofList h)) t match modref.TryDeref with | VNone -> warn() - | VSome _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] + | VSome _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] (OpenDeclaration.AutoOpenModule (p, modref, scopem)) // Add the CCU and apply the "AutoOpen" attributes let AddCcuToTcEnv(g, amap, scopem, env, assemblyName, ccu, autoOpens, internalsVisible) = diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index 44056bea56d..56f7113c377 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -1028,6 +1028,7 @@ type TypeCheckAccumulator = tcEnvAtEndOfFile: TcEnv tcResolutions: TcResolutions list tcSymbolUses: TcSymbolUses list + tcOpenDeclarations: OpenDeclaration list topAttribs:TopAttribs option typedImplFiles:TypedImplFile list tcDependencyFiles: string list @@ -1102,6 +1103,7 @@ type PartialCheckResults = Errors: (PhasedDiagnostic * FSharpErrorSeverity) list TcResolutions: TcResolutions list TcSymbolUses: TcSymbolUses list + TcOpenDeclarations: OpenDeclaration list TcDependencyFiles: string list TopAttribs: TopAttribs option TimeStamp: System.DateTime @@ -1116,6 +1118,7 @@ type PartialCheckResults = Errors = tcAcc.tcErrors TcResolutions = tcAcc.tcResolutions TcSymbolUses = tcAcc.tcSymbolUses + TcOpenDeclarations = tcAcc.tcOpenDeclarations TcDependencyFiles = tcAcc.tcDependencyFiles TopAttribs = tcAcc.topAttribs TimeStamp = timestamp @@ -1327,6 +1330,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput tcEnvAtEndOfFile=tcInitial tcResolutions=[] tcSymbolUses=[] + tcOpenDeclarations=[] topAttribs=None typedImplFiles=[] tcDependencyFiles=basicDependencies @@ -1375,6 +1379,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput typedImplFiles=typedImplFiles tcResolutions=tcAcc.tcResolutions @ [tcResolutions] tcSymbolUses=tcAcc.tcSymbolUses @ [tcSymbolUses] + tcOpenDeclarations=tcAcc.tcOpenDeclarations @ sink.OpenDeclarations tcErrors = tcAcc.tcErrors @ parseErrors @ capturingErrorLogger.GetErrors() tcDependencyFiles = filename :: tcAcc.tcDependencyFiles } } diff --git a/src/fsharp/vs/IncrementalBuild.fsi b/src/fsharp/vs/IncrementalBuild.fsi index 47ec0a7b624..e29f3408c6b 100755 --- a/src/fsharp/vs/IncrementalBuild.fsi +++ b/src/fsharp/vs/IncrementalBuild.fsi @@ -54,6 +54,9 @@ type internal PartialCheckResults = /// Represents the collected uses of symbols from type checking TcSymbolUses: TcSymbolUses list + /// Represents open declarations + TcOpenDeclarations: OpenDeclaration list + TcDependencyFiles: string list /// Represents the collected attributes to apply to the module of assuembly generates diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 8419bbdc43f..6666add2efb 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -3,47 +3,36 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Range module UnusedOpens = + open Microsoft.FSharp.Compiler.PrettyNaming + /// Represents single open statement. type OpenStatement = { /// Full namespace or module identifier as it's presented in source code. - LiteralIdent: string - /// All possible namespace or module identifiers, including the literal one. - AllPossibleIdents: Set + Idents: Set /// Range of open statement itself. Range: range /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). ModuleRange: range } - let rec visitSynModuleOrNamespaceDecls (parent: Ast.LongIdent) (decls: SynModuleDecls) (moduleRange: range) : OpenStatement list = - [ for decl in decls do - match decl with - | SynModuleDecl.Open(LongIdentWithDots.LongIdentWithDots(id = longId), range) -> - let literalIdent = longId |> List.map(fun l -> l.idText) |> String.concat "." - yield - { LiteralIdent = literalIdent - AllPossibleIdents = - set [ yield literalIdent - // `open N.M` can open N.M module from parent module as well, if it's non empty - if not (List.isEmpty parent) then - yield (parent @ longId |> List.map(fun l -> l.idText) |> String.concat ".") ] - Range = range - ModuleRange = moduleRange } - - | SynModuleDecl.NestedModule(SynComponentInfo.ComponentInfo(longId = longId),_, decls,_,moduleRange) -> - yield! visitSynModuleOrNamespaceDecls longId decls moduleRange - | _ -> () ] - - let getOpenStatements (parsedInput: ParsedInput) : OpenStatement list = - match parsedInput with - | ParsedInput.ImplFile (ParsedImplFileInput(modules = modules)) -> - [ for md in modules do - let SynModuleOrNamespace(longId = longId; decls = decls; range = moduleRange) = md - yield! visitSynModuleOrNamespaceDecls longId decls moduleRange ] - | _ -> [] + let getOpenStatements (openDeclarations: OpenDeclaration list) : OpenStatement list = + openDeclarations + |> List.choose (fun openDeclaration -> + match openDeclaration with + | OpenDeclaration.Open (longId, moduleRefs, scopem) when not (List.isEmpty longId) -> + + Some { Idents = moduleRefs |> List.map (fun x -> x.DisplayName) |> Set.ofList + Range = + let first = List.head longId + let last = List.last longId + mkRange scopem.FileName first.idRange.Start last.idRange.End + ModuleRange = scopem } + | _ -> None // for now + ) let getAutoOpenAccessPath (ent:FSharpEntity) = // Some.Namespace+AutoOpenedModule+Entity @@ -87,7 +76,7 @@ module UnusedOpens = { Ident: string Location: range } - let getUnusedOpens (symbolUses: FSharpSymbolUse[], parsedInput: ParsedInput, getSourceLineStr: int -> string) : range list = + let getUnusedOpens (symbolUses: FSharpSymbolUse[], openDeclarations: OpenDeclaration list, getSourceLineStr: int -> string) : range list = let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn @@ -156,11 +145,11 @@ module UnusedOpens = let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = let notUsed (os: OpenStatement) = - if os.LiteralIdent.StartsWith "`global`" then false + if os.Idents |> Set.exists (fun x -> x.StartsWith MangledGlobalName) then false else let notUsedAnywhere = not (namespacesInUse |> List.exists (fun nsu -> - rangeContainsRange os.ModuleRange nsu.Location && os.AllPossibleIdents |> Set.contains nsu.Ident)) + rangeContainsRange os.ModuleRange nsu.Location && os.Idents |> Set.contains nsu.Ident)) if notUsedAnywhere then true else let alreadySeen = @@ -168,7 +157,8 @@ module UnusedOpens = |> List.exists (fun seenNs -> // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) - rangeContainsRange seenNs.ModuleRange os.ModuleRange && os.LiteralIdent = seenNs.LiteralIdent) + rangeContainsRange seenNs.ModuleRange os.ModuleRange && + not (os.Idents |> Set.intersect seenNs.Idents |> Set.isEmpty)) alreadySeen match list with @@ -180,4 +170,4 @@ module UnusedOpens = filterInner [] list [] - parsedInput |> getOpenStatements |> filter |> List.map (fun os -> os.Range) + openDeclarations |> getOpenStatements |> filter |> List.map (fun os -> os.Range) diff --git a/src/fsharp/vs/ServiceAnalysis.fsi b/src/fsharp/vs/ServiceAnalysis.fsi index f2b3dd03d2a..2213fdf2f78 100644 --- a/src/fsharp/vs/ServiceAnalysis.fsi +++ b/src/fsharp/vs/ServiceAnalysis.fsi @@ -3,6 +3,7 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.Range #if COMPILER_PUBLIC_API @@ -10,4 +11,4 @@ module UnusedOpens = #else module internal UnusedOpens = #endif - val getUnusedOpens : symbolUses: FSharpSymbolUse[] * parsedInput: ParsedInput * getSourceLineStr: (int -> string) -> range list \ No newline at end of file + val getUnusedOpens : symbolUses: FSharpSymbolUse[] * openDeclarations: OpenDeclaration list * getSourceLineStr: (int -> string) -> range list \ No newline at end of file diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index e481f050968..3977099a76c 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -165,7 +165,8 @@ type TypeCheckInfo reactorOps : IReactorOperations, checkAlive : (unit -> bool), textSnapshotInfo:obj option, - implementationFiles: TypedImplFile list) = + implementationFiles: TypedImplFile list, + openDeclarations: OpenDeclaration list) = let textSnapshotInfo = defaultArg textSnapshotInfo null let (|CNR|) (cnr:CapturedNameResolution) = @@ -1361,6 +1362,9 @@ type TypeCheckInfo member __.ImplementationFiles = implementationFiles + /// All open declarations in the file, including auto open modules + member __.OpenDeclarations = openDeclarations + override __.ToString() = "TypeCheckInfo(" + mainInputFileName + ")" type FSharpParsingOptions = @@ -1693,13 +1697,14 @@ module internal Parser = projectFileName, mainInputFileName, sink.GetResolutions(), - sink.GetSymbolUses(), + sink.GetSymbolUses(), tcEnvAtEnd.NameEnv, loadClosure, reactorOps, checkAlive, textSnapshotInfo, - typedImplFiles) + typedImplFiles, + sink.OpenDeclarations) return errors, TypeCheckAborted.No scope | None -> return errors, TypeCheckAborted.Yes @@ -2027,6 +2032,9 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp let cenv = Impl.cenv(scope.TcGlobals, scope.ThisCcu, scope.TcImports) [ for mimpl in scope.ImplementationFiles -> FSharpImplementationFileContents(cenv, mimpl)]) + member info.OpenDeclarations = + scopeOptX |> Option.map (fun scope -> scope.OpenDeclarations) + override info.ToString() = "FSharpCheckFileResults(" + filename + ")" //---------------------------------------------------------------------------- @@ -2618,7 +2626,8 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC List.last tcProj.TcSymbolUses, tcProj.TcEnvAtEnd.NameEnv, loadClosure, reactorOps, (fun () -> builder.IsAlive), None, - tcProj.ImplementationFiles) + tcProj.ImplementationFiles, + tcProj.TcOpenDeclarations) let typedResults = MakeCheckFileResults(filename, options, builder, scope, Array.ofList tcProj.TcDependencyFiles, creationErrors, parseResults.Errors, tcErrors) return (parseResults, typedResults) }) diff --git a/src/fsharp/vs/service.fsi b/src/fsharp/vs/service.fsi index e6471120f5f..ff0c8adaa0c 100755 --- a/src/fsharp/vs/service.fsi +++ b/src/fsharp/vs/service.fsi @@ -273,6 +273,9 @@ type internal FSharpCheckFileResults = /// Represents complete typechecked implementation files, including thier typechecked signatures if any. member ImplementationFiles: FSharpImplementationFileContents list option + /// Open declarations in the file, including auto open modules. + member OpenDeclarations: OpenDeclaration list option + /// A handle to the results of CheckFileInProject. [] #if COMPILER_PUBLIC_API diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 487e6520a9b..caff796df84 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -42,9 +42,14 @@ type internal UnusedOpensDiagnosticAnalyzer() = asyncMaybe { do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() - let! _, parsedInput, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) + let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) + + + Logging.Logging.logInfof "*** OpenDeclarations: %+A" checkResults.OpenDeclarations + + let! symbolUses = checkResults.GetAllUsesOfAllSymbolsInFile() |> liftAsync - return UnusedOpens.getUnusedOpens(symbolUses, parsedInput, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) + return UnusedOpens.getUnusedOpens(symbolUses, checkResults.OpenDeclarations, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) } override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken) = From b1d98f8df096654bd8f509d950b682efb9e72a79 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 22:28:22 +0300 Subject: [PATCH 014/150] fix --- src/fsharp/vs/ServiceAnalysis.fs | 2 +- .../Diagnostics/UnusedOpensDiagnosticAnalyzer.fs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 6666add2efb..771c5ae2308 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -25,7 +25,7 @@ module UnusedOpens = match openDeclaration with | OpenDeclaration.Open (longId, moduleRefs, scopem) when not (List.isEmpty longId) -> - Some { Idents = moduleRefs |> List.map (fun x -> x.DisplayName) |> Set.ofList + Some { Idents = moduleRefs |> List.map (fun x -> x.CompiledName) |> Set.ofList Range = let first = List.head longId let last = List.last longId diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index caff796df84..7034b7c335b 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -43,13 +43,13 @@ type internal UnusedOpensDiagnosticAnalyzer() = do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) - + let! openDeclarations = checkResults.OpenDeclarations - Logging.Logging.logInfof "*** OpenDeclarations: %+A" checkResults.OpenDeclarations + Logging.Logging.logInfof "*** OpenDeclarations: %+A" openDeclarations let! symbolUses = checkResults.GetAllUsesOfAllSymbolsInFile() |> liftAsync - return UnusedOpens.getUnusedOpens(symbolUses, checkResults.OpenDeclarations, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) + return UnusedOpens.getUnusedOpens(symbolUses, openDeclarations, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) } override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken) = From 1bc77f994c976d6fc32ae93443b4efbf4a45cf3c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 20 Oct 2017 22:57:33 +0300 Subject: [PATCH 015/150] try to get full EntityRef name --- src/fsharp/vs/ServiceAnalysis.fs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 771c5ae2308..ffbcfc19610 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -24,8 +24,10 @@ module UnusedOpens = |> List.choose (fun openDeclaration -> match openDeclaration with | OpenDeclaration.Open (longId, moduleRefs, scopem) when not (List.isEmpty longId) -> - - Some { Idents = moduleRefs |> List.map (fun x -> x.CompiledName) |> Set.ofList + Some { Idents = + moduleRefs + |> List.choose (fun x -> x.PublicPath |> Option.map (fun (Tast.PublicPath.PubPath path) -> path |> String.concat ".")) + |> Set.ofList Range = let first = List.head longId let last = List.last longId From 37fc75d6a701b5c9893e8fe3fe93a96dc6c2e584 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 20 Oct 2017 21:05:22 -0700 Subject: [PATCH 016/150] don't update project info if the source file collection is empty (#3792) --- .../src/FSharp.Editor/LanguageService/LanguageService.fs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 238325be41b..5c86684d87a 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -284,7 +284,9 @@ type internal FSharpProjectOptionsManager | h when (h.IsCapabilityMatch("CPS")) -> let project = workspace.CurrentSolution.GetProject(projectId) let siteProvider = this.ProvideProjectSiteProvider(project) - this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, siteProvider.GetProjectSite(), userOpName) + let projectSite = siteProvider.GetProjectSite() + if projectSite.CompilationSourceFiles.Length <> 0 then + this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, projectSite, userOpName) | _ -> () member this.UpdateProjectInfoWithPath(path, userOpName) = From 92cbb6b37a69a3257dce4c1ef4156e8933fd1b2e Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 21 Oct 2017 11:42:07 +0300 Subject: [PATCH 017/150] refactoring, fix compilation --- src/fsharp/NameResolution.fs | 4 +- src/fsharp/NameResolution.fsi | 8 +- src/fsharp/symbols/Symbols.fs | 7 + src/fsharp/symbols/Symbols.fsi | 12 +- src/fsharp/vs/ServiceAnalysis.fs | 171 +++++++++--------- src/fsharp/vs/ServiceAnalysis.fsi | 3 +- src/fsharp/vs/service.fs | 10 +- src/fsharp/vs/service.fsi | 2 +- .../UnusedOpensDiagnosticAnalyzer.fs | 6 +- .../tests/unittests/UnusedOpensTests.fs | 13 +- 10 files changed, 128 insertions(+), 108 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 412f2194417..9ec1394b8c0 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1223,8 +1223,8 @@ type ItemOccurence = | RelatedText type OpenDeclaration = - | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * scopem: range - | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * scopem: range + | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * appliedScope: range + | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * appliedScope: range /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 0ead2dac861..6bf3439f271 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -308,15 +308,11 @@ type internal TcSymbolUses = member GetFormatSpecifierLocationsAndArity : unit -> (range * int)[] /// Represents open declaration statement. -#if COMPILER_PUBLIC_API -type OpenDeclaration = -#else type internal OpenDeclaration = -#endif /// Ordinary open declaration, i.e. one which opens a namespace or module. - | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * scopem: range + | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * appliedScope: range /// Syntethic open declaration generated for auto open modules. - | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * scopem: range + | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * appliedScope: range /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index db5f96b3d17..a6c2c19e212 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -2259,6 +2259,13 @@ type FSharpSymbol with | :? FSharpMemberFunctionOrValue as x -> Some x.Accessibility | _ -> None +/// Represents open declaration in F# code. +type FSharpOpenDeclaration = + /// Ordinary open declaration, i.e. one which opens a namespace or module. + | Open of longId: Ident list * modules: FSharpEntity list * appliedScope: range + /// Syntethic open declaration generated for auto open modules. + | AutoOpenModule of idents: string list * modul: FSharpEntity * appliedScope: range + [] type FSharpSymbolUse(g:TcGlobals, denv: DisplayEnv, symbol:FSharpSymbol, itemOcc, range: range) = member __.Symbol = symbol diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index 8cc1c0ed06b..674bcd77474 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -7,6 +7,7 @@ open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.CompileOps open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.NameResolution @@ -1065,7 +1066,16 @@ and [] internal FSharpAttribute = /// Format the attribute using the rules of the given display context member Format : context: FSharpDisplayContext -> string - +/// Represents open declaration in F# code. +#if COMPILER_PUBLIC_API +type FSharpOpenDeclaration = +#else +type internal FSharpOpenDeclaration = +#endif + /// Ordinary open declaration, i.e. one which opens a namespace or module. + | Open of longId: Ident list * modules: FSharpEntity list * appliedScope: range + /// Syntethic open declaration generated for auto open modules. + | AutoOpenModule of idents: string list * modul: FSharpEntity * appliedScope: range /// Represents the use of an F# symbol from F# source code [] diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index ffbcfc19610..537d4f621ce 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -16,23 +16,20 @@ module UnusedOpens = Idents: Set /// Range of open statement itself. Range: range - /// Enclosing module or namespace range (that is, the scope on in which this open statement is visible). - ModuleRange: range } + /// Scope on which this open declaration is applied. + AppliedScope: range } - let getOpenStatements (openDeclarations: OpenDeclaration list) : OpenStatement list = + let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations |> List.choose (fun openDeclaration -> match openDeclaration with - | OpenDeclaration.Open (longId, moduleRefs, scopem) when not (List.isEmpty longId) -> - Some { Idents = - moduleRefs - |> List.choose (fun x -> x.PublicPath |> Option.map (fun (Tast.PublicPath.PubPath path) -> path |> String.concat ".")) - |> Set.ofList + | FSharpOpenDeclaration.Open (longId, modules, appliedScope) when not (List.isEmpty longId) -> + Some { Idents = modules |> List.choose (fun x -> x.TryFullName) |> Set.ofList Range = let first = List.head longId let last = List.last longId - mkRange scopem.FileName first.idRange.Start last.idRange.End - ModuleRange = scopem } + mkRange appliedScope.FileName first.idRange.Start last.idRange.End + AppliedScope = appliedScope } | _ -> None // for now ) @@ -77,81 +74,82 @@ module UnusedOpens = type NamespaceUse = { Ident: string Location: range } - - let getUnusedOpens (symbolUses: FSharpSymbolUse[], openDeclarations: OpenDeclaration list, getSourceLineStr: int -> string) : range list = - let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = - // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` - let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn - let lengthDiff = fullName.Length - length - 2 - if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None - else Some fullName.[0..lengthDiff] - - let getPossibleNamespaces (symbolUse: FSharpSymbolUse) : string list = - let isQualified = symbolIsFullyQualified getSourceLineStr symbolUse - - (match symbolUse with - | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> - Some (cleanFullNames, Some ent) - | SymbolUse.Field f when not (isQualified f.FullName) -> - Some ([f.FullName], Some f.DeclaringEntity) - | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> - Some ([mfv.FullName], mfv.EnclosingEntity) - | SymbolUse.Operator op when not (isQualified op.FullName) -> - Some ([op.FullName], op.EnclosingEntity) - | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> - Some ([ap.FullName], ap.EnclosingEntity) - | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> - Some ([apc.FullName], apc.Group.EnclosingEntity) - | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> - Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) - | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> - Some ([p.FullName], Some p.Type.TypeDefinition) - | _ -> None) - |> Option.map (fun (fullNames, declaringEntity) -> - [ for name in fullNames do - let partNamespace = getPartNamespace symbolUse name - yield partNamespace - yield! entityNamespace declaringEntity ]) - |> Option.toList - |> List.concat - |> List.choose id - - let namespacesInUse : NamespaceUse list = - let importantSymbolUses = - symbolUses - |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition && - match symbolUse.Symbol with - | :? FSharpEntity as e -> not e.IsNamespace - | _ -> true - ) - - importantSymbolUses - |> Array.toList - |> List.collect (fun su -> - let lineStr = getSourceLineStr su.RangeAlternate.StartLine - let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) - let qualifier = partialName.QualifyingIdents |> String.concat "." - getPossibleNamespaces su - |> List.distinct - |> List.choose (fun ns -> - if qualifier = "" then Some ns - elif ns = qualifier then None - elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] - else None) - |> List.map (fun ns -> - { Ident = ns - Location = su.RangeAlternate })) - - let filter list: OpenStatement list = - let rec filterInner acc (list: OpenStatement list) (seenOpenStatements: OpenStatement list) = + + let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = + // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` + let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn + let lengthDiff = fullName.Length - length - 2 + if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None + else Some fullName.[0..lengthDiff] + + let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : string list = + let isQualified = symbolIsFullyQualified getSourceLineStr symbolUse + + (match symbolUse with + | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> + Some (cleanFullNames, Some ent) + | SymbolUse.Field f when not (isQualified f.FullName) -> + Some ([f.FullName], Some f.DeclaringEntity) + | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> + Some ([mfv.FullName], mfv.EnclosingEntity) + | SymbolUse.Operator op when not (isQualified op.FullName) -> + Some ([op.FullName], op.EnclosingEntity) + | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> + Some ([ap.FullName], ap.EnclosingEntity) + | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> + Some ([apc.FullName], apc.Group.EnclosingEntity) + | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> + Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) + | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> + Some ([p.FullName], Some p.Type.TypeDefinition) + | _ -> None) + |> Option.map (fun (fullNames, declaringEntity) -> + [ for name in fullNames do + let partNamespace = getPartNamespace symbolUse name + yield partNamespace + yield! entityNamespace declaringEntity ]) + |> Option.toList + |> List.concat + |> List.choose id + + let getNamespacesInUse (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : NamespaceUse list = + let importantSymbolUses = + symbolUses + |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> + not symbolUse.IsFromDefinition && + match symbolUse.Symbol with + | :? FSharpEntity as e -> not e.IsNamespace + | _ -> true + ) + + importantSymbolUses + |> Array.toList + |> List.collect (fun su -> + let lineStr = getSourceLineStr su.RangeAlternate.StartLine + let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) + let qualifier = partialName.QualifyingIdents |> String.concat "." + getPossibleNamespaces getSourceLineStr su + |> List.distinct + |> List.choose (fun ns -> + if qualifier = "" then Some ns + elif ns = qualifier then None + elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] + else None) + |> List.map (fun ns -> + { Ident = ns + Location = su.RangeAlternate })) + + let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = + + let filter (openStatements: OpenStatement list) (namespacesInUse: NamespaceUse list) : OpenStatement list = + let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = let notUsed (os: OpenStatement) = if os.Idents |> Set.exists (fun x -> x.StartsWith MangledGlobalName) then false else let notUsedAnywhere = not (namespacesInUse |> List.exists (fun nsu -> - rangeContainsRange os.ModuleRange nsu.Location && os.Idents |> Set.contains nsu.Ident)) + rangeContainsRange os.AppliedScope nsu.Location && os.Idents |> Set.contains nsu.Ident)) if notUsedAnywhere then true else let alreadySeen = @@ -159,17 +157,22 @@ module UnusedOpens = |> List.exists (fun seenNs -> // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) - rangeContainsRange seenNs.ModuleRange os.ModuleRange && + rangeContainsRange seenNs.AppliedScope os.AppliedScope && not (os.Idents |> Set.intersect seenNs.Idents |> Set.isEmpty)) alreadySeen - match list with + match openStatements with | os :: xs when notUsed os -> filterInner (os :: acc) xs (os :: seenOpenStatements) | os :: xs -> filterInner acc xs (os :: seenOpenStatements) | [] -> List.rev acc - filterInner [] list [] - - openDeclarations |> getOpenStatements |> filter |> List.map (fun os -> os.Range) + filterInner [] openStatements [] + + async { + let! symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() + let namespacesInUse = getNamespacesInUse getSourceLineStr symbolUses + let openStatements = getOpenStatements checkFileResults.OpenDeclarations + return filter openStatements namespacesInUse |> List.map (fun os -> os.Range) + } \ No newline at end of file diff --git a/src/fsharp/vs/ServiceAnalysis.fsi b/src/fsharp/vs/ServiceAnalysis.fsi index 2213fdf2f78..6290c5d43e5 100644 --- a/src/fsharp/vs/ServiceAnalysis.fsi +++ b/src/fsharp/vs/ServiceAnalysis.fsi @@ -11,4 +11,5 @@ module UnusedOpens = #else module internal UnusedOpens = #endif - val getUnusedOpens : symbolUses: FSharpSymbolUse[] * openDeclarations: OpenDeclaration list * getSourceLineStr: (int -> string) -> range list \ No newline at end of file + /// Get all unused open declarations in a file + val getUnusedOpens : checkFileResults: FSharpCheckFileResults * getSourceLineStr: (int -> string) -> Async \ No newline at end of file diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 3977099a76c..668d6cdf551 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -2033,7 +2033,15 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp [ for mimpl in scope.ImplementationFiles -> FSharpImplementationFileContents(cenv, mimpl)]) member info.OpenDeclarations = - scopeOptX |> Option.map (fun scope -> scope.OpenDeclarations) + scopeOptX + |> Option.map (fun scope -> + let cenv = Impl.cenv(scope.TcGlobals, scope.ThisCcu, scope.TcImports) + scope.OpenDeclarations |> List.map (function + | OpenDeclaration.Open (id, mods, appliedScope) -> + FSharpOpenDeclaration.Open(id, mods |> List.map (fun x -> FSharpEntity(cenv, x)), appliedScope) + | OpenDeclaration.AutoOpenModule (ids, modul, appliedScope) -> + FSharpOpenDeclaration.AutoOpenModule (ids, FSharpEntity(cenv, modul), appliedScope))) + |> Option.defaultValue [] override info.ToString() = "FSharpCheckFileResults(" + filename + ")" diff --git a/src/fsharp/vs/service.fsi b/src/fsharp/vs/service.fsi index ff0c8adaa0c..1e7005bff08 100755 --- a/src/fsharp/vs/service.fsi +++ b/src/fsharp/vs/service.fsi @@ -274,7 +274,7 @@ type internal FSharpCheckFileResults = member ImplementationFiles: FSharpImplementationFileContents list option /// Open declarations in the file, including auto open modules. - member OpenDeclarations: OpenDeclaration list option + member OpenDeclarations: FSharpOpenDeclaration list /// A handle to the results of CheckFileInProject. [] diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 7034b7c335b..4430f355b30 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -43,13 +43,11 @@ type internal UnusedOpensDiagnosticAnalyzer() = do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) - let! openDeclarations = checkResults.OpenDeclarations + let openDeclarations = checkResults.OpenDeclarations Logging.Logging.logInfof "*** OpenDeclarations: %+A" openDeclarations - - let! symbolUses = checkResults.GetAllUsesOfAllSymbolsInFile() |> liftAsync - return UnusedOpens.getUnusedOpens(symbolUses, openDeclarations, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) + return! UnusedOpens.getUnusedOpens(checkResults, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) |> liftAsync } override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken) = diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index f1bb4c03a79..7f3894f0e1d 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -28,17 +28,14 @@ let private checker = FSharpChecker.Create() let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * (*end column*)int)) list) = let sourceLines = source.Split ([|"\r\n"; "\n"; "\r"|], StringSplitOptions.None) - let parsedInput, checkFileResults = - let parseResults, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously + let _, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously + + let checkFileResults = match checkFileAnswer with | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" - | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> - match parseResults.ParseTree with - | None -> failwith "Parse returns None ParseTree" - | Some parsedInput -> parsedInput, checkFileResults + | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> checkFileResults - let allSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let unusedOpenRanges = UnusedOpens.getUnusedOpens (allSymbolUses, parsedInput, fun lineNum -> sourceLines.[Line.toZ lineNum]) + let unusedOpenRanges = UnusedOpens.getUnusedOpens (checkFileResults, fun lineNum -> sourceLines.[Line.toZ lineNum]) |> Async.RunSynchronously unusedOpenRanges |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) From 99d0f40a743677d4fc9f0b1cd1a942a32f37f1aa Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 21 Oct 2017 13:14:46 +0300 Subject: [PATCH 018/150] all not ignored tests pass --- src/fsharp/symbols/Symbols.fs | 2 +- src/fsharp/vs/ServiceAnalysis.fs | 44 +++++++++++-------- .../tests/unittests/UnusedOpensTests.fs | 9 ---- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index a6c2c19e212..11c57400db2 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -310,7 +310,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = #else elif entity.IsTypeAbbrev then None #endif - elif entity.IsNamespace then Some entity.DemangledModuleOrNamespaceName + elif entity.IsNamespace then Some (entity.ToString()) else match entity.CompiledRepresentation with | CompiledTypeRepr.ILAsmNamed(tref, _, _) -> Some tref.FullName diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 537d4f621ce..72491ed9946 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -17,19 +17,21 @@ module UnusedOpens = /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. - AppliedScope: range } + AppliedScope: range + /// If it's prefixed with the special "global" namespace. + IsGlobal: bool } let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations |> List.choose (fun openDeclaration -> match openDeclaration with - | FSharpOpenDeclaration.Open (longId, modules, appliedScope) when not (List.isEmpty longId) -> + | FSharpOpenDeclaration.Open ((firstId :: _) as longId, modules, appliedScope) -> Some { Idents = modules |> List.choose (fun x -> x.TryFullName) |> Set.ofList Range = - let first = List.head longId - let last = List.last longId - mkRange appliedScope.FileName first.idRange.Start last.idRange.End - AppliedScope = appliedScope } + let lastId = List.last longId + mkRange appliedScope.FileName firstId.idRange.Start lastId.idRange.End + AppliedScope = appliedScope + IsGlobal = firstId.idText = MangledGlobalName } | _ -> None // for now ) @@ -73,7 +75,7 @@ module UnusedOpens = type NamespaceUse = { Ident: string - Location: range } + SymbolLocation: range } let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` @@ -137,32 +139,38 @@ module UnusedOpens = else None) |> List.map (fun ns -> { Ident = ns - Location = su.RangeAlternate })) + SymbolLocation = su.RangeAlternate })) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = let filter (openStatements: OpenStatement list) (namespacesInUse: NamespaceUse list) : OpenStatement list = let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = - let notUsed (os: OpenStatement) = - if os.Idents |> Set.exists (fun x -> x.StartsWith MangledGlobalName) then false + let isUsed (openStatement: OpenStatement) = + if openStatement.IsGlobal then true else - let notUsedAnywhere = - not (namespacesInUse |> List.exists (fun nsu -> - rangeContainsRange os.AppliedScope nsu.Location && os.Idents |> Set.contains nsu.Ident)) - if notUsedAnywhere then true + let usedSomewhere = + namespacesInUse + |> List.exists (fun namespaceUse -> + let inScope = rangeContainsRange openStatement.AppliedScope namespaceUse.SymbolLocation + if not inScope then false + else + let identMatches = openStatement.Idents |> Set.contains namespaceUse.Ident + identMatches) + + if not usedSomewhere then false else let alreadySeen = seenOpenStatements |> List.exists (fun seenNs -> // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) - rangeContainsRange seenNs.AppliedScope os.AppliedScope && - not (os.Idents |> Set.intersect seenNs.Idents |> Set.isEmpty)) - alreadySeen + rangeContainsRange seenNs.AppliedScope openStatement.AppliedScope && + not (openStatement.Idents |> Set.intersect seenNs.Idents |> Set.isEmpty)) + not alreadySeen match openStatements with - | os :: xs when notUsed os -> + | os :: xs when not (isUsed os) -> filterInner (os :: acc) xs (os :: seenOpenStatements) | os :: xs -> filterInner acc xs (os :: seenOpenStatements) diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 7f3894f0e1d..9ebaa0d0d46 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -580,15 +580,6 @@ module Module = """ => [] -[] -let ``should mark open declaration with global prefix in double backticks``() = - """ -module Module = - open ``global``.Namesp - let _ = System.String("") -""" - => [ 3, (9, 26) ] - [] [] let ``record fields should be taken into account``() = From 12db301a767723b89f842a090caba9ca6678dd0f Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 21 Oct 2017 15:21:33 +0300 Subject: [PATCH 019/150] exclude nested symbol uses from consideration --- src/fsharp/symbols/SymbolPatterns.fs | 209 ++++++++++++++++++ src/fsharp/symbols/SymbolPatterns.fsi | 53 +++++ src/fsharp/vs/ServiceAnalysis.fs | 106 ++++++++- .../src/FSharp.Editor/FSharp.Editor.fsproj | 1 - .../FSharpCheckerExtensions.fs | 18 +- .../LanguageService/TypedAstUtils.fs | 209 ------------------ .../tests/unittests/UnusedOpensTests.fs | 27 ++- 7 files changed, 388 insertions(+), 235 deletions(-) delete mode 100644 vsintegration/src/FSharp.Editor/LanguageService/TypedAstUtils.fs diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index 2b60c182e0d..68ab9cdbe63 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -2,6 +2,215 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices +/// Patterns over FSharpSymbol and derivatives. +[] +module Symbol = + open System.Text.RegularExpressions + open System + + let isAttribute<'T> (attribute: FSharpAttribute) = + // CompiledName throws exception on DataContractAttribute generated by SQLProvider + try attribute.AttributeType.CompiledName = typeof<'T>.Name with _ -> false + + let tryGetAttribute<'T> (attributes: seq) = + attributes |> Seq.tryFind isAttribute<'T> + + module Option = + let attempt f = try Some(f()) with _ -> None + + let hasModuleSuffixAttribute (entity: FSharpEntity) = + entity.Attributes + |> tryGetAttribute + |> Option.bind (fun a -> + Option.attempt (fun _ -> a.ConstructorArguments) + |> Option.bind (fun args -> args |> Seq.tryPick (fun (_, arg) -> + let res = + match arg with + | :? int32 as arg when arg = int CompilationRepresentationFlags.ModuleSuffix -> + Some() + | :? CompilationRepresentationFlags as arg when arg = CompilationRepresentationFlags.ModuleSuffix -> + Some() + | _ -> + None + res))) + |> Option.isSome + + let isOperator (name: string) = + name.StartsWith "( " && name.EndsWith " )" && name.Length > 4 + && name.Substring (2, name.Length - 4) + |> String.forall (fun c -> c <> ' ' && not (Char.IsLetter c)) + + let UnnamedUnionFieldRegex = Regex("^Item(\d+)?$", RegexOptions.Compiled) + + let isUnnamedUnionCaseField (field: FSharpField) = UnnamedUnionFieldRegex.IsMatch(field.Name) + + let (|AbbreviatedType|_|) (entity: FSharpEntity) = + if entity.IsFSharpAbbreviation then Some entity.AbbreviatedType + else None + + let (|TypeWithDefinition|_|) (ty: FSharpType) = + if ty.HasTypeDefinition then Some ty.TypeDefinition + else None + + let rec getEntityAbbreviatedType (entity: FSharpEntity) = + if entity.IsFSharpAbbreviation then + match entity.AbbreviatedType with + | TypeWithDefinition def -> getEntityAbbreviatedType def + | abbreviatedType -> entity, Some abbreviatedType + else entity, None + + let rec getAbbreviatedType (fsharpType: FSharpType) = + if fsharpType.IsAbbreviation then + getAbbreviatedType fsharpType.AbbreviatedType + else fsharpType + + let (|Attribute|_|) (entity: FSharpEntity) = + let isAttribute (entity: FSharpEntity) = + let getBaseType (entity: FSharpEntity) = + try + match entity.BaseType with + | Some (TypeWithDefinition def) -> Some def + | _ -> None + with _ -> None + + let rec isAttributeType (ty: FSharpEntity option) = + match ty with + | None -> false + | Some ty -> + try ty.FullName = "System.Attribute" || isAttributeType (getBaseType ty) + with _ -> false + isAttributeType (Some entity) + if isAttribute entity then Some() else None + + let hasAttribute<'T> (attributes: seq) = + attributes |> Seq.exists isAttribute<'T> + + let (|ValueType|_|) (e: FSharpEntity) = + if e.IsEnum || e.IsValueType || hasAttribute e.Attributes then Some() + else None + + let (|Class|_|) (original: FSharpEntity, abbreviated: FSharpEntity, _) = + if abbreviated.IsClass + && (not abbreviated.IsStaticInstantiation || original.IsFSharpAbbreviation) then Some() + else None + + let (|Record|_|) (e: FSharpEntity) = if e.IsFSharpRecord then Some() else None + let (|UnionType|_|) (e: FSharpEntity) = if e.IsFSharpUnion then Some() else None + let (|Delegate|_|) (e: FSharpEntity) = if e.IsDelegate then Some() else None + let (|FSharpException|_|) (e: FSharpEntity) = if e.IsFSharpExceptionDeclaration then Some() else None + let (|Interface|_|) (e: FSharpEntity) = if e.IsInterface then Some() else None + let (|AbstractClass|_|) (e: FSharpEntity) = + if hasAttribute e.Attributes then Some() else None + + let (|FSharpType|_|) (e: FSharpEntity) = + if e.IsDelegate || e.IsFSharpExceptionDeclaration || e.IsFSharpRecord || e.IsFSharpUnion + || e.IsInterface || e.IsMeasure + || (e.IsFSharp && e.IsOpaque && not e.IsFSharpModule && not e.IsNamespace) then Some() + else None + + let (|ProvidedType|_|) (e: FSharpEntity) = + if (e.IsProvided || e.IsProvidedAndErased || e.IsProvidedAndGenerated) && e.CompiledName = e.DisplayName then + Some() + else None + + let (|ByRef|_|) (e: FSharpEntity) = if e.IsByRef then Some() else None + let (|Array|_|) (e: FSharpEntity) = if e.IsArrayType then Some() else None + let (|FSharpModule|_|) (entity: FSharpEntity) = if entity.IsFSharpModule then Some() else None + + let (|Namespace|_|) (entity: FSharpEntity) = if entity.IsNamespace then Some() else None + let (|ProvidedAndErasedType|_|) (entity: FSharpEntity) = if entity.IsProvidedAndErased then Some() else None + let (|Enum|_|) (entity: FSharpEntity) = if entity.IsEnum then Some() else None + + let (|Tuple|_|) (ty: FSharpType option) = + ty |> Option.bind (fun ty -> if ty.IsTupleType then Some() else None) + + let (|RefCell|_|) (ty: FSharpType) = + match getAbbreviatedType ty with + | TypeWithDefinition def when + def.IsFSharpRecord && def.FullName = "Microsoft.FSharp.Core.FSharpRef`1" -> Some() + | _ -> None + + let (|FunctionType|_|) (ty: FSharpType) = + if ty.IsFunctionType then Some() + else None + + let (|Pattern|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpUnionCase + | :? FSharpActivePatternCase -> Some() + | _ -> None + + /// Field (field, fieldAbbreviatedType) + let (|Field|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpField as field -> Some (field, getAbbreviatedType field.FieldType) + | _ -> None + + let (|MutableVar|_|) (symbol: FSharpSymbol) = + let isMutable = + match symbol with + | :? FSharpField as field -> field.IsMutable && not field.IsLiteral + | :? FSharpMemberOrFunctionOrValue as func -> func.IsMutable + | _ -> false + if isMutable then Some() else None + + /// Entity (originalEntity, abbreviatedEntity, abbreviatedType) + let (|FSharpEntity|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpEntity as entity -> + let abbreviatedEntity, abbreviatedType = getEntityAbbreviatedType entity + Some (entity, abbreviatedEntity, abbreviatedType) + | _ -> None + + let (|Parameter|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpParameter -> Some() + | _ -> None + + let (|UnionCase|_|) (e: FSharpSymbol) = + match e with + | :? FSharpUnionCase as uc -> Some uc + | _ -> None + + let (|RecordField|_|) (e: FSharpSymbol) = + match e with + | :? FSharpField as field -> + if field.DeclaringEntity.IsFSharpRecord then Some field else None + | _ -> None + + let (|ActivePatternCase|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpActivePatternCase as case -> Some case + | _ -> None + + /// Func (memberFunctionOrValue, fullType) + let (|MemberFunctionOrValue|_|) (symbol: FSharpSymbol) = + match symbol with + | :? FSharpMemberOrFunctionOrValue as func -> Some func + | _ -> None + + /// Constructor (enclosingEntity) + let (|Constructor|_|) (func: FSharpMemberOrFunctionOrValue) = + match func.CompiledName with + | ".ctor" | ".cctor" -> func.EnclosingEntity + | _ -> None + + let (|Function|_|) excluded (func: FSharpMemberOrFunctionOrValue) = + try let typ = func.FullType |> getAbbreviatedType + if typ.IsFunctionType + && not func.IsPropertyGetterMethod + && not func.IsPropertySetterMethod + && not excluded + && not (isOperator func.DisplayName) then Some() + else None + with _ -> None + + let (|ExtensionMember|_|) (func: FSharpMemberOrFunctionOrValue) = + if func.IsExtensionMember then Some() else None + + let (|Event|_|) (func: FSharpMemberOrFunctionOrValue) = + if func.IsEvent then Some () else None + /// Active patterns over `FSharpSymbolUse`. [] module SymbolUse = diff --git a/src/fsharp/symbols/SymbolPatterns.fsi b/src/fsharp/symbols/SymbolPatterns.fsi index 7c297a9e907..a7e4b6042e0 100644 --- a/src/fsharp/symbols/SymbolPatterns.fsi +++ b/src/fsharp/symbols/SymbolPatterns.fsi @@ -2,6 +2,59 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices +[] +#if COMPILER_PUBLIC_API +module Symbol = +#else +module internal Symbol = +#endif + open System.Text.RegularExpressions + open System + + val isAttribute<'T> : FSharpAttribute -> bool + val tryGetAttribute<'T> : seq -> FSharpAttribute option + val hasModuleSuffixAttribute : FSharpEntity -> bool + val isOperator : name: string -> bool + val isUnnamedUnionCaseField : FSharpField -> bool + val (|AbbreviatedType|_|) : FSharpEntity -> FSharpType option + val (|TypeWithDefinition|_|) : FSharpType -> FSharpEntity option + val getEntityAbbreviatedType : FSharpEntity -> (FSharpEntity * FSharpType option) + val getAbbreviatedType : FSharpType -> FSharpType + val (|Attribute|_|) : FSharpEntity -> unit option + val hasAttribute<'T> : seq -> bool + val (|ValueType|_|) : FSharpEntity -> unit option + val (|Class|_|) : original: FSharpEntity * abbreviated: FSharpEntity * 'a -> unit option + val (|Record|_|) : FSharpEntity -> unit option + val (|UnionType|_|) : FSharpEntity -> unit option + val (|Delegate|_|) : FSharpEntity -> unit option + val (|FSharpException|_|) : FSharpEntity -> unit option + val (|Interface|_|) : FSharpEntity -> unit option + val (|AbstractClass|_|) : FSharpEntity -> unit option + val (|FSharpType|_|) : FSharpEntity -> unit option + val (|ProvidedType|_|) : FSharpEntity -> unit option + val (|ByRef|_|) : FSharpEntity -> unit option + val (|Array|_|) : FSharpEntity -> unit option + val (|FSharpModule|_|) : FSharpEntity -> unit option + val (|Namespace|_|) : FSharpEntity -> unit option + val (|ProvidedAndErasedType|_|) : FSharpEntity -> unit option + val (|Enum|_|) : FSharpEntity -> unit option + val (|Tuple|_|) : FSharpType option -> unit option + val (|RefCell|_|) : FSharpType -> unit option + val (|FunctionType|_|) : FSharpType -> unit option + val (|Pattern|_|) : FSharpSymbol -> unit option + val (|Field|_|) : FSharpSymbol -> (FSharpField * FSharpType) option + val (|MutableVar|_|) : FSharpSymbol -> unit option + val (|FSharpEntity|_|) : FSharpSymbol -> (FSharpEntity * FSharpEntity * FSharpType option) option + val (|Parameter|_|) : FSharpSymbol -> unit option + val (|UnionCase|_|) : FSharpSymbol -> FSharpUnionCase option + val (|RecordField|_|) : FSharpSymbol -> FSharpField option + val (|ActivePatternCase|_|) : FSharpSymbol -> FSharpActivePatternCase option + val (|MemberFunctionOrValue|_|) : FSharpSymbol -> FSharpMemberOrFunctionOrValue option + val (|Constructor|_|) : FSharpMemberOrFunctionOrValue -> FSharpEntity option + val (|Function|_|) : excluded: bool -> FSharpMemberOrFunctionOrValue -> unit option + val (|ExtensionMember|_|) : FSharpMemberOrFunctionOrValue -> unit option + val (|Event|_|) : FSharpMemberOrFunctionOrValue -> unit option + [] #if COMPILER_PUBLIC_API module SymbolUse = diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 72491ed9946..c81376810a3 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -114,6 +114,10 @@ module UnusedOpens = |> List.concat |> List.choose id + type SymbolUseWithFullNames = + { SymbolUse: FSharpSymbolUse + FullNames: string[][] } + let getNamespacesInUse (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : NamespaceUse list = let importantSymbolUses = symbolUses @@ -124,8 +128,106 @@ module UnusedOpens = | _ -> true ) - importantSymbolUses - |> Array.toList + let symbolUsesWithFullNames : SymbolUseWithFullNames [] = + importantSymbolUses + |> Array.map (fun symbolUse -> + let fullNames : string[][] = + match symbolUse.Symbol with + | Symbol.MemberFunctionOrValue func when func.IsExtensionMember -> + if func.IsProperty then + let fullNames = + [| + if func.HasGetterMethod then + yield try func.GetterMethod.EnclosingEntity |> Option.map (fun x -> x.FullName) with _ -> None + if func.HasSetterMethod then + yield try func.SetterMethod.EnclosingEntity |> Option.map (fun x -> x.FullName) with _ -> None + |] + |> Array.choose id + match fullNames with + | [||] -> None + | _ -> Some fullNames + else + match func.EnclosingEntity with + // C# extension method + | Some (Symbol.FSharpEntity Symbol.Class) -> + let fullName = symbolUse.Symbol.FullName.Split '.' + if fullName.Length > 2 then + (* For C# extension methods FCS returns full name including the class name, like: + Namespace.StaticClass.ExtensionMethod + So, in order to properly detect that "open Namespace" actually opens ExtensionMethod, + we remove "StaticClass" part. This makes C# extension methods looks identically + with F# extension members. + *) + let fullNameWithoutClassName = + Array.append fullName.[0..fullName.Length - 3] fullName.[fullName.Length - 1..] + Some [|fullNameWithoutClassName |> String.concat "."|] + else None + | _ -> None + // Operators + | Symbol.MemberFunctionOrValue func -> + match func with + | Symbol.Constructor _ -> + // full name of a constructor looks like "UnusedSymbolClassifierTests.PrivateClass.( .ctor )" + // to make well formed full name parts we cut "( .ctor )" from the tail. + let fullName = func.FullName + let ctorSuffix = ".( .ctor )" + let fullName = + if fullName.EndsWith ctorSuffix then + fullName.[0..fullName.Length - ctorSuffix.Length - 1] + else fullName + Some [| fullName |] + | _ -> + Some [| yield func.FullName + match func.TryGetFullCompiledOperatorNameIdents() with + | Some idents -> yield String.concat "." idents + | None -> () + |] + | Symbol.FSharpEntity e -> + match e with + | e, Symbol.Attribute, _ -> + e.TryGetFullName() + |> Option.map (fun fullName -> + [| fullName; fullName.Substring(0, fullName.Length - "Attribute".Length) |]) + | e, _, _ -> + e.TryGetFullName() |> Option.map (fun fullName -> [| fullName |]) + //| SymbolUse.RecordField _ + | Symbol.UnionCase _ as symbol -> + Some [| let fullName = symbol.FullName + yield fullName + let idents = fullName.Split '.' + // Union cases/Record fields can be accessible without mentioning the enclosing type. + // So we add a FullName without having the type part. + if idents.Length > 1 then + yield Array.append idents.[0..idents.Length - 3] idents.[idents.Length - 1..] |> String.concat "." + |] + | _ -> None + |> Option.defaultValue [|symbolUse.Symbol.FullName|] + |> Array.map (fun fullName -> fullName.Split '.') + + { SymbolUse = symbolUse + FullNames = fullNames }) + + let outerSymbolUses = + symbolUsesWithFullNames + |> Seq.sortBy (fun x -> -x.SymbolUse.RangeAlternate.EndColumn) + |> Seq.fold (fun (prev, acc) next -> + match prev with + | Some prev -> + if prev.FullNames + |> Array.exists (fun prevFullName -> + next.FullNames + |> Array.exists (fun nextFullName -> + nextFullName.Length < prevFullName.Length + && prevFullName |> Microsoft.FSharp.Compiler.AbstractIL.Internal.Library.Array.startsWith nextFullName)) then + Some prev, acc + else Some next, next :: acc + | None -> Some next, next :: acc) + (None, []) + |> snd + |> List.map (fun x -> x.SymbolUse) + |> List.rev + + outerSymbolUses |> List.collect (fun su -> let lineStr = getSourceLineStr su.RangeAlternate.StartLine let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 742d63b1f00..0f95003186a 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -52,7 +52,6 @@ - diff --git a/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs index 2d6b877fee9..d743ff49cdb 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs @@ -108,7 +108,7 @@ type FSharpChecker with match symbolUse.Symbol with // Make sure that unsafe manipulation isn't executed if unused opens are disabled | _ when not checkForUnusedOpens -> None - | TypedAstPatterns.MemberFunctionOrValue func when func.IsExtensionMember -> + | Symbol.MemberFunctionOrValue func when func.IsExtensionMember -> if func.IsProperty then let fullNames = [| if func.HasGetterMethod then @@ -125,9 +125,9 @@ type FSharpChecker with | [||] -> None | _ -> Some fullNames else - match func.EnclosingEntity.Value with + match func.EnclosingEntity with // C# extension method - | TypedAstPatterns.FSharpEntity TypedAstPatterns.Class -> + | Some (Symbol.FSharpEntity Symbol.Class) -> let fullName = symbolUse.Symbol.FullName.Split '.' if fullName.Length > 2 then (* For C# extension methods FCS returns full name including the class name, like: @@ -142,9 +142,9 @@ type FSharpChecker with else None | _ -> None // Operators - | TypedAstPatterns.MemberFunctionOrValue func -> + | Symbol.MemberFunctionOrValue func -> match func with - | TypedAstPatterns.Constructor _ -> + | Symbol.Constructor _ -> // full name of a constructor looks like "UnusedSymbolClassifierTests.PrivateClass.( .ctor )" // to make well formed full name parts we cut "( .ctor )" from the tail. let fullName = func.FullName @@ -160,16 +160,16 @@ type FSharpChecker with | Some idents -> yield String.concat "." idents | None -> () |] - | TypedAstPatterns.FSharpEntity e -> + | Symbol.FSharpEntity e -> match e with - | e, TypedAstPatterns.Attribute, _ -> + | e, Symbol.Attribute, _ -> e.TryGetFullName () |> Option.map (fun fullName -> [| fullName; fullName.Substring(0, fullName.Length - "Attribute".Length) |]) | e, _, _ -> e.TryGetFullName () |> Option.map (fun fullName -> [| fullName |]) - | TypedAstPatterns.RecordField _ - | TypedAstPatterns.UnionCase _ as symbol -> + | Symbol.RecordField _ + | Symbol.UnionCase _ as symbol -> Some [| let fullName = symbol.FullName yield fullName let idents = fullName.Split '.' diff --git a/vsintegration/src/FSharp.Editor/LanguageService/TypedAstUtils.fs b/vsintegration/src/FSharp.Editor/LanguageService/TypedAstUtils.fs deleted file mode 100644 index b857ac6c586..00000000000 --- a/vsintegration/src/FSharp.Editor/LanguageService/TypedAstUtils.fs +++ /dev/null @@ -1,209 +0,0 @@ -module internal Microsoft.VisualStudio.FSharp.Editor.TypedAstUtils - -open System -open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.VisualStudio.FSharp.Editor - -open System.Text.RegularExpressions - -let isAttribute<'T> (attribute: FSharpAttribute) = - // CompiledName throws exception on DataContractAttribute generated by SQLProvider - match Option.attempt (fun _ -> attribute.AttributeType.CompiledName) with - | Some name when name = typeof<'T>.Name -> true - | _ -> false - -let tryGetAttribute<'T> (attributes: seq) = - attributes |> Seq.tryFind isAttribute<'T> - -let hasModuleSuffixAttribute (entity: FSharpEntity) = - entity.Attributes - |> tryGetAttribute - |> Option.bind (fun a -> - Option.attempt (fun _ -> a.ConstructorArguments) - |> Option.bind (fun args -> args |> Seq.tryPick (fun (_, arg) -> - let res = - match arg with - | :? int32 as arg when arg = int CompilationRepresentationFlags.ModuleSuffix -> - Some() - | :? CompilationRepresentationFlags as arg when arg = CompilationRepresentationFlags.ModuleSuffix -> - Some() - | _ -> - None - res))) - |> Option.isSome - -let isOperator (name: string) = - name.StartsWith "( " && name.EndsWith " )" && name.Length > 4 - && name.Substring (2, name.Length - 4) - |> String.forall (fun c -> c <> ' ' && not (Char.IsLetter c)) - -let private UnnamedUnionFieldRegex = Regex("^Item(\d+)?$", RegexOptions.Compiled) - -let isUnnamedUnionCaseField (field: FSharpField) = UnnamedUnionFieldRegex.IsMatch(field.Name) - -module TypedAstPatterns = - - let (|AbbreviatedType|_|) (entity: FSharpEntity) = - if entity.IsFSharpAbbreviation then Some entity.AbbreviatedType - else None - - let (|TypeWithDefinition|_|) (ty: FSharpType) = - if ty.HasTypeDefinition then Some ty.TypeDefinition - else None - - let rec getEntityAbbreviatedType (entity: FSharpEntity) = - if entity.IsFSharpAbbreviation then - match entity.AbbreviatedType with - | TypeWithDefinition def -> getEntityAbbreviatedType def - | abbreviatedType -> entity, Some abbreviatedType - else entity, None - - let rec getAbbreviatedType (fsharpType: FSharpType) = - if fsharpType.IsAbbreviation then - getAbbreviatedType fsharpType.AbbreviatedType - else fsharpType - - let (|Attribute|_|) (entity: FSharpEntity) = - let isAttribute (entity: FSharpEntity) = - let getBaseType (entity: FSharpEntity) = - try - match entity.BaseType with - | Some (TypeWithDefinition def) -> Some def - | _ -> None - with _ -> None - - let rec isAttributeType (ty: FSharpEntity option) = - match ty with - | None -> false - | Some ty -> - match ty.TryGetFullName() with - | None -> false - | Some fullName -> - fullName = "System.Attribute" || isAttributeType (getBaseType ty) - isAttributeType (Some entity) - if isAttribute entity then Some() else None - - let (|ValueType|_|) (e: FSharpEntity) = - if e.IsEnum || e.IsValueType || hasAttribute e.Attributes then Some() - else None - - let (|Class|_|) (original: FSharpEntity, abbreviated: FSharpEntity, _) = - if abbreviated.IsClass - && (not abbreviated.IsStaticInstantiation || original.IsFSharpAbbreviation) then Some() - else None - - let (|Record|_|) (e: FSharpEntity) = if e.IsFSharpRecord then Some() else None - let (|UnionType|_|) (e: FSharpEntity) = if e.IsFSharpUnion then Some() else None - let (|Delegate|_|) (e: FSharpEntity) = if e.IsDelegate then Some() else None - let (|FSharpException|_|) (e: FSharpEntity) = if e.IsFSharpExceptionDeclaration then Some() else None - let (|Interface|_|) (e: FSharpEntity) = if e.IsInterface then Some() else None - let (|AbstractClass|_|) (e: FSharpEntity) = - if hasAttribute e.Attributes then Some() else None - - let (|FSharpType|_|) (e: FSharpEntity) = - if e.IsDelegate || e.IsFSharpExceptionDeclaration || e.IsFSharpRecord || e.IsFSharpUnion - || e.IsInterface || e.IsMeasure - || (e.IsFSharp && e.IsOpaque && not e.IsFSharpModule && not e.IsNamespace) then Some() - else None - - let (|ProvidedType|_|) (e: FSharpEntity) = - if (e.IsProvided || e.IsProvidedAndErased || e.IsProvidedAndGenerated) && e.CompiledName = e.DisplayName then - Some() - else None - - let (|ByRef|_|) (e: FSharpEntity) = if e.IsByRef then Some() else None - let (|Array|_|) (e: FSharpEntity) = if e.IsArrayType then Some() else None - let (|FSharpModule|_|) (entity: FSharpEntity) = if entity.IsFSharpModule then Some() else None - - let (|Namespace|_|) (entity: FSharpEntity) = if entity.IsNamespace then Some() else None - let (|ProvidedAndErasedType|_|) (entity: FSharpEntity) = if entity.IsProvidedAndErased then Some() else None - let (|Enum|_|) (entity: FSharpEntity) = if entity.IsEnum then Some() else None - - let (|Tuple|_|) (ty: FSharpType option) = - ty |> Option.bind (fun ty -> if ty.IsTupleType then Some() else None) - - let (|RefCell|_|) (ty: FSharpType) = - match getAbbreviatedType ty with - | TypeWithDefinition def when - def.IsFSharpRecord && def.FullName = "Microsoft.FSharp.Core.FSharpRef`1" -> Some() - | _ -> None - - let (|FunctionType|_|) (ty: FSharpType) = - if ty.IsFunctionType then Some() - else None - - let (|Pattern|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpUnionCase - | :? FSharpActivePatternCase -> Some() - | _ -> None - - /// Field (field, fieldAbbreviatedType) - let (|Field|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpField as field -> Some (field, getAbbreviatedType field.FieldType) - | _ -> None - - let (|MutableVar|_|) (symbol: FSharpSymbol) = - let isMutable = - match symbol with - | :? FSharpField as field -> field.IsMutable && not field.IsLiteral - | :? FSharpMemberOrFunctionOrValue as func -> func.IsMutable - | _ -> false - if isMutable then Some() else None - - /// Entity (originalEntity, abbreviatedEntity, abbreviatedType) - let (|FSharpEntity|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpEntity as entity -> - let abbreviatedEntity, abbreviatedType = getEntityAbbreviatedType entity - Some (entity, abbreviatedEntity, abbreviatedType) - | _ -> None - - let (|Parameter|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpParameter -> Some() - | _ -> None - - let (|UnionCase|_|) (e: FSharpSymbol) = - match e with - | :? FSharpUnionCase as uc -> Some uc - | _ -> None - - let (|RecordField|_|) (e: FSharpSymbol) = - match e with - | :? FSharpField as field -> - if field.DeclaringEntity.IsFSharpRecord then Some field else None - | _ -> None - - let (|ActivePatternCase|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpActivePatternCase as case -> Some case - | _ -> None - - /// Func (memberFunctionOrValue, fullType) - let (|MemberFunctionOrValue|_|) (symbol: FSharpSymbol) = - match symbol with - | :? FSharpMemberOrFunctionOrValue as func -> Some func - | _ -> None - - /// Constructor (enclosingEntity) - let (|Constructor|_|) (func: FSharpMemberOrFunctionOrValue) = - match func.CompiledName with - | ".ctor" | ".cctor" -> Some func.EnclosingEntity - | _ -> None - - let (|Function|_|) excluded (func: FSharpMemberOrFunctionOrValue) = - match func.FullTypeSafe |> Option.map getAbbreviatedType with - | Some typ when typ.IsFunctionType - && not func.IsPropertyGetterMethod - && not func.IsPropertySetterMethod - && not excluded - && not (isOperator func.DisplayName) -> Some() - | _ -> None - - let (|ExtensionMember|_|) (func: FSharpMemberOrFunctionOrValue) = - if func.IsExtensionMember then Some() else None - - let (|Event|_|) (func: FSharpMemberOrFunctionOrValue) = - if func.IsEvent then Some () else None \ No newline at end of file diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 9ebaa0d0d46..1c33819064a 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -136,7 +136,7 @@ module M2 = => [] [] -[] +//[] let ``open a nested module inside another one is not unused, complex hierarchy``() = """ module Top = @@ -151,7 +151,7 @@ module Top = => [] [] -[] +//[] let ``open a nested module inside another one is not unused, even more complex hierarchy``() = """ module Top = @@ -168,7 +168,7 @@ module Top = => [] [] -[] +[] let ``last of several equivalent open declarations is market as used, the rest of them are marked as unused``() = """ module NormalModule = @@ -197,7 +197,7 @@ type Class() = class end => [] [] -[] +[] let ``open declaration is not marked as unused if an extension property is used``() = """ module Module = @@ -220,7 +220,7 @@ let _ = "a long string".Trim() => [ 5, (5, 11) ] [] -[] +[] let ``open declaration is not marked as unused if an extension method is used``() = """ type Class() = class end @@ -266,7 +266,7 @@ type Site (x: int -> unit) = class end => [ 4, (5, 6) ] [] -[] +[] let ``static extension method applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = @@ -279,7 +279,7 @@ let _ = DateTime.ExtensionMethod => [] [] -[] +//[] let ``static extension property applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = @@ -328,7 +328,7 @@ let _ = func() => [] [] -[] +//[] let ``open module all of which symbols are used by qualifier is marked as unused``() = """ module M = @@ -383,7 +383,7 @@ let _ = Func(fun _ -> 1) => [] [] -[] +//[] let ``open declaration is not marked as unused if a unit of measure defined in it is used``() = """ module M = @@ -425,7 +425,7 @@ File.ReadAllLines "" => [] [] -[] +//[] let ``redundant opening a module with ModuleSuffix attribute value is marks as unused``() = """ [] @@ -438,7 +438,7 @@ module M = => [ 6, (9, 33) ] [] -[] +//[] let ``redundant opening a module is marks as unused``() = """ module InternalModuleWithSuffix = @@ -550,7 +550,7 @@ open System => [] [] -[] +[] let ``open declaration is not marked as unused if a related type extension is used``() = """ module Module = @@ -581,7 +581,7 @@ module Module = => [] [] -[] +//[] let ``record fields should be taken into account``() = """ module M1 = @@ -593,7 +593,6 @@ module M2 = => [] [] -[] let ``handle type alias``() = """ module TypeAlias = From 86c7bc07902d915161edb466a650b0d998f30565 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 21 Oct 2017 15:24:06 +0300 Subject: [PATCH 020/150] fix compilation --- .../src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs | 1 - 1 file changed, 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs index d743ff49cdb..14719b17d23 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerExtensions.fs @@ -8,7 +8,6 @@ open Microsoft.CodeAnalysis.Text open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.SourceCodeServices -open TypedAstUtils type CheckResults = | Ready of (FSharpParseFileResults * FSharpCheckFileResults) option From eb75ac8d29972c569c2dead7a8269377f7aee9f8 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 22 Oct 2017 21:15:58 +0300 Subject: [PATCH 021/150] use module's child symbols --- src/fsharp/vs/ServiceAnalysis.fs | 108 +++++++++++++++++-------------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index c81376810a3..b4dda838cc0 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -9,11 +9,14 @@ open Microsoft.FSharp.Compiler.Range module UnusedOpens = open Microsoft.FSharp.Compiler.PrettyNaming + open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library /// Represents single open statement. type OpenStatement = { /// Full namespace or module identifier as it's presented in source code. Idents: Set + /// Modules. + Modules: FSharpEntity list /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. @@ -27,6 +30,7 @@ module UnusedOpens = match openDeclaration with | FSharpOpenDeclaration.Open ((firstId :: _) as longId, modules, appliedScope) -> Some { Idents = modules |> List.choose (fun x -> x.TryFullName) |> Set.ofList + Modules = modules Range = let lastId = List.last longId mkRange appliedScope.FileName firstId.idRange.Start lastId.idRange.End @@ -118,14 +122,18 @@ module UnusedOpens = { SymbolUse: FSharpSymbolUse FullNames: string[][] } - let getNamespacesInUse (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : NamespaceUse list = + type SymbolUse = + { SymbolUse: FSharpSymbolUse + RequiredPrefix: string } + + let getSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : SymbolUse[] = let importantSymbolUses = symbolUses |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition && - match symbolUse.Symbol with - | :? FSharpEntity as e -> not e.IsNamespace - | _ -> true + not symbolUse.IsFromDefinition + //&& match symbolUse.Symbol with + //| :? FSharpEntity as e -> not e.IsNamespace + //| _ -> true ) let symbolUsesWithFullNames : SymbolUseWithFullNames [] = @@ -207,58 +215,59 @@ module UnusedOpens = { SymbolUse = symbolUse FullNames = fullNames }) - let outerSymbolUses = - symbolUsesWithFullNames - |> Seq.sortBy (fun x -> -x.SymbolUse.RangeAlternate.EndColumn) - |> Seq.fold (fun (prev, acc) next -> - match prev with - | Some prev -> - if prev.FullNames - |> Array.exists (fun prevFullName -> - next.FullNames - |> Array.exists (fun nextFullName -> - nextFullName.Length < prevFullName.Length - && prevFullName |> Microsoft.FSharp.Compiler.AbstractIL.Internal.Library.Array.startsWith nextFullName)) then - Some prev, acc - else Some next, next :: acc - | None -> Some next, next :: acc) - (None, []) - |> snd - |> List.map (fun x -> x.SymbolUse) - |> List.rev + //let outerSymbolUses = + // symbolUsesWithFullNames + // |> Seq.sortBy (fun x -> -x.SymbolUse.RangeAlternate.EndColumn) + // |> Seq.fold (fun (prev, acc) next -> + // match prev with + // | Some prev -> + // if prev.FullNames + // |> Array.exists (fun prevFullName -> + // next.FullNames + // |> Array.exists (fun nextFullName -> + // nextFullName.Length < prevFullName.Length + // && prevFullName |> Microsoft.FSharp.Compiler.AbstractIL.Internal.Library.Array.startsWith nextFullName)) then + // Some prev, acc + // else Some next, next :: acc + // | None -> Some next, next :: acc) + // (None, []) + // |> snd + // |> List.map (fun x -> x.SymbolUse) + // |> List.rev - outerSymbolUses - |> List.collect (fun su -> - let lineStr = getSourceLineStr su.RangeAlternate.StartLine - let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.RangeAlternate.EndColumn - 1) - let qualifier = partialName.QualifyingIdents |> String.concat "." - getPossibleNamespaces getSourceLineStr su - |> List.distinct - |> List.choose (fun ns -> - if qualifier = "" then Some ns - elif ns = qualifier then None - elif ns.EndsWith qualifier then Some ns.[..(ns.Length - qualifier.Length) - 2] - else None) - |> List.map (fun ns -> - { Ident = ns - SymbolLocation = su.RangeAlternate })) + symbolUsesWithFullNames + |> Array.collect (fun su -> + let lineStr = getSourceLineStr su.SymbolUse.RangeAlternate.StartLine + let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.SymbolUse.RangeAlternate.EndColumn - 1) + let suffix = partialName.QualifyingIdents @ [partialName.PartialIdent] |> List.toArray + su.FullNames + |> Array.choose (fun fullName -> + if fullName = suffix then None + elif fullName |> Array.endsWith suffix then Some(su.SymbolUse, fullName.[..(fullName.Length - suffix.Length) - 2]) + else None) + |> Array.map (fun (su, prefix) -> + { SymbolUse = su + RequiredPrefix = prefix |> String.concat "." })) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = - let filter (openStatements: OpenStatement list) (namespacesInUse: NamespaceUse list) : OpenStatement list = + let filter (openStatements: OpenStatement list) (symbolUses: SymbolUse[]) : OpenStatement list = let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = let isUsed (openStatement: OpenStatement) = if openStatement.IsGlobal then true else - let usedSomewhere = - namespacesInUse - |> List.exists (fun namespaceUse -> - let inScope = rangeContainsRange openStatement.AppliedScope namespaceUse.SymbolLocation + let usedSomewhere = + symbolUses + |> Array.exists (fun symbolUse -> + let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.SymbolUse.RangeAlternate if not inScope then false + elif not (openStatement.Idents |> Set.contains symbolUse.RequiredPrefix) then false else - let identMatches = openStatement.Idents |> Set.contains namespaceUse.Ident - identMatches) + openStatement.Modules + |> List.exists (fun m -> + m.PublicNestedEntities + |> Seq.exists (fun ent -> ent.IsEffectivelySameAs symbolUse.SymbolUse.Symbol))) if not usedSomewhere then false else @@ -281,8 +290,9 @@ module UnusedOpens = filterInner [] openStatements [] async { - let! symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() - let namespacesInUse = getNamespacesInUse getSourceLineStr symbolUses + let! fsharpSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() + let symbolUses = getSymbolUses getSourceLineStr fsharpSymbolUses + //let namespacesInUse = getNamespacesInUse getSourceLineStr symbolUses let openStatements = getOpenStatements checkFileResults.OpenDeclarations - return filter openStatements namespacesInUse |> List.map (fun os -> os.Range) + return filter openStatements symbolUses |> List.map (fun os -> os.Range) } \ No newline at end of file From f7362f548aed2e9ba49ff341ee5f49b5ffe93ddd Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 22 Oct 2017 22:11:06 +0300 Subject: [PATCH 022/150] fix for module suffix --- src/fsharp/vs/ServiceAnalysis.fs | 10 +++++++++- vsintegration/tests/unittests/UnusedOpensTests.fs | 4 ---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index b4dda838cc0..15492d25b44 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -29,7 +29,15 @@ module UnusedOpens = |> List.choose (fun openDeclaration -> match openDeclaration with | FSharpOpenDeclaration.Open ((firstId :: _) as longId, modules, appliedScope) -> - Some { Idents = modules |> List.choose (fun x -> x.TryFullName) |> Set.ofList + Some { Idents = + modules + |> List.choose (fun x -> x.TryFullName |> Option.map (fun fullName -> x, fullName)) + |> List.collect (fun (modul, fullName) -> + [ yield fullName + if modul.HasFSharpModuleSuffix then + yield fullName.[..fullName.Length - 7] // "Module" length plus zero indexign correction + ]) + |> Set.ofList Modules = modules Range = let lastId = List.last longId diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 1c33819064a..8a72d3452e5 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -168,7 +168,6 @@ module Top = => [] [] -[] let ``last of several equivalent open declarations is market as used, the rest of them are marked as unused``() = """ module NormalModule = @@ -197,7 +196,6 @@ type Class() = class end => [] [] -[] let ``open declaration is not marked as unused if an extension property is used``() = """ module Module = @@ -220,7 +218,6 @@ let _ = "a long string".Trim() => [ 5, (5, 11) ] [] -[] let ``open declaration is not marked as unused if an extension method is used``() = """ type Class() = class end @@ -550,7 +547,6 @@ open System => [] [] -[] let ``open declaration is not marked as unused if a related type extension is used``() = """ module Module = From 4b8a73679dd8ed51275cefb803c064bda9885463 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 22 Oct 2017 22:46:23 +0300 Subject: [PATCH 023/150] add functions and values into consideration --- src/fsharp/vs/ServiceAnalysis.fs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 15492d25b44..c49d7b9cab6 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -251,7 +251,7 @@ module UnusedOpens = su.FullNames |> Array.choose (fun fullName -> if fullName = suffix then None - elif fullName |> Array.endsWith suffix then Some(su.SymbolUse, fullName.[..(fullName.Length - suffix.Length) - 2]) + elif fullName |> Array.endsWith suffix then Some(su.SymbolUse, fullName.[..(fullName.Length - suffix.Length) - 1]) else None) |> Array.map (fun (su, prefix) -> { SymbolUse = su @@ -274,8 +274,13 @@ module UnusedOpens = else openStatement.Modules |> List.exists (fun m -> - m.PublicNestedEntities - |> Seq.exists (fun ent -> ent.IsEffectivelySameAs symbolUse.SymbolUse.Symbol))) + let entities = Seq.toList m.NestedEntities + entities |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol) + || + ( + let functions = m.MembersFunctionsAndValues |> Seq.map (fun x -> x :> FSharpSymbol) |> Seq.toList + functions |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol) + ))) if not usedSomewhere then false else From 71a5f23c6539bc39ead697d69f7778e4054745b3 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 11:19:04 +0300 Subject: [PATCH 024/150] switch back from full names to possible namespaces --- src/fsharp/vs/ServiceAnalysis.fs | 157 +++++-------------------------- 1 file changed, 22 insertions(+), 135 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index c49d7b9cab6..e265714369b 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -3,13 +3,11 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Range module UnusedOpens = open Microsoft.FSharp.Compiler.PrettyNaming - open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library /// Represents single open statement. type OpenStatement = @@ -35,7 +33,7 @@ module UnusedOpens = |> List.collect (fun (modul, fullName) -> [ yield fullName if modul.HasFSharpModuleSuffix then - yield fullName.[..fullName.Length - 7] // "Module" length plus zero indexign correction + yield fullName.[..fullName.Length - 7] // "Module" length plus zero index correction ]) |> Set.ofList Modules = modules @@ -96,7 +94,7 @@ module UnusedOpens = if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None else Some fullName.[0..lengthDiff] - let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : string list = + let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : Set = let isQualified = symbolIsFullyQualified getSourceLineStr symbolUse (match symbolUse with @@ -118,13 +116,14 @@ module UnusedOpens = Some ([p.FullName], Some p.Type.TypeDefinition) | _ -> None) |> Option.map (fun (fullNames, declaringEntity) -> - [ for name in fullNames do - let partNamespace = getPartNamespace symbolUse name - yield partNamespace - yield! entityNamespace declaringEntity ]) - |> Option.toList - |> List.concat - |> List.choose id + [| for name in fullNames do + let partNamespace = getPartNamespace symbolUse name + yield partNamespace + yield! entityNamespace declaringEntity |]) + |> Option.toArray + |> Array.concat + |> Array.choose id + |> set type SymbolUseWithFullNames = { SymbolUse: FSharpSymbolUse @@ -132,130 +131,19 @@ module UnusedOpens = type SymbolUse = { SymbolUse: FSharpSymbolUse - RequiredPrefix: string } + PossibleNamespaces: Set } let getSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : SymbolUse[] = - let importantSymbolUses = - symbolUses - |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition - //&& match symbolUse.Symbol with - //| :? FSharpEntity as e -> not e.IsNamespace - //| _ -> true - ) - - let symbolUsesWithFullNames : SymbolUseWithFullNames [] = - importantSymbolUses - |> Array.map (fun symbolUse -> - let fullNames : string[][] = - match symbolUse.Symbol with - | Symbol.MemberFunctionOrValue func when func.IsExtensionMember -> - if func.IsProperty then - let fullNames = - [| - if func.HasGetterMethod then - yield try func.GetterMethod.EnclosingEntity |> Option.map (fun x -> x.FullName) with _ -> None - if func.HasSetterMethod then - yield try func.SetterMethod.EnclosingEntity |> Option.map (fun x -> x.FullName) with _ -> None - |] - |> Array.choose id - match fullNames with - | [||] -> None - | _ -> Some fullNames - else - match func.EnclosingEntity with - // C# extension method - | Some (Symbol.FSharpEntity Symbol.Class) -> - let fullName = symbolUse.Symbol.FullName.Split '.' - if fullName.Length > 2 then - (* For C# extension methods FCS returns full name including the class name, like: - Namespace.StaticClass.ExtensionMethod - So, in order to properly detect that "open Namespace" actually opens ExtensionMethod, - we remove "StaticClass" part. This makes C# extension methods looks identically - with F# extension members. - *) - let fullNameWithoutClassName = - Array.append fullName.[0..fullName.Length - 3] fullName.[fullName.Length - 1..] - Some [|fullNameWithoutClassName |> String.concat "."|] - else None - | _ -> None - // Operators - | Symbol.MemberFunctionOrValue func -> - match func with - | Symbol.Constructor _ -> - // full name of a constructor looks like "UnusedSymbolClassifierTests.PrivateClass.( .ctor )" - // to make well formed full name parts we cut "( .ctor )" from the tail. - let fullName = func.FullName - let ctorSuffix = ".( .ctor )" - let fullName = - if fullName.EndsWith ctorSuffix then - fullName.[0..fullName.Length - ctorSuffix.Length - 1] - else fullName - Some [| fullName |] - | _ -> - Some [| yield func.FullName - match func.TryGetFullCompiledOperatorNameIdents() with - | Some idents -> yield String.concat "." idents - | None -> () - |] - | Symbol.FSharpEntity e -> - match e with - | e, Symbol.Attribute, _ -> - e.TryGetFullName() - |> Option.map (fun fullName -> - [| fullName; fullName.Substring(0, fullName.Length - "Attribute".Length) |]) - | e, _, _ -> - e.TryGetFullName() |> Option.map (fun fullName -> [| fullName |]) - //| SymbolUse.RecordField _ - | Symbol.UnionCase _ as symbol -> - Some [| let fullName = symbol.FullName - yield fullName - let idents = fullName.Split '.' - // Union cases/Record fields can be accessible without mentioning the enclosing type. - // So we add a FullName without having the type part. - if idents.Length > 1 then - yield Array.append idents.[0..idents.Length - 3] idents.[idents.Length - 1..] |> String.concat "." - |] - | _ -> None - |> Option.defaultValue [|symbolUse.Symbol.FullName|] - |> Array.map (fun fullName -> fullName.Split '.') - - { SymbolUse = symbolUse - FullNames = fullNames }) - - //let outerSymbolUses = - // symbolUsesWithFullNames - // |> Seq.sortBy (fun x -> -x.SymbolUse.RangeAlternate.EndColumn) - // |> Seq.fold (fun (prev, acc) next -> - // match prev with - // | Some prev -> - // if prev.FullNames - // |> Array.exists (fun prevFullName -> - // next.FullNames - // |> Array.exists (fun nextFullName -> - // nextFullName.Length < prevFullName.Length - // && prevFullName |> Microsoft.FSharp.Compiler.AbstractIL.Internal.Library.Array.startsWith nextFullName)) then - // Some prev, acc - // else Some next, next :: acc - // | None -> Some next, next :: acc) - // (None, []) - // |> snd - // |> List.map (fun x -> x.SymbolUse) - // |> List.rev - - symbolUsesWithFullNames - |> Array.collect (fun su -> - let lineStr = getSourceLineStr su.SymbolUse.RangeAlternate.StartLine - let partialName = QuickParse.GetPartialLongNameEx(lineStr, su.SymbolUse.RangeAlternate.EndColumn - 1) - let suffix = partialName.QualifyingIdents @ [partialName.PartialIdent] |> List.toArray - su.FullNames - |> Array.choose (fun fullName -> - if fullName = suffix then None - elif fullName |> Array.endsWith suffix then Some(su.SymbolUse, fullName.[..(fullName.Length - suffix.Length) - 1]) - else None) - |> Array.map (fun (su, prefix) -> - { SymbolUse = su - RequiredPrefix = prefix |> String.concat "." })) + symbolUses + |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> + not symbolUse.IsFromDefinition + //&& match symbolUse.Symbol with + //| :? FSharpEntity as e -> not e.IsNamespace + //| _ -> true + ) + |> Array.map (fun su -> + { SymbolUse = su + PossibleNamespaces = getPossibleNamespaces getSourceLineStr su }) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = @@ -270,7 +158,7 @@ module UnusedOpens = |> Array.exists (fun symbolUse -> let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.SymbolUse.RangeAlternate if not inScope then false - elif not (openStatement.Idents |> Set.contains symbolUse.RequiredPrefix) then false + elif openStatement.Idents |> Set.intersect symbolUse.PossibleNamespaces |> Set.isEmpty then false else openStatement.Modules |> List.exists (fun m -> @@ -305,7 +193,6 @@ module UnusedOpens = async { let! fsharpSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() let symbolUses = getSymbolUses getSourceLineStr fsharpSymbolUses - //let namespacesInUse = getNamespacesInUse getSourceLineStr symbolUses let openStatements = getOpenStatements checkFileResults.OpenDeclarations return filter openStatements symbolUses |> List.map (fun os -> os.Range) } \ No newline at end of file From c84c7d529bf7cd723590bd9464ad382f80c74004 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 11:30:38 +0300 Subject: [PATCH 025/150] refactoring --- src/fsharp/vs/ServiceAnalysis.fs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index e265714369b..f1cb029c86c 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -22,6 +22,14 @@ module UnusedOpens = /// If it's prefixed with the special "global" namespace. IsGlobal: bool } + member this.AllChildSymbols = + seq { for modul in this.Modules do + for ent in modul.NestedEntities do + yield ent :> FSharpSymbol + for fv in modul.MembersFunctionsAndValues do + yield fv :> FSharpSymbol + } |> Seq.cache + let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations |> List.choose (fun openDeclaration -> @@ -160,15 +168,9 @@ module UnusedOpens = if not inScope then false elif openStatement.Idents |> Set.intersect symbolUse.PossibleNamespaces |> Set.isEmpty then false else - openStatement.Modules - |> List.exists (fun m -> - let entities = Seq.toList m.NestedEntities - entities |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol) - || - ( - let functions = m.MembersFunctionsAndValues |> Seq.map (fun x -> x :> FSharpSymbol) |> Seq.toList - functions |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol) - ))) + let moduleSymbols = openStatement.AllChildSymbols |> Seq.toList + moduleSymbols + |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol)) if not usedSomewhere then false else From 5655a9206e557c8d464c46adadcabd913af16c49 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 11:58:29 +0300 Subject: [PATCH 026/150] bring record field into scope --- src/fsharp/vs/ServiceAnalysis.fs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index f1cb029c86c..cad3c044101 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -26,8 +26,12 @@ module UnusedOpens = seq { for modul in this.Modules do for ent in modul.NestedEntities do yield ent :> FSharpSymbol + if ent.IsFSharpRecord then + for rf in ent.FSharpFields do + yield upcast rf + for fv in modul.MembersFunctionsAndValues do - yield fv :> FSharpSymbol + yield upcast fv } |> Seq.cache let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = From 80dc7d3d4eb693cd4943cc089a10258756af6570 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 15:09:12 +0300 Subject: [PATCH 027/150] bring non RQA DU cases into scope --- src/fsharp/vs/ServiceAnalysis.fs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index cad3c044101..1551ab2379a 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -26,9 +26,14 @@ module UnusedOpens = seq { for modul in this.Modules do for ent in modul.NestedEntities do yield ent :> FSharpSymbol + if ent.IsFSharpRecord then for rf in ent.FSharpFields do yield upcast rf + + if ent.IsFSharpUnion && not (hasAttribute ent.Attributes) then + for unionCase in ent.UnionCases do + yield upcast unionCase for fv in modul.MembersFunctionsAndValues do yield upcast fv From a35e535a4b3918dcbfa487fa913cd2474ddde0d8 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 15:38:34 +0300 Subject: [PATCH 028/150] auto open modules --- src/fsharp/vs/ServiceAnalysis.fs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 1551ab2379a..5ff9265f46a 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -23,7 +23,8 @@ module UnusedOpens = IsGlobal: bool } member this.AllChildSymbols = - seq { for modul in this.Modules do + let rec getAllChildSymbolsInModule (modul: FSharpEntity) = + seq { for ent in modul.NestedEntities do yield ent :> FSharpSymbol @@ -35,8 +36,15 @@ module UnusedOpens = for unionCase in ent.UnionCases do yield upcast unionCase + if ent.IsFSharpModule && hasAttribute ent.Attributes then + yield! getAllChildSymbolsInModule ent + for fv in modul.MembersFunctionsAndValues do yield upcast fv + } + + seq { for modul in this.Modules do + yield! getAllChildSymbolsInModule modul } |> Seq.cache let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = From 4ba197a29cdd70207730a5554b0d3cec0cea5956 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 16:28:04 +0300 Subject: [PATCH 029/150] fix partially qualified name 1 --- src/fsharp/vs/ServiceAnalysis.fs | 83 +++++++++---------- .../tests/unittests/UnusedOpensTests.fs | 1 - 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 5ff9265f46a..06f5becaa4a 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -102,53 +102,50 @@ module UnusedOpens = ] | None -> [] - let symbolIsFullyQualified (getSourceLineStr: int -> string) (sym: FSharpSymbolUse) (fullName: string) = - let lineStr = getSourceLineStr sym.RangeAlternate.StartLine - match QuickParse.GetCompleteIdentifierIsland true lineStr sym.RangeAlternate.EndColumn with - | Some (island, _, _) -> island = fullName - | None -> false - type NamespaceUse = { Ident: string SymbolLocation: range } - let getPartNamespace (symbolUse: FSharpSymbolUse) (fullName: string) = - // given a symbol range such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` - let length = symbolUse.RangeAlternate.EndColumn - symbolUse.RangeAlternate.StartColumn - let lengthDiff = fullName.Length - length - 2 + let getPartNamespace (fullIsland: string) (fullName: string) = + // given a full island such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` + let lengthDiff = fullName.Length - fullIsland.Length - 2 if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None else Some fullName.[0..lengthDiff] let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : Set = - let isQualified = symbolIsFullyQualified getSourceLineStr symbolUse - - (match symbolUse with - | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> - Some (cleanFullNames, Some ent) - | SymbolUse.Field f when not (isQualified f.FullName) -> - Some ([f.FullName], Some f.DeclaringEntity) - | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> - Some ([mfv.FullName], mfv.EnclosingEntity) - | SymbolUse.Operator op when not (isQualified op.FullName) -> - Some ([op.FullName], op.EnclosingEntity) - | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> - Some ([ap.FullName], ap.EnclosingEntity) - | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> - Some ([apc.FullName], apc.Group.EnclosingEntity) - | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> - Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) - | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> - Some ([p.FullName], Some p.Type.TypeDefinition) - | _ -> None) - |> Option.map (fun (fullNames, declaringEntity) -> - [| for name in fullNames do - let partNamespace = getPartNamespace symbolUse name - yield partNamespace - yield! entityNamespace declaringEntity |]) - |> Option.toArray - |> Array.concat - |> Array.choose id - |> set + let lineStr = getSourceLineStr symbolUse.RangeAlternate.StartLine + match QuickParse.GetCompleteIdentifierIsland true lineStr symbolUse.RangeAlternate.EndColumn with + | Some(fullIsland, _, _) -> + let isQualified fullName = fullName = fullIsland + + (match symbolUse with + | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> + Some (cleanFullNames, Some ent) + | SymbolUse.Field f when not (isQualified f.FullName) -> + Some ([f.FullName], Some f.DeclaringEntity) + | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> + Some ([mfv.FullName], mfv.EnclosingEntity) + | SymbolUse.Operator op when not (isQualified op.FullName) -> + Some ([op.FullName], op.EnclosingEntity) + | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> + Some ([ap.FullName], ap.EnclosingEntity) + | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> + Some ([apc.FullName], apc.Group.EnclosingEntity) + | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> + Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) + | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> + Some ([p.FullName], Some p.Type.TypeDefinition) + | _ -> None) + |> Option.map (fun (fullNames, declaringEntity) -> + [| for name in fullNames do + let partNamespace = getPartNamespace fullIsland name + yield partNamespace + yield! entityNamespace declaringEntity |]) + |> Option.toArray + |> Array.concat + |> Array.choose id + |> set + | None -> Set.empty type SymbolUseWithFullNames = { SymbolUse: FSharpSymbolUse @@ -161,10 +158,10 @@ module UnusedOpens = let getSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : SymbolUse[] = symbolUses |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition - //&& match symbolUse.Symbol with - //| :? FSharpEntity as e -> not e.IsNamespace - //| _ -> true + not symbolUse.IsFromDefinition && + match symbolUse.Symbol with + | :? FSharpEntity as e -> not e.IsNamespace + | _ -> true ) |> Array.map (fun su -> { SymbolUse = su diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 8a72d3452e5..03a950aacd9 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -263,7 +263,6 @@ type Site (x: int -> unit) = class end => [ 4, (5, 6) ] [] -[] let ``static extension method applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = From 6d1b4bd1b55972ec035b8f277eebb9111865d1ec Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 17:16:46 +0300 Subject: [PATCH 030/150] find in open decls sub namespaces (wip) --- src/fsharp/vs/ServiceAnalysis.fs | 44 ++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 06f5becaa4a..22b07c982d6 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -104,18 +104,28 @@ module UnusedOpens = type NamespaceUse = { Ident: string - SymbolLocation: range } + ExtraNamespaces: string[] } - let getPartNamespace (fullIsland: string) (fullName: string) = + let getNamespaceInUse (fullIsland: string) (fullName: string) : NamespaceUse option = // given a full island such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` let lengthDiff = fullName.Length - fullIsland.Length - 2 if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None - else Some fullName.[0..lengthDiff] - - let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : Set = + else + let requiredOpenNamespace = fullName.[0..lengthDiff] + let rest = fullName.[lengthDiff + 1..] + let extraNamespaces = + match rest.Split '.' with + | [||] | [|_|] -> [||] + | rest -> rest.[..rest.Length - 2] + Some { Ident = requiredOpenNamespace; ExtraNamespaces = extraNamespaces } + + let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : NamespaceUse[] = let lineStr = getSourceLineStr symbolUse.RangeAlternate.StartLine - match QuickParse.GetCompleteIdentifierIsland true lineStr symbolUse.RangeAlternate.EndColumn with - | Some(fullIsland, _, _) -> + let partialName = QuickParse.GetPartialLongNameEx (lineStr, symbolUse.RangeAlternate.EndColumn - 1) + if partialName.PartialIdent = "" then [||] + else + let qualifyingIsland = partialName.QualifyingIdents |> String.concat "." + let fullIsland = qualifyingIsland + partialName.PartialIdent let isQualified fullName = fullName = fullIsland (match symbolUse with @@ -138,14 +148,16 @@ module UnusedOpens = | _ -> None) |> Option.map (fun (fullNames, declaringEntity) -> [| for name in fullNames do - let partNamespace = getPartNamespace fullIsland name + let partNamespace = getNamespaceInUse fullIsland name yield partNamespace - yield! entityNamespace declaringEntity |]) + yield! + entityNamespace declaringEntity + |> List.map (Option.bind (getNamespaceInUse qualifyingIsland)) + |]) |> Option.toArray |> Array.concat |> Array.choose id - |> set - | None -> Set.empty + |> Array.distinct type SymbolUseWithFullNames = { SymbolUse: FSharpSymbolUse @@ -153,15 +165,15 @@ module UnusedOpens = type SymbolUse = { SymbolUse: FSharpSymbolUse - PossibleNamespaces: Set } + PossibleNamespaces: NamespaceUse[] } let getSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : SymbolUse[] = symbolUses |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition && - match symbolUse.Symbol with - | :? FSharpEntity as e -> not e.IsNamespace - | _ -> true + not symbolUse.IsFromDefinition //&& + //match symbolUse.Symbol with + //| :? FSharpEntity as e -> not e.IsNamespace + //| _ -> true ) |> Array.map (fun su -> { SymbolUse = su From 42e528bc0cf6653f423c22c192c840ef9610704a Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 19:53:28 +0300 Subject: [PATCH 031/150] the proper way, finally --- src/fsharp/vs/ServiceAnalysis.fs | 127 ++++--------------------------- 1 file changed, 14 insertions(+), 113 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 22b07c982d6..00c93eccdb2 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -70,118 +70,19 @@ module UnusedOpens = | _ -> None // for now ) - let getAutoOpenAccessPath (ent:FSharpEntity) = - // Some.Namespace+AutoOpenedModule+Entity - - // HACK: I can't see a way to get the EnclosingEntity of an Entity - // Some.Namespace + Some.Namespace.AutoOpenedModule are both valid - ent.TryFullName |> Option.bind(fun _ -> - if (not ent.IsNamespace) && ent.QualifiedName.Contains "+" then - Some ent.QualifiedName.[0..ent.QualifiedName.IndexOf "+" - 1] - else - None) - - let entityNamespace (entOpt: FSharpEntity option) = - match entOpt with - | Some ent -> - if ent.IsFSharpModule then - [ yield Some ent.QualifiedName - yield Some ent.LogicalName - yield Some ent.AccessPath - yield Some ent.FullName - yield Some ent.DisplayName - yield ent.TryGetFullDisplayName() - if ent.HasFSharpModuleSuffix then - yield Some (ent.AccessPath + "." + ent.DisplayName)] - else - [ yield ent.Namespace - yield Some ent.AccessPath - yield getAutoOpenAccessPath ent - for path in ent.AllCompilationPaths do - yield Some path - ] - | None -> [] - - type NamespaceUse = - { Ident: string - ExtraNamespaces: string[] } - - let getNamespaceInUse (fullIsland: string) (fullName: string) : NamespaceUse option = - // given a full island such as `Text.ISegment` and a full name of `MonoDevelop.Core.Text.ISegment`, return `MonoDevelop.Core` - let lengthDiff = fullName.Length - fullIsland.Length - 2 - if lengthDiff <= 0 || lengthDiff > fullName.Length - 1 then None - else - let requiredOpenNamespace = fullName.[0..lengthDiff] - let rest = fullName.[lengthDiff + 1..] - let extraNamespaces = - match rest.Split '.' with - | [||] | [|_|] -> [||] - | rest -> rest.[..rest.Length - 2] - Some { Ident = requiredOpenNamespace; ExtraNamespaces = extraNamespaces } - - let getPossibleNamespaces (getSourceLineStr: int -> string) (symbolUse: FSharpSymbolUse) : NamespaceUse[] = - let lineStr = getSourceLineStr symbolUse.RangeAlternate.StartLine - let partialName = QuickParse.GetPartialLongNameEx (lineStr, symbolUse.RangeAlternate.EndColumn - 1) - if partialName.PartialIdent = "" then [||] - else - let qualifyingIsland = partialName.QualifyingIdents |> String.concat "." - let fullIsland = qualifyingIsland + partialName.PartialIdent - let isQualified fullName = fullName = fullIsland - - (match symbolUse with - | SymbolUse.Entity (ent, cleanFullNames) when not (cleanFullNames |> List.exists isQualified) -> - Some (cleanFullNames, Some ent) - | SymbolUse.Field f when not (isQualified f.FullName) -> - Some ([f.FullName], Some f.DeclaringEntity) - | SymbolUse.MemberFunctionOrValue mfv when not (isQualified mfv.FullName) -> - Some ([mfv.FullName], mfv.EnclosingEntity) - | SymbolUse.Operator op when not (isQualified op.FullName) -> - Some ([op.FullName], op.EnclosingEntity) - | SymbolUse.ActivePattern ap when not (isQualified ap.FullName) -> - Some ([ap.FullName], ap.EnclosingEntity) - | SymbolUse.ActivePatternCase apc when not (isQualified apc.FullName) -> - Some ([apc.FullName], apc.Group.EnclosingEntity) - | SymbolUse.UnionCase uc when not (isQualified uc.FullName) -> - Some ([uc.FullName], Some uc.ReturnType.TypeDefinition) - | SymbolUse.Parameter p when not (isQualified p.FullName) && p.Type.HasTypeDefinition -> - Some ([p.FullName], Some p.Type.TypeDefinition) - | _ -> None) - |> Option.map (fun (fullNames, declaringEntity) -> - [| for name in fullNames do - let partNamespace = getNamespaceInUse fullIsland name - yield partNamespace - yield! - entityNamespace declaringEntity - |> List.map (Option.bind (getNamespaceInUse qualifyingIsland)) - |]) - |> Option.toArray - |> Array.concat - |> Array.choose id - |> Array.distinct - - type SymbolUseWithFullNames = - { SymbolUse: FSharpSymbolUse - FullNames: string[][] } - - type SymbolUse = - { SymbolUse: FSharpSymbolUse - PossibleNamespaces: NamespaceUse[] } - - let getSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : SymbolUse[] = + let filterSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : FSharpSymbolUse[] = symbolUses - |> Array.filter (fun (symbolUse: FSharpSymbolUse) -> - not symbolUse.IsFromDefinition //&& - //match symbolUse.Symbol with - //| :? FSharpEntity as e -> not e.IsNamespace - //| _ -> true - ) - |> Array.map (fun su -> - { SymbolUse = su - PossibleNamespaces = getPossibleNamespaces getSourceLineStr su }) + |> Array.filter (fun su -> not su.IsFromDefinition) + |> Array.filter (fun su -> + match su.Symbol with + | :? FSharpMemberOrFunctionOrValue as fv when fv.IsExtensionMember -> true + | _ -> + let partialName = QuickParse.GetPartialLongNameEx (getSourceLineStr su.RangeAlternate.StartLine, su.RangeAlternate.EndColumn - 1) + partialName.PartialIdent <> "" && partialName.QualifyingIdents = []) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = - let filter (openStatements: OpenStatement list) (symbolUses: SymbolUse[]) : OpenStatement list = + let filter (openStatements: OpenStatement list) (symbolUses: FSharpSymbolUse[]) : OpenStatement list = let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = let isUsed (openStatement: OpenStatement) = @@ -190,13 +91,13 @@ module UnusedOpens = let usedSomewhere = symbolUses |> Array.exists (fun symbolUse -> - let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.SymbolUse.RangeAlternate + let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.RangeAlternate if not inScope then false - elif openStatement.Idents |> Set.intersect symbolUse.PossibleNamespaces |> Set.isEmpty then false + //elif openStatement.Idents |> Set.intersect symbolUse.PossibleNamespaces |> Set.isEmpty then false else let moduleSymbols = openStatement.AllChildSymbols |> Seq.toList moduleSymbols - |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.SymbolUse.Symbol)) + |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)) if not usedSomewhere then false else @@ -219,8 +120,8 @@ module UnusedOpens = filterInner [] openStatements [] async { - let! fsharpSymbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() - let symbolUses = getSymbolUses getSourceLineStr fsharpSymbolUses + let! symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() + let symbolUses = filterSymbolUses getSourceLineStr symbolUses let openStatements = getOpenStatements checkFileResults.OpenDeclarations return filter openStatements symbolUses |> List.map (fun os -> os.Range) } \ No newline at end of file From d063ef8976c79b8e7e34602d274909dc864f3aae Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 20:37:29 +0300 Subject: [PATCH 032/150] active pattern cases work --- src/fsharp/NameResolution.fsi | 3 +++ src/fsharp/symbols/Symbols.fs | 8 ++++++++ src/fsharp/symbols/Symbols.fsi | 3 +++ src/fsharp/vs/ServiceAnalysis.fs | 5 ++++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 6bf3439f271..de72aed1165 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -22,6 +22,9 @@ type NameResolver = member amap : ImportMap member g : TcGlobals +/// Try to find a type with a record field of the given name +val ActivePatternElemsOfModuleOrNamespace : ModuleOrNamespaceRef -> NameMap + [] /// Represents the item with which a named argument is associated. type ArgumentContainer = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 11c57400db2..c0d05f22e63 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -619,6 +619,14 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = yield! walkParts parts ] res + member x.ActivePatternCases = + protect <| fun () -> + ActivePatternElemsOfModuleOrNamespace x.Entity + |> Map.toList + |> List.map (fun (_, apref) -> + let item = Item.ActivePatternCase apref + FSharpActivePatternCase(cenv, apref.ActivePatternInfo, apref.ActivePatternVal.Type, apref.CaseIndex, Some apref.ActivePatternVal, item)) + override x.Equals(other: obj) = box x === other || match other with diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index 674bcd77474..70b034768e2 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -330,6 +330,9 @@ and [] internal FSharpEntity = /// Get all compilation paths, taking `Module` suffixes into account. member AllCompilationPaths : string list + /// Get all active pattern cases defined in all active patterns in the module. + member ActivePatternCases : FSharpActivePatternCase list + /// Represents a delegate signature in an F# symbol #if COMPILER_PUBLIC_API and [] FSharpDelegateSignature = diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 00c93eccdb2..d9ef102be97 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -38,9 +38,12 @@ module UnusedOpens = if ent.IsFSharpModule && hasAttribute ent.Attributes then yield! getAllChildSymbolsInModule ent - + for fv in modul.MembersFunctionsAndValues do yield upcast fv + + for apCase in modul.ActivePatternCases do + yield upcast apCase } seq { for modul in this.Modules do From 961f0e9e546e5d7e6872c282145e8db2d8a2fbb9 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 20:51:51 +0300 Subject: [PATCH 033/150] active patterns work --- src/fsharp/vs/ServiceAnalysis.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index d9ef102be97..816eec4d8c4 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -81,7 +81,7 @@ module UnusedOpens = | :? FSharpMemberOrFunctionOrValue as fv when fv.IsExtensionMember -> true | _ -> let partialName = QuickParse.GetPartialLongNameEx (getSourceLineStr su.RangeAlternate.StartLine, su.RangeAlternate.EndColumn - 1) - partialName.PartialIdent <> "" && partialName.QualifyingIdents = []) + partialName.QualifyingIdents = []) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = From 05e7d2615246782ec3e2a23ada72810f7b56b67c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 22:38:41 +0300 Subject: [PATCH 034/150] symbol use for open declarations refactoring --- src/fsharp/NameResolution.fs | 11 +++++++++-- src/fsharp/NameResolution.fsi | 15 +++++++++++---- src/fsharp/TypeChecker.fs | 11 ++++++++--- src/fsharp/symbols/Symbols.fs | 8 ++++---- src/fsharp/symbols/Symbols.fsi | 15 +++++++++++---- src/fsharp/vs/ServiceAnalysis.fs | 19 ++++++++----------- src/fsharp/vs/service.fs | 10 +++++----- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 9ec1394b8c0..d8467437e5e 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1223,8 +1223,15 @@ type ItemOccurence = | RelatedText type OpenDeclaration = - | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * appliedScope: range - | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * appliedScope: range + { Idents: Ident list + ModuleRefs: ModuleOrNamespaceRef list + AppliedScope: range } + member this.Range = + match this.Idents with + | [] -> None + | first :: rest -> + let last = rest |> List.tryLast |> Option.defaultValue first + Some (mkRange this.AppliedScope.FileName first.idRange.Start last.idRange.End) /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index de72aed1165..2b83ba443ef 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -312,10 +312,17 @@ type internal TcSymbolUses = /// Represents open declaration statement. type internal OpenDeclaration = - /// Ordinary open declaration, i.e. one which opens a namespace or module. - | Open of longId: Ident list * moduleRefs: ModuleOrNamespaceRef list * appliedScope: range - /// Syntethic open declaration generated for auto open modules. - | AutoOpenModule of idents: string list * moduleRef: ModuleOrNamespaceRef * appliedScope: range + { /// Idents. + Idents: Ident list + + /// Modules or namespaces which is opened with this declaration. + ModuleRefs: ModuleOrNamespaceRef list + + /// Scope in which open declaration is visible. + AppliedScope: range } + + /// Range of the open declaration. + member Range : range option /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 421b252bda8..0ea9724e26f 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -447,6 +447,11 @@ let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs openDeclaration = ModifyNameResEnv (fun nenv -> AddModulesAndNamespacesContentsToNameEnv g amap env.eAccessRights scopem root nenv mvvs) env CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) CallOpenDeclarationSink tcSink openDeclaration + match openDeclaration.Range with + | None -> () + | Some range -> + let item = Item.ModuleOrNamespaces mvvs + CallNameResolutionSink tcSink (range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) env let AddRootModuleOrNamespaceRefs g amap m env modrefs = @@ -694,7 +699,7 @@ let ImplicitlyOpenOwnNamespace tcSink g amap scopem enclosingNamespacePath env = match ResolveLongIndentAsModuleOrNamespace ResultCollectionSettings.AllResults amap scopem OpenQualified env.eNameResEnv ad enclosingNamespacePathToOpen with | Result modrefs -> let modrefs = List.map p23 modrefs - OpenModulesOrNamespaces tcSink g amap scopem false env modrefs (OpenDeclaration.Open (enclosingNamespacePathToOpen, modrefs, scopem)) + OpenModulesOrNamespaces tcSink g amap scopem false env modrefs { Idents = enclosingNamespacePathToOpen; ModuleRefs = modrefs; AppliedScope = scopem } | Exception _ -> env @@ -12074,7 +12079,7 @@ let TcOpenDecl tcSink (g:TcGlobals) amap m scopem env (longId : Ident list) = let modrefs = List.map p23 modrefs modrefs |> List.iter (fun modref -> CheckEntityAttributes g modref m |> CommitOperationResult) - let env = OpenModulesOrNamespaces tcSink g amap scopem false env modrefs (OpenDeclaration.Open (longId, modrefs, scopem)) + let env = OpenModulesOrNamespaces tcSink g amap scopem false env modrefs { Idents = longId; ModuleRefs = modrefs; AppliedScope = scopem } env @@ -16839,7 +16844,7 @@ let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env let modref = mkNonLocalTyconRef (mkNonLocalEntityRef ccu (Array.ofList h)) t match modref.TryDeref with | VNone -> warn() - | VSome _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] (OpenDeclaration.AutoOpenModule (p, modref, scopem)) + | VSome _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] { Idents = []; ModuleRefs = [modref]; AppliedScope = scopem } // Add the CCU and apply the "AutoOpen" attributes let AddCcuToTcEnv(g, amap, scopem, env, assemblyName, ccu, autoOpens, internalsVisible) = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index c0d05f22e63..ffeda0ff415 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -2269,10 +2269,10 @@ type FSharpSymbol with /// Represents open declaration in F# code. type FSharpOpenDeclaration = - /// Ordinary open declaration, i.e. one which opens a namespace or module. - | Open of longId: Ident list * modules: FSharpEntity list * appliedScope: range - /// Syntethic open declaration generated for auto open modules. - | AutoOpenModule of idents: string list * modul: FSharpEntity * appliedScope: range + { LongId: Ident list + Range: range option + Modules: FSharpEntity list + AppliedScope: range } [] type FSharpSymbolUse(g:TcGlobals, denv: DisplayEnv, symbol:FSharpSymbol, itemOcc, range: range) = diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index 70b034768e2..bf41f0be7e2 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -1075,10 +1075,17 @@ type FSharpOpenDeclaration = #else type internal FSharpOpenDeclaration = #endif - /// Ordinary open declaration, i.e. one which opens a namespace or module. - | Open of longId: Ident list * modules: FSharpEntity list * appliedScope: range - /// Syntethic open declaration generated for auto open modules. - | AutoOpenModule of idents: string list * modul: FSharpEntity * appliedScope: range + { /// Idents. + LongId: Ident list + + /// Range of the open declaration. + Range: range option + + /// Modules or namespaces which is opened with this declaration. + Modules: FSharpEntity list + + /// Scope in which open declaration is visible. + AppliedScope: range } /// Represents the use of an F# symbol from F# source code [] diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 816eec4d8c4..d71eeb57df7 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -52,11 +52,11 @@ module UnusedOpens = let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations - |> List.choose (fun openDeclaration -> - match openDeclaration with - | FSharpOpenDeclaration.Open ((firstId :: _) as longId, modules, appliedScope) -> + |> List.choose (fun openDecl -> + match openDecl.LongId, openDecl.Range with + | firstId :: _, Some range -> Some { Idents = - modules + openDecl.Modules |> List.choose (fun x -> x.TryFullName |> Option.map (fun fullName -> x, fullName)) |> List.collect (fun (modul, fullName) -> [ yield fullName @@ -64,14 +64,11 @@ module UnusedOpens = yield fullName.[..fullName.Length - 7] // "Module" length plus zero index correction ]) |> Set.ofList - Modules = modules - Range = - let lastId = List.last longId - mkRange appliedScope.FileName firstId.idRange.Start lastId.idRange.End - AppliedScope = appliedScope + Modules = openDecl.Modules + Range = range + AppliedScope = openDecl.AppliedScope IsGlobal = firstId.idText = MangledGlobalName } - | _ -> None // for now - ) + | _ -> None) let filterSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : FSharpSymbolUse[] = symbolUses diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 668d6cdf551..31adbffb0dc 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -2036,11 +2036,11 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp scopeOptX |> Option.map (fun scope -> let cenv = Impl.cenv(scope.TcGlobals, scope.ThisCcu, scope.TcImports) - scope.OpenDeclarations |> List.map (function - | OpenDeclaration.Open (id, mods, appliedScope) -> - FSharpOpenDeclaration.Open(id, mods |> List.map (fun x -> FSharpEntity(cenv, x)), appliedScope) - | OpenDeclaration.AutoOpenModule (ids, modul, appliedScope) -> - FSharpOpenDeclaration.AutoOpenModule (ids, FSharpEntity(cenv, modul), appliedScope))) + scope.OpenDeclarations |> List.map (fun x -> + { LongId = x.Idents + Range = x.Range + Modules = x.ModuleRefs |> List.map (fun x -> FSharpEntity(cenv, x)) + AppliedScope = x.AppliedScope })) |> Option.defaultValue [] override info.ToString() = "FSharpCheckFileResults(" + filename + ")" From 5e1255bb48f4c273aeb38f5dbf68ad7d83669e29 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 23 Oct 2017 22:50:44 +0300 Subject: [PATCH 035/150] all tests pass except type in type extension --- src/fsharp/vs/ServiceAnalysis.fs | 39 ++++++------------- .../tests/unittests/UnusedOpensTests.fs | 2 +- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index d71eeb57df7..2fab32f5b19 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -11,10 +11,7 @@ module UnusedOpens = /// Represents single open statement. type OpenStatement = - { /// Full namespace or module identifier as it's presented in source code. - Idents: Set - /// Modules. - Modules: FSharpEntity list + { Modules: FSharpEntity list /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. @@ -23,8 +20,7 @@ module UnusedOpens = IsGlobal: bool } member this.AllChildSymbols = - let rec getAllChildSymbolsInModule (modul: FSharpEntity) = - seq { + seq { for modul in this.Modules do for ent in modul.NestedEntities do yield ent :> FSharpSymbol @@ -35,36 +31,26 @@ module UnusedOpens = if ent.IsFSharpUnion && not (hasAttribute ent.Attributes) then for unionCase in ent.UnionCases do yield upcast unionCase - - if ent.IsFSharpModule && hasAttribute ent.Attributes then - yield! getAllChildSymbolsInModule ent - + for fv in modul.MembersFunctionsAndValues do yield upcast fv for apCase in modul.ActivePatternCases do - yield upcast apCase - } - - seq { for modul in this.Modules do - yield! getAllChildSymbolsInModule modul + yield upcast apCase } |> Seq.cache + let rec getModuleAndItsAutoOpens (modul: FSharpEntity) = + [ yield modul + for ent in modul.NestedEntities do + if ent.IsFSharpModule && hasAttribute ent.Attributes then + yield! getModuleAndItsAutoOpens ent ] + let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations |> List.choose (fun openDecl -> match openDecl.LongId, openDecl.Range with | firstId :: _, Some range -> - Some { Idents = - openDecl.Modules - |> List.choose (fun x -> x.TryFullName |> Option.map (fun fullName -> x, fullName)) - |> List.collect (fun (modul, fullName) -> - [ yield fullName - if modul.HasFSharpModuleSuffix then - yield fullName.[..fullName.Length - 7] // "Module" length plus zero index correction - ]) - |> Set.ofList - Modules = openDecl.Modules + Some { Modules = openDecl.Modules |> List.collect getModuleAndItsAutoOpens Range = range AppliedScope = openDecl.AppliedScope IsGlobal = firstId.idText = MangledGlobalName } @@ -93,7 +79,6 @@ module UnusedOpens = |> Array.exists (fun symbolUse -> let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.RangeAlternate if not inScope then false - //elif openStatement.Idents |> Set.intersect symbolUse.PossibleNamespaces |> Set.isEmpty then false else let moduleSymbols = openStatement.AllChildSymbols |> Seq.toList moduleSymbols @@ -107,7 +92,7 @@ module UnusedOpens = // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) rangeContainsRange seenNs.AppliedScope openStatement.AppliedScope && - not (openStatement.Idents |> Set.intersect seenNs.Idents |> Set.isEmpty)) + openStatement.Modules |> List.exists (fun x -> seenNs.Modules |> List.exists (fun s -> s.IsEffectivelySameAs x))) not alreadySeen match openStatements with diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 03a950aacd9..5dbf0353bb8 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -184,7 +184,7 @@ open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 open NormalModule.AutoOpenModule1.NestedNormalModule let _ = Class() """ - => [ 12, (5, 68) ] + => [ 13, (5, 52) ] [] let ``open declaration is not marked as unused if there is a shortened attribute symbol from it``() = From c9b975e77f889f97fdb7a74c129fe297f5efa301 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 23 Oct 2017 21:51:28 -0700 Subject: [PATCH 036/150] install templates VSIX to a unique directory (#3804) --- .../Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index addf142025c..6fa0bbfbc68 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -35,7 +35,7 @@ true true CommonExtensions - Microsoft\FSharp + Microsoft\FSharpTemplates None Debug AnyCPU From 6085f0b59299d5c7eecd7756d7843f8b69df6033 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 10:11:31 +0300 Subject: [PATCH 037/150] consider definitions because they can be used at type extensions point --- src/fsharp/vs/ServiceAnalysis.fs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 2fab32f5b19..343687b0623 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -58,12 +58,16 @@ module UnusedOpens = let filterSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : FSharpSymbolUse[] = symbolUses - |> Array.filter (fun su -> not su.IsFromDefinition) |> Array.filter (fun su -> match su.Symbol with - | :? FSharpMemberOrFunctionOrValue as fv when fv.IsExtensionMember -> true + | :? FSharpMemberOrFunctionOrValue as fv when fv.IsExtensionMember -> + // extension members should be taken into account even though they have a prefix (as they do most of the time) + true | _ -> let partialName = QuickParse.GetPartialLongNameEx (getSourceLineStr su.RangeAlternate.StartLine, su.RangeAlternate.EndColumn - 1) + // for the rest of symbols we pick only those which are the first part of a long idend, because it's they which are + // conteined in opened namespaces / modules. For example, we pick `IO` from long ident `IO.File.OpenWrite` because + // it's `open System` which really brings it into scope. partialName.QualifyingIdents = []) let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = From e1467096ef2318892693ac3e5c97056b57e16b8d Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 10:30:38 +0300 Subject: [PATCH 038/150] remove unused code --- src/fsharp/symbols/SymbolPatterns.fs | 221 +----------------- src/fsharp/symbols/SymbolPatterns.fsi | 39 +--- src/fsharp/vs/ServiceAnalysis.fs | 16 +- src/fsharp/vs/ServiceAssemblyContent.fs | 59 +---- src/fsharp/vs/ServiceAssemblyContent.fsi | 8 +- .../vs/ServiceInterfaceStubGenerator.fs | 6 +- 6 files changed, 22 insertions(+), 327 deletions(-) diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index 68ab9cdbe63..855b281643c 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -209,223 +209,4 @@ module Symbol = if func.IsExtensionMember then Some() else None let (|Event|_|) (func: FSharpMemberOrFunctionOrValue) = - if func.IsEvent then Some () else None - -/// Active patterns over `FSharpSymbolUse`. -[] -module SymbolUse = - - let (|ActivePatternCase|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpActivePatternCase as ap -> ActivePatternCase(ap) |> Some - | _ -> None - - let private attributeSuffixLength = "Attribute".Length - - let (|Entity|_|) (symbol : FSharpSymbolUse) : (FSharpEntity * (* cleanFullNames *) string list) option = - match symbol.Symbol with - | :? FSharpEntity as ent -> - // strip generic parameters count suffix (List`1 => List) - let cleanFullName = - // `TryFullName` for type aliases is always `None`, so we have to make one by our own - if ent.IsFSharpAbbreviation then - [ent.AccessPath + "." + ent.DisplayName] - else - ent.TryFullName - |> Option.toList - |> List.map (fun fullName -> - if ent.GenericParameters.Count > 0 && fullName.Length > 2 then - fullName.[0..fullName.Length - 3] - else fullName) - - let cleanFullNames = - cleanFullName - |> List.collect (fun cleanFullName -> - if ent.IsAttributeType then - [cleanFullName; cleanFullName.[0..cleanFullName.Length - attributeSuffixLength - 1]] - else [cleanFullName] - ) - Some (ent, cleanFullNames) - | _ -> None - - let (|Field|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpField as field-> Some field - | _ -> None - - let (|GenericParameter|_|) (symbol: FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpGenericParameter as gp -> Some gp - | _ -> None - - let (|MemberFunctionOrValue|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpMemberOrFunctionOrValue as func -> Some func - | _ -> None - - let (|ActivePattern|_|) = function - | MemberFunctionOrValue m when m.IsActivePattern -> Some m | _ -> None - - let (|Parameter|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpParameter as param -> Some param - | _ -> None - - let (|StaticParameter|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpStaticParameter as sp -> Some sp - | _ -> None - - let (|UnionCase|_|) (symbol : FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpUnionCase as uc-> Some uc - | _ -> None - - let (|Constructor|_|) = function - | MemberFunctionOrValue func when func.IsConstructor || func.IsImplicitConstructor -> Some func - | _ -> None - - let (|TypeAbbreviation|_|) = function - | Entity (entity, _) when entity.IsFSharpAbbreviation -> Some entity - | _ -> None - - let (|Class|_|) = function - | Entity (entity, _) when entity.IsClass -> Some entity - | Entity (entity, _) when entity.IsFSharp && - entity.IsOpaque && - not entity.IsFSharpModule && - not entity.IsNamespace && - not entity.IsDelegate && - not entity.IsFSharpUnion && - not entity.IsFSharpRecord && - not entity.IsInterface && - not entity.IsValueType -> Some entity - | _ -> None - - let (|Delegate|_|) = function - | Entity (entity, _) when entity.IsDelegate -> Some entity - | _ -> None - - let (|Event|_|) = function - | MemberFunctionOrValue symbol when symbol.IsEvent -> Some symbol - | _ -> None - - let (|Property|_|) = function - | MemberFunctionOrValue symbol when symbol.IsProperty || symbol.IsPropertyGetterMethod || symbol.IsPropertySetterMethod -> Some symbol - | _ -> None - - let inline private notCtorOrProp (symbol:FSharpMemberOrFunctionOrValue) = - not symbol.IsConstructor && not symbol.IsPropertyGetterMethod && not symbol.IsPropertySetterMethod - - type FSharpSymbol with - member x.IsOperatorOrActivePattern = - let name = x.DisplayName - if name.StartsWith "( " && name.EndsWith " )" && name.Length > 4 - then name.Substring (2, name.Length - 4) |> String.forall (fun c -> c <> ' ') - else false - - type FSharpMemberOrFunctionOrValue with - member x.FullTypeSafe = try Some x.FullType with _ -> None - - let (|Method|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - symbol.IsModuleValueOrMember && - not symbolUse.IsFromPattern && - not symbol.IsOperatorOrActivePattern && - not symbol.IsPropertyGetterMethod && - not symbol.IsPropertySetterMethod -> Some symbol - | _ -> None - - let (|Function|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - symbol.IsModuleValueOrMember && - not symbol.IsOperatorOrActivePattern && - not symbolUse.IsFromPattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|Operator|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbolUse.IsFromPattern && - not symbol.IsActivePattern && - symbol.IsOperatorOrActivePattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|Pattern|_|) (symbolUse:FSharpSymbolUse) = - match symbolUse with - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern && - symbolUse.IsFromPattern -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|ClosureOrNestedFunction|_|) = function - | MemberFunctionOrValue symbol when - notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern && - not symbol.IsModuleValueOrMember -> - - match symbol.FullTypeSafe with - | Some fullType when fullType.IsFunctionType -> Some symbol - | _ -> None - | _ -> None - - let (|Val|_|) = function - | MemberFunctionOrValue symbol when notCtorOrProp symbol && - not symbol.IsOperatorOrActivePattern -> - match symbol.FullTypeSafe with - | Some _fullType -> Some symbol - | _ -> None - | _ -> None - - let (|Enum|_|) = function - | Entity (entity, _) when entity.IsEnum -> Some entity - | _ -> None - - let (|Interface|_|) = function - | Entity (entity, _) when entity.IsInterface -> Some entity - | _ -> None - - let (|Module|_|) = function - | Entity (entity, _) when entity.IsFSharpModule -> Some entity - | _ -> None - - let (|Namespace|_|) = function - | Entity (entity, _) when entity.IsNamespace -> Some entity - | _ -> None - - let (|Record|_|) = function - | Entity (entity, _) when entity.IsFSharpRecord -> Some entity - | _ -> None - - let (|Union|_|) = function - | Entity (entity, _) when entity.IsFSharpUnion -> Some entity - | _ -> None - - let (|ValueType|_|) = function - | Entity (entity, _) when entity.IsValueType && not entity.IsEnum -> Some entity - | _ -> None - - let (|ComputationExpression|_|) (symbol:FSharpSymbolUse) = - if symbol.IsFromComputationExpression then Some symbol - else None - - let (|Attribute|_|) = function - | Entity (entity, _) when entity.IsAttributeType -> Some entity - | _ -> None \ No newline at end of file + if func.IsEvent then Some () else None \ No newline at end of file diff --git a/src/fsharp/symbols/SymbolPatterns.fsi b/src/fsharp/symbols/SymbolPatterns.fsi index a7e4b6042e0..54773353b21 100644 --- a/src/fsharp/symbols/SymbolPatterns.fsi +++ b/src/fsharp/symbols/SymbolPatterns.fsi @@ -53,41 +53,4 @@ module internal Symbol = val (|Constructor|_|) : FSharpMemberOrFunctionOrValue -> FSharpEntity option val (|Function|_|) : excluded: bool -> FSharpMemberOrFunctionOrValue -> unit option val (|ExtensionMember|_|) : FSharpMemberOrFunctionOrValue -> unit option - val (|Event|_|) : FSharpMemberOrFunctionOrValue -> unit option - -[] -#if COMPILER_PUBLIC_API -module SymbolUse = -#else -module internal SymbolUse = -#endif - val (|ActivePatternCase|_|) : FSharpSymbolUse -> FSharpActivePatternCase option - val (|Entity|_|) : FSharpSymbolUse -> (FSharpEntity * (* cleanFullNames *) string list) option - val (|Field|_|) : FSharpSymbolUse -> FSharpField option - val (|GenericParameter|_|) : FSharpSymbolUse -> FSharpGenericParameter option - val (|MemberFunctionOrValue|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|ActivePattern|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Parameter|_|) : FSharpSymbolUse -> FSharpParameter option - val (|StaticParameter|_|) : FSharpSymbolUse -> FSharpStaticParameter option - val (|UnionCase|_|) : FSharpSymbolUse -> FSharpUnionCase option - val (|Constructor|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|TypeAbbreviation|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Class|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Delegate|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Event|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Property|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Method|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Function|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Operator|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Pattern|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|ClosureOrNestedFunction|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Val|_|) : FSharpSymbolUse -> FSharpMemberOrFunctionOrValue option - val (|Enum|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Interface|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Module|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Namespace|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Record|_|) : FSharpSymbolUse -> FSharpEntity option - val (|Union|_|) : FSharpSymbolUse -> FSharpEntity option - val (|ValueType|_|) : FSharpSymbolUse -> FSharpEntity option - val (|ComputationExpression|_|) : FSharpSymbolUse -> FSharpSymbolUse option - val (|Attribute|_|) : FSharpSymbolUse -> FSharpEntity option \ No newline at end of file + val (|Event|_|) : FSharpMemberOrFunctionOrValue -> unit option \ No newline at end of file diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 343687b0623..365a3930901 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -11,7 +11,8 @@ module UnusedOpens = /// Represents single open statement. type OpenStatement = - { Modules: FSharpEntity list + { /// All modules which this open declaration effectively opens, including all auto open ones, recursively. + Modules: FSharpEntity list /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. @@ -28,7 +29,7 @@ module UnusedOpens = for rf in ent.FSharpFields do yield upcast rf - if ent.IsFSharpUnion && not (hasAttribute ent.Attributes) then + if ent.IsFSharpUnion && not (Symbol.hasAttribute ent.Attributes) then for unionCase in ent.UnionCases do yield upcast unionCase @@ -42,7 +43,7 @@ module UnusedOpens = let rec getModuleAndItsAutoOpens (modul: FSharpEntity) = [ yield modul for ent in modul.NestedEntities do - if ent.IsFSharpModule && hasAttribute ent.Attributes then + if ent.IsFSharpModule && Symbol.hasAttribute ent.Attributes then yield! getModuleAndItsAutoOpens ent ] let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = @@ -72,7 +73,7 @@ module UnusedOpens = let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = - let filter (openStatements: OpenStatement list) (symbolUses: FSharpSymbolUse[]) : OpenStatement list = + let filterOpenStatements (openStatements: OpenStatement list) (symbolUses: FSharpSymbolUse[]) : OpenStatement list = let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = let isUsed (openStatement: OpenStatement) = @@ -84,9 +85,8 @@ module UnusedOpens = let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.RangeAlternate if not inScope then false else - let moduleSymbols = openStatement.AllChildSymbols |> Seq.toList - moduleSymbols - |> List.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)) + openStatement.AllChildSymbols + |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)) if not usedSomewhere then false else @@ -112,5 +112,5 @@ module UnusedOpens = let! symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile() let symbolUses = filterSymbolUses getSourceLineStr symbolUses let openStatements = getOpenStatements checkFileResults.OpenDeclarations - return filter openStatements symbolUses |> List.map (fun os -> os.Range) + return filterOpenStatements openStatements symbolUses |> List.map (fun os -> os.Range) } \ No newline at end of file diff --git a/src/fsharp/vs/ServiceAssemblyContent.fs b/src/fsharp/vs/ServiceAssemblyContent.fs index 414098d2166..38a29545c5c 100644 --- a/src/fsharp/vs/ServiceAssemblyContent.fs +++ b/src/fsharp/vs/ServiceAssemblyContent.fs @@ -97,37 +97,6 @@ module Extensions = type FSharpAssemblySignature with member x.TryGetEntities() = try x.Entities :> _ seq with _ -> Seq.empty -[] -module Utils = - let isAttribute<'T> (attribute: FSharpAttribute) = - // CompiledName throws exception on DataContractAttribute generated by SQLProvider - match (try Some attribute.AttributeType.CompiledName with _ -> None) with - | Some name when name = typeof<'T>.Name -> true - | _ -> false - - let hasAttribute<'T> (attributes: seq) = - attributes |> Seq.exists isAttribute<'T> - - let tryGetAttribute<'T> (attributes: seq) = - attributes |> Seq.tryFind isAttribute<'T> - - let hasModuleSuffixAttribute (entity: FSharpEntity) = - entity.Attributes - |> tryGetAttribute - |> Option.bind (fun a -> - try Some a.ConstructorArguments with _ -> None - |> Option.bind (fun args -> args |> Seq.tryPick (fun (_, arg) -> - let res = - match arg with - | :? int32 as arg when arg = int CompilationRepresentationFlags.ModuleSuffix -> - Some() - | :? CompilationRepresentationFlags as arg when arg = CompilationRepresentationFlags.ModuleSuffix -> - Some() - | _ -> - None - res))) - |> Option.isSome - [] type LookupType = | Fuzzy @@ -186,7 +155,7 @@ type Parent = else ident) let removeModuleSuffix (idents: Idents) = - if entity.IsFSharpModule && idents.Length > 0 && hasModuleSuffixAttribute entity then + if entity.IsFSharpModule && idents.Length > 0 && Symbol.hasModuleSuffixAttribute entity then let lastIdent = idents.[idents.Length - 1] if lastIdent.EndsWith "Module" then idents |> Array.replace (idents.Length - 1) (lastIdent.Substring(0, lastIdent.Length - 6)) @@ -202,18 +171,6 @@ type Parent = |> removeGenericParamsCount |> removeModuleSuffix)) -module TypedAstPatterns = - let (|TypeWithDefinition|_|) (ty: FSharpType) = - if ty.HasTypeDefinition then Some ty.TypeDefinition - else None - - let (|Attribute|_|) (entity: FSharpEntity) = - let isAttribute (entity: FSharpEntity) = - try entity.IsAttributeType with _ -> false - if isAttribute entity then Some() else None - - let (|FSharpModule|_|) (entity: FSharpEntity) = if entity.IsFSharpModule then Some() else None - type AssemblyContentCacheEntry = { FileWriteTime: DateTime ContentType: AssemblyContentType @@ -239,15 +196,15 @@ module AssemblyContentProvider = Symbol = entity Kind = fun lookupType -> match entity, lookupType with - | TypedAstPatterns.FSharpModule, _ -> + | Symbol.FSharpModule, _ -> EntityKind.Module - { IsAutoOpen = hasAttribute entity.Attributes - HasModuleSuffix = hasModuleSuffixAttribute entity } + { IsAutoOpen = Symbol.hasAttribute entity.Attributes + HasModuleSuffix = Symbol.hasModuleSuffixAttribute entity } | _, LookupType.Fuzzy -> EntityKind.Type | _, LookupType.Precise -> match entity with - | TypedAstPatterns.Attribute -> EntityKind.Attribute + | Symbol.Attribute -> EntityKind.Attribute | _ -> EntityKind.Type }) @@ -297,7 +254,7 @@ module AssemblyContentProvider = | None -> () let thisRequiresQualifierAccess = - if entity.IsFSharp && hasAttribute entity.Attributes then + if entity.IsFSharp && Symbol.hasAttribute entity.Attributes then parent.FormatEntityFullName entity |> Option.map snd else None @@ -305,7 +262,7 @@ module AssemblyContentProvider = { ThisRequiresQualifiedAccess = thisRequiresQualifierAccess |> Option.orElse parent.ThisRequiresQualifiedAccess TopRequiresQualifiedAccess = parent.TopRequiresQualifiedAccess |> Option.orElse thisRequiresQualifierAccess AutoOpen = - let isAutoOpen = entity.IsFSharpModule && hasAttribute entity.Attributes + let isAutoOpen = entity.IsFSharpModule && Symbol.hasAttribute entity.Attributes match isAutoOpen, parent.AutoOpen with // if parent is also AutoOpen, then keep the parent | true, Some parent -> Some parent @@ -315,7 +272,7 @@ module AssemblyContentProvider = | false, _ -> None WithModuleSuffix = - if entity.IsFSharpModule && hasModuleSuffixAttribute entity then + if entity.IsFSharpModule && Symbol.hasModuleSuffixAttribute entity then currentEntity |> Option.map (fun e -> e.CleanedIdents) else parent.WithModuleSuffix Namespace = ns } diff --git a/src/fsharp/vs/ServiceAssemblyContent.fsi b/src/fsharp/vs/ServiceAssemblyContent.fsi index c92c741cfbc..03e8ccfa81a 100644 --- a/src/fsharp/vs/ServiceAssemblyContent.fsi +++ b/src/fsharp/vs/ServiceAssemblyContent.fsi @@ -255,10 +255,4 @@ module internal Extensions = type FSharpAssemblySignature with /// Safe version of `Entities`. - member TryGetEntities : unit -> seq - -/// Operations over `FSharpAttribute`. -[] -module internal Utils = - /// Returns `true` if a collection of attributes contains one of given type. - val hasAttribute<'T> : attributes: seq -> bool + member TryGetEntities : unit -> seq \ No newline at end of file diff --git a/src/fsharp/vs/ServiceInterfaceStubGenerator.fs b/src/fsharp/vs/ServiceInterfaceStubGenerator.fs index e6ccfffbab3..4f62581f1bf 100644 --- a/src/fsharp/vs/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/vs/ServiceInterfaceStubGenerator.fs @@ -220,7 +220,7 @@ module internal InterfaceStubGenerator = let nm, namesWithIndices = normalizeArgName namesWithIndices nm // Detect an optional argument - let isOptionalArg = hasAttribute arg.Attributes + let isOptionalArg = Symbol.hasAttribute arg.Attributes let argName = if isOptionalArg then "?" + nm else nm (if hasTypeAnnotation && argName <> "()" then argName + ": " + formatType ctx arg.Type @@ -295,7 +295,7 @@ module internal InterfaceStubGenerator = else displayName let internal isEventMember (m: FSharpMemberOrFunctionOrValue) = - m.IsEvent || hasAttribute m.Attributes + m.IsEvent || Symbol.hasAttribute m.Attributes let internal formatMember (ctx: Context) m verboseMode = let getParamArgs (argInfos: FSharpParameter list list) (ctx: Context) (v: FSharpMemberOrFunctionOrValue) = @@ -325,7 +325,7 @@ module internal InterfaceStubGenerator = | _, true, _, name -> name + parArgs // Ordinary functions or values | false, _, _, name when - not (hasAttribute v.LogicalEnclosingEntity.Attributes) -> + not (Symbol.hasAttribute v.LogicalEnclosingEntity.Attributes) -> name + " " + parArgs // Ordinary static members or things (?) that require fully qualified access | _, _, _, name -> name + parArgs From bf6bd3f36f821cc6eba2bcd845248c41ebfd7ed1 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 11:20:06 +0300 Subject: [PATCH 039/150] properly handle own namespace opening --- src/fsharp/NameResolution.fs | 26 ++++++++++++------- src/fsharp/NameResolution.fsi | 22 ++++++++++------ src/fsharp/TypeChecker.fs | 10 ++++--- src/fsharp/symbols/Symbols.fs | 3 ++- src/fsharp/symbols/Symbols.fsi | 5 +++- src/fsharp/vs/ServiceAnalysis.fs | 1 + src/fsharp/vs/service.fs | 8 +++--- .../Diagnostics/UnusedDeclarationsAnalyzer.fs | 2 +- .../tests/unittests/UnusedOpensTests.fs | 8 ++++++ 9 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index d8467437e5e..7150c4d99d3 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1223,15 +1223,23 @@ type ItemOccurence = | RelatedText type OpenDeclaration = - { Idents: Ident list - ModuleRefs: ModuleOrNamespaceRef list - AppliedScope: range } - member this.Range = - match this.Idents with - | [] -> None - | first :: rest -> - let last = rest |> List.tryLast |> Option.defaultValue first - Some (mkRange this.AppliedScope.FileName first.idRange.Start last.idRange.End) + { LongId: Ident list + Range: range option + Modules: ModuleOrNamespaceRef list + AppliedScope: range + IsOwnNamespace: bool } + + static member Create(longId: Ident list, modules: ModuleOrNamespaceRef list, appliedScope: range, isOwnNamespace: bool) = + { LongId = longId + Range = + match longId with + | [] -> None + | first :: rest -> + let last = rest |> List.tryLast |> Option.defaultValue first + Some (mkRange appliedScope.FileName first.idRange.Start last.idRange.End) + Modules = modules + AppliedScope = appliedScope + IsOwnNamespace = isOwnNamespace } /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 2b83ba443ef..93f0009ff8b 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -22,7 +22,7 @@ type NameResolver = member amap : ImportMap member g : TcGlobals -/// Try to find a type with a record field of the given name +/// Get the active pattern elements defined in a module, if any. Cache in the slot in the module type. val ActivePatternElemsOfModuleOrNamespace : ModuleOrNamespaceRef -> NameMap [] @@ -312,18 +312,24 @@ type internal TcSymbolUses = /// Represents open declaration statement. type internal OpenDeclaration = - { /// Idents. - Idents: Ident list + { /// Long identifier as it's presented in soruce code. + LongId: Ident list + /// Full range of the open declaration. + Range : range option + /// Modules or namespaces which is opened with this declaration. - ModuleRefs: ModuleOrNamespaceRef list + Modules: ModuleOrNamespaceRef list /// Scope in which open declaration is visible. - AppliedScope: range } + AppliedScope: range + + /// If it's `namespace Xxx.Yyy` declaration. + IsOwnNamespace: bool } + + /// Create a new instance of OpenDeclaration. + static member Create : longId: Ident list * modules: ModuleOrNamespaceRef list * appliedScope: range * isOwnNamespace: bool -> OpenDeclaration - /// Range of the open declaration. - member Range : range option - /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 0ea9724e26f..819b73ed76a 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -699,7 +699,8 @@ let ImplicitlyOpenOwnNamespace tcSink g amap scopem enclosingNamespacePath env = match ResolveLongIndentAsModuleOrNamespace ResultCollectionSettings.AllResults amap scopem OpenQualified env.eNameResEnv ad enclosingNamespacePathToOpen with | Result modrefs -> let modrefs = List.map p23 modrefs - OpenModulesOrNamespaces tcSink g amap scopem false env modrefs { Idents = enclosingNamespacePathToOpen; ModuleRefs = modrefs; AppliedScope = scopem } + let openDecl = OpenDeclaration.Create (enclosingNamespacePathToOpen, modrefs, scopem, true) + OpenModulesOrNamespaces tcSink g amap scopem false env modrefs openDecl | Exception _ -> env @@ -12079,7 +12080,8 @@ let TcOpenDecl tcSink (g:TcGlobals) amap m scopem env (longId : Ident list) = let modrefs = List.map p23 modrefs modrefs |> List.iter (fun modref -> CheckEntityAttributes g modref m |> CommitOperationResult) - let env = OpenModulesOrNamespaces tcSink g amap scopem false env modrefs { Idents = longId; ModuleRefs = modrefs; AppliedScope = scopem } + let openDecl = OpenDeclaration.Create (longId, modrefs, scopem, false) + let env = OpenModulesOrNamespaces tcSink g amap scopem false env modrefs openDecl env @@ -16844,7 +16846,9 @@ let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env let modref = mkNonLocalTyconRef (mkNonLocalEntityRef ccu (Array.ofList h)) t match modref.TryDeref with | VNone -> warn() - | VSome _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] { Idents = []; ModuleRefs = [modref]; AppliedScope = scopem } + | VSome _ -> + let openDecl = OpenDeclaration.Create ([], [modref], scopem, false) + OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] openDecl // Add the CCU and apply the "AutoOpen" attributes let AddCcuToTcEnv(g, amap, scopem, env, assemblyName, ccu, autoOpens, internalsVisible) = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index ffeda0ff415..be05ab2c290 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -2272,7 +2272,8 @@ type FSharpOpenDeclaration = { LongId: Ident list Range: range option Modules: FSharpEntity list - AppliedScope: range } + AppliedScope: range + IsOwnNamespace: bool } [] type FSharpSymbolUse(g:TcGlobals, denv: DisplayEnv, symbol:FSharpSymbol, itemOcc, range: range) = diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index bf41f0be7e2..e01c3d99422 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -1085,7 +1085,10 @@ type internal FSharpOpenDeclaration = Modules: FSharpEntity list /// Scope in which open declaration is visible. - AppliedScope: range } + AppliedScope: range + + /// If it's `namespace Xxx.Yyy` declaration. + IsOwnNamespace: bool } /// Represents the use of an F# symbol from F# source code [] diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 365a3930901..27f97824c8d 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -48,6 +48,7 @@ module UnusedOpens = let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations + |> List.filter (fun x -> not x.IsOwnNamespace) |> List.choose (fun openDecl -> match openDecl.LongId, openDecl.Range with | firstId :: _, Some range -> diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 31adbffb0dc..d8ef04dd885 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -2037,10 +2037,12 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp |> Option.map (fun scope -> let cenv = Impl.cenv(scope.TcGlobals, scope.ThisCcu, scope.TcImports) scope.OpenDeclarations |> List.map (fun x -> - { LongId = x.Idents + { LongId = x.LongId Range = x.Range - Modules = x.ModuleRefs |> List.map (fun x -> FSharpEntity(cenv, x)) - AppliedScope = x.AppliedScope })) + Modules = x.Modules |> List.map (fun x -> FSharpEntity(cenv, x)) + AppliedScope = x.AppliedScope + IsOwnNamespace = x.IsOwnNamespace } + : FSharpOpenDeclaration )) |> Option.defaultValue [] override info.ToString() = "FSharpCheckFileResults(" + filename + ")" diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedDeclarationsAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedDeclarationsAnalyzer.fs index cb541cac322..071f0aadbe1 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedDeclarationsAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedDeclarationsAnalyzer.fs @@ -35,7 +35,7 @@ type internal UnusedDeclarationsAnalyzer() = match symbol with // Determining that a record, DU or module is used anywhere requires inspecting all their enclosed entities (fields, cases and func / vals) // for usages, which is too expensive to do. Hence we never gray them out. - | :? FSharpEntity as e when e.IsFSharpRecord || e.IsFSharpUnion || e.IsInterface || e.IsFSharpModule || e.IsClass -> false + | :? FSharpEntity as e when e.IsFSharpRecord || e.IsFSharpUnion || e.IsInterface || e.IsFSharpModule || e.IsClass || e.IsNamespace -> false // FCS returns inconsistent results for override members; we're skipping these symbols. | :? FSharpMemberOrFunctionOrValue as f when f.IsOverrideOrExplicitInterfaceImplementation || diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 5dbf0353bb8..0df0e16c157 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -649,3 +649,11 @@ open System let f (x: 'a when 'a :> IDisposable) = () """ => [] + +[] +let ``namespace declaration should never be marked as unused``() = + """ +namespace Library2 +type T() = class end +""" + => [] From 69600623b4d6910b2466f4d6faca0094c6308570 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 12:48:01 +0300 Subject: [PATCH 040/150] fix tests --- tests/service/CSharpProjectAnalysis.fs | 2 +- tests/service/EditorTests.fs | 3 ++- tests/service/ProjectAnalysisTests.fs | 16 +++++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs index 188d733cd18..7acf06c7111 100644 --- a/tests/service/CSharpProjectAnalysis.fs +++ b/tests/service/CSharpProjectAnalysis.fs @@ -111,7 +111,7 @@ let _ = CSharpOuterClass.InnerClass.StaticMember() |> Async.RunSynchronously |> Array.map (fun su -> su.Symbol.ToString()) |> shouldEqual - [|"InnerEnum"; "CSharpOuterClass"; "field Case1"; "InnerClass"; + [|"Tests"; "InnerEnum"; "CSharpOuterClass"; "field Case1"; "InnerClass"; "CSharpOuterClass"; "member StaticMember"; "NestedEnumClass"|] [] diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index e935737511e..3696dabdf63 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -634,7 +634,8 @@ let _ = let r = su.RangeAlternate su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) |> shouldEqual - [|("ConsoleKey", (5, 10, 5, 20)) + [|("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)) diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index c09d8d4ca15..2477763aa40 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -368,10 +368,11 @@ let ``Test project1 all uses of all signature symbols`` () = ("field DisableFormatting", [("file2", ((28, 4), (28, 21))); ("file2", ((30, 16), (30, 45)))]); ("M", - [("file1", ((1, 7), (1, 8))); ("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)))]); + [("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))); @@ -420,6 +421,7 @@ let ``Test project1 all uses of all symbols`` () = ("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"]); @@ -3686,7 +3688,8 @@ let ``Test Project25 symbol uses of type-provided members`` () = allUses |> shouldEqual - [|("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), + [|("FSharp.Data", "file1", ((3, 5), (3, 16)), ["namespace"; "provided"]); + ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), ["class"; "provided"; "erased"]); ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), ["class"; "provided"; "erased"]); @@ -3710,8 +3713,7 @@ let ``Test Project25 symbol uses of type-provided members`` () = ("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"])|] + ["member"]); ("TypeProviderTests", "file1", ((2, 7), (2, 24)), ["module"])|] let getSampleSymbolUseOpt = backgroundTypedParse1.GetSymbolUseAtLocation(5,25,"",["GetSample"]) |> Async.RunSynchronously From e55de7e729a4793d3943f48ba8b8b111ff76e78b Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 13:02:09 +0300 Subject: [PATCH 041/150] revert FSharpEntity.TryFullName for namespaces remove commented code --- src/fsharp/symbols/Symbols.fs | 2 +- vsintegration/tests/unittests/UnusedOpensTests.fs | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index be05ab2c290..dd6c04451b4 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -310,7 +310,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = #else elif entity.IsTypeAbbrev then None #endif - elif entity.IsNamespace then Some (entity.ToString()) + elif entity.IsNamespace then Some entity.DemangledModuleOrNamespaceName else match entity.CompiledRepresentation with | CompiledTypeRepr.ILAsmNamed(tref, _, _) -> Some tref.FullName diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 0df0e16c157..2f8066b7b4e 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -136,7 +136,6 @@ module M2 = => [] [] -//[] let ``open a nested module inside another one is not unused, complex hierarchy``() = """ module Top = @@ -151,7 +150,6 @@ module Top = => [] [] -//[] let ``open a nested module inside another one is not unused, even more complex hierarchy``() = """ module Top = @@ -275,7 +273,6 @@ let _ = DateTime.ExtensionMethod => [] [] -//[] let ``static extension property applied to a type results that both namespaces /where the type is declared and where the extension is declared/ is not marked as unused``() = """ module Extensions = @@ -324,7 +321,6 @@ let _ = func() => [] [] -//[] let ``open module all of which symbols are used by qualifier is marked as unused``() = """ module M = @@ -379,7 +375,6 @@ let _ = Func(fun _ -> 1) => [] [] -//[] let ``open declaration is not marked as unused if a unit of measure defined in it is used``() = """ module M = @@ -421,7 +416,6 @@ File.ReadAllLines "" => [] [] -//[] let ``redundant opening a module with ModuleSuffix attribute value is marks as unused``() = """ [] @@ -434,7 +428,6 @@ module M = => [ 6, (9, 33) ] [] -//[] let ``redundant opening a module is marks as unused``() = """ module InternalModuleWithSuffix = @@ -576,7 +569,6 @@ module Module = => [] [] -//[] let ``record fields should be taken into account``() = """ module M1 = From b561754bb34dcf405ff990e7ac516da1306215a9 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 16:47:14 +0300 Subject: [PATCH 042/150] fixed: opening nested auto open module makes outer module as unused --- src/fsharp/vs/ServiceAnalysis.fs | 23 +++++++++++++------ .../tests/unittests/UnusedOpensTests.fs | 21 ++++++++++++++--- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 27f97824c8d..0502a63f4c3 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -9,10 +9,14 @@ open Microsoft.FSharp.Compiler.Range module UnusedOpens = open Microsoft.FSharp.Compiler.PrettyNaming + type Module = + { Entity: FSharpEntity + IsNestedAutoOpen: bool } + /// Represents single open statement. type OpenStatement = { /// All modules which this open declaration effectively opens, including all auto open ones, recursively. - Modules: FSharpEntity list + Modules: Module list /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. @@ -21,7 +25,7 @@ module UnusedOpens = IsGlobal: bool } member this.AllChildSymbols = - seq { for modul in this.Modules do + seq { for modul in this.Modules |> List.map (fun x -> x.Entity) do for ent in modul.NestedEntities do yield ent :> FSharpSymbol @@ -40,11 +44,11 @@ module UnusedOpens = yield upcast apCase } |> Seq.cache - let rec getModuleAndItsAutoOpens (modul: FSharpEntity) = - [ yield modul + let rec getModuleAndItsAutoOpens (isNestedAutoOpen: bool) (modul: FSharpEntity) = + [ yield { Entity = modul; IsNestedAutoOpen = isNestedAutoOpen } for ent in modul.NestedEntities do if ent.IsFSharpModule && Symbol.hasAttribute ent.Attributes then - yield! getModuleAndItsAutoOpens ent ] + yield! getModuleAndItsAutoOpens true ent ] let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations @@ -52,7 +56,7 @@ module UnusedOpens = |> List.choose (fun openDecl -> match openDecl.LongId, openDecl.Range with | firstId :: _, Some range -> - Some { Modules = openDecl.Modules |> List.collect getModuleAndItsAutoOpens + Some { Modules = openDecl.Modules |> List.collect (getModuleAndItsAutoOpens false) Range = range AppliedScope = openDecl.AppliedScope IsGlobal = firstId.idText = MangledGlobalName } @@ -97,7 +101,12 @@ module UnusedOpens = // if such open statement has already been marked as used in this or outer module, we skip it // (that is, do not mark as used so far) rangeContainsRange seenNs.AppliedScope openStatement.AppliedScope && - openStatement.Modules |> List.exists (fun x -> seenNs.Modules |> List.exists (fun s -> s.IsEffectivelySameAs x))) + openStatement.Modules + |> List.exists (fun x -> + // do not check if any of auto open nested modules has already been seen, + // current open statement should be seen itself or as an auto open module of its outer module. + not x.IsNestedAutoOpen && + seenNs.Modules |> List.exists (fun s -> s.Entity.IsEffectivelySameAs x.Entity))) not alreadySeen match openStatements with diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 2f8066b7b4e..946ab5da9d8 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -166,7 +166,7 @@ module Top = => [] [] -let ``last of several equivalent open declarations is market as used, the rest of them are marked as unused``() = +let ``opening auto open module after it's parent module was opened should be marked as unused``() = """ module NormalModule = [] @@ -178,11 +178,11 @@ module NormalModule = module AutoOpenModule3 = type Class() = class end -open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 open NormalModule.AutoOpenModule1.NestedNormalModule +open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 let _ = Class() """ - => [ 13, (5, 52) ] + => [ 13, (5, 68) ] [] let ``open declaration is not marked as unused if there is a shortened attribute symbol from it``() = @@ -649,3 +649,18 @@ namespace Library2 type T() = class end """ => [] + +[] +let ``auto open module opened before enclosing one is handled correctly``() = + """ +module M = + let x = 1 + [] + module N = + let y = 2 +open M.N +open M +let _ = x +let _ = y +""" + => [] From 0366ad18b61d9ae5bb939a590ebc31cd0a72c17f Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 16:48:58 +0300 Subject: [PATCH 043/150] remove logging --- .../Diagnostics/UnusedOpensDiagnosticAnalyzer.fs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 4430f355b30..10b266d2735 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -43,10 +43,6 @@ type internal UnusedOpensDiagnosticAnalyzer() = do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) - let openDeclarations = checkResults.OpenDeclarations - - Logging.Logging.logInfof "*** OpenDeclarations: %+A" openDeclarations - return! UnusedOpens.getUnusedOpens(checkResults, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) |> liftAsync } From 2f9e8dbf4b490c8615367bbe2592da79c23dc595 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 24 Oct 2017 10:27:02 -0700 Subject: [PATCH 044/150] P2p references (#3777) * P2p references * Fix test * test fix * go faster stripes * new project works better * Re-add debug assert for sourcefiles --- src/fsharp/vs/service.fs | 16 +- .../Classification/ColorizationService.fs | 2 +- .../Diagnostics/DocumentDiagnosticAnalyzer.fs | 2 +- .../LanguageService/LanguageService.fs | 225 +++++-------- .../LanguageService/SymbolHelpers.fs | 2 +- .../Navigation/FindUsagesService.fs | 4 +- .../Navigation/NavigateToSearchService.fs | 4 +- .../QuickInfo/QuickInfoProvider.fs | 2 +- .../BackgroundRequests.fs | 8 +- .../FSharp.LanguageService/IProjectSite.fs | 6 +- .../ProjectSitesAndFiles.fs | 297 +++++++++++++----- .../Salsa/FSharpLanguageServiceTestable.fs | 5 +- .../tests/Salsa/VisualFSharp.Salsa.fsproj | 4 + 13 files changed, 333 insertions(+), 244 deletions(-) diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 5c2fc8f5445..144f17838db 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -1396,7 +1396,7 @@ type FSharpParsingOptions = } static member FromTcConfigBuidler(tcConfigB: TcConfigBuilder, sourceFiles) = - { + { SourceFiles = sourceFiles ConditionalCompilationDefines = tcConfigB.conditionalCompilationDefines ErrorSeverityOptions = tcConfigB.errorSeverityOptions @@ -1724,7 +1724,7 @@ type FSharpProjectOptions = member x.ProjectOptions = x.OtherOptions /// Whether the two parse options refer to the same project. static member UseSameProjectFileName(options1,options2) = - options1.ProjectFileName = options2.ProjectFileName + options1.ProjectFileName = options2.ProjectFileName /// Compare two options sets with respect to the parts of the options that are important to building. static member AreSameForChecking(options1,options2) = @@ -1737,7 +1737,9 @@ type FSharpProjectOptions = options1.UnresolvedReferences = options2.UnresolvedReferences && options1.OriginalLoadReferences = options2.OriginalLoadReferences && options1.ReferencedProjects.Length = options2.ReferencedProjects.Length && - Array.forall2 (fun (n1,a) (n2,b) -> n1 = n2 && FSharpProjectOptions.AreSameForChecking(a,b)) options1.ReferencedProjects options2.ReferencedProjects && + Array.forall2 (fun (n1,a) (n2,b) -> + n1 = n2 && + FSharpProjectOptions.AreSameForChecking(a,b)) options1.ReferencedProjects options2.ReferencedProjects && options1.LoadTime = options2.LoadTime /// Compute the project directory. @@ -2043,11 +2045,11 @@ module Helpers = // Look for DLLs in the location of the service DLL first. let defaultFSharpBinariesDir = FSharpEnvironment.BinFolderOfDefaultFSharpCompiler(Some(typeof.Assembly.Location)).Value - + /// Determine whether two (fileName,options) keys are identical w.r.t. affect on checking - let AreSameForChecking2((fileName1: string, options1: FSharpProjectOptions), (fileName2, o2)) = + let AreSameForChecking2((fileName1: string, options1: FSharpProjectOptions), (fileName2, options2)) = (fileName1 = fileName2) - && FSharpProjectOptions.AreSameForChecking(options1,o2) + && FSharpProjectOptions.AreSameForChecking(options1,options2) /// Determine whether two (fileName,options) keys should be identical w.r.t. resource usage let AreSubsumable2((fileName1:string,o1:FSharpProjectOptions),(fileName2:string,o2:FSharpProjectOptions)) = @@ -2711,7 +2713,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC member bc.InvalidateConfiguration(options : FSharpProjectOptions, startBackgroundCompileIfAlreadySeen, userOpName) = let startBackgroundCompileIfAlreadySeen = defaultArg startBackgroundCompileIfAlreadySeen implicitlyStartBackgroundWork // This operation can't currently be cancelled nor awaited - reactor.EnqueueOp(userOpName, "InvalidateConfiguration", options.ProjectFileName, fun ctok -> + reactor.EnqueueOp(userOpName, "InvalidateConfiguration: Stamp(" + (options.Stamp |> Option.defaultValue 0L).ToString() + ")", options.ProjectFileName, fun ctok -> // If there was a similar entry then re-establish an empty builder . This is a somewhat arbitrary choice - it // will have the effect of releasing memory associated with the previous builder, but costs some time. if incrementalBuildersCache.ContainsSimilarKey (ctok, options) then diff --git a/vsintegration/src/FSharp.Editor/Classification/ColorizationService.fs b/vsintegration/src/FSharp.Editor/Classification/ColorizationService.fs index b60ee3b9bcc..c3b199d4be3 100644 --- a/vsintegration/src/FSharp.Editor/Classification/ColorizationService.fs +++ b/vsintegration/src/FSharp.Editor/Classification/ColorizationService.fs @@ -40,7 +40,7 @@ type internal FSharpColorizationService asyncMaybe { do Trace.TraceInformation("{0:n3} (start) SemanticColorization", DateTime.Now.TimeOfDay.TotalSeconds) do! Async.Sleep DefaultTuning.SemanticColorizationInitialDelay |> liftAsync // be less intrusive, give other work priority most of the time - let! _parsingOptions, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) + let! _, _, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) let! sourceText = document.GetTextAsync(cancellationToken) let! _, _, checkResults = checkerProvider.Checker.ParseAndCheckDocument(document, projectOptions, sourceText = sourceText, allowStaleResults = false, userOpName=userOpName) // it's crucial to not return duplicated or overlapping `ClassifiedSpan`s because Find Usages service crashes. diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/DocumentDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/DocumentDiagnosticAnalyzer.fs index ffcf5c6ef83..5b8b1744aeb 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/DocumentDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/DocumentDiagnosticAnalyzer.fs @@ -122,7 +122,7 @@ type internal FSharpDocumentDiagnosticAnalyzer() = override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken): Task> = let projectInfoManager = getProjectInfoManager document asyncMaybe { - let! parsingOptions, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) + let! parsingOptions, _, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) let! sourceText = document.GetTextAsync(cancellationToken) let! textVersion = document.GetTextVersionAsync(cancellationToken) return! diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 5c86684d87a..8055202d252 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -18,7 +18,7 @@ open System.Threading open Microsoft.FSharp.Compiler.CompileOps open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library +open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.Diagnostics @@ -61,21 +61,21 @@ type internal FSharpCheckerProvider // When the F# background builder refreshes the background semantic build context for a file, // we request Roslyn to reanalyze that individual file. checker.BeforeBackgroundFileCheck.Add(fun (fileName, extraProjectInfo) -> - async { - try - match extraProjectInfo with - | Some (:? Workspace as workspace) -> - let solution = workspace.CurrentSolution - let documentIds = solution.GetDocumentIdsWithFilePath(fileName) - if not documentIds.IsEmpty then - let docuentIdsFiltered = documentIds |> Seq.filter workspace.IsDocumentOpen |> Seq.toArray - for documentId in docuentIdsFiltered do - Trace.TraceInformation("{0:n3} Requesting Roslyn reanalysis of {1}", DateTime.Now.TimeOfDay.TotalSeconds, documentId) - if docuentIdsFiltered.Length > 0 then - analyzerService.Reanalyze(workspace,documentIds=docuentIdsFiltered) - | _ -> () - with ex -> - Assert.Exception(ex) + async { + try + match extraProjectInfo with + | Some (:? Workspace as workspace) -> + let solution = workspace.CurrentSolution + let documentIds = solution.GetDocumentIdsWithFilePath(fileName) + if not documentIds.IsEmpty then + let documentIdsFiltered = documentIds |> Seq.filter workspace.IsDocumentOpen |> Seq.toArray + for documentId in documentIdsFiltered do + Trace.TraceInformation("{0:n3} Requesting Roslyn reanalysis of {1}", DateTime.Now.TimeOfDay.TotalSeconds, documentId) + if documentIdsFiltered.Length > 0 then + analyzerService.Reanalyze(workspace,documentIds=documentIdsFiltered) + | _ -> () + with ex -> + Assert.Exception(ex) } |> Async.StartImmediate ) checker @@ -83,9 +83,6 @@ type internal FSharpCheckerProvider member this.Checker = checker.Value -/// A value and a function to recompute/refresh the value. The function is passed a flag indicating if a refresh is happening. -type Refreshable<'T> = 'T * (bool -> 'T) - /// Exposes FCS FSharpProjectOptions information management as MEF component. // // This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. @@ -101,49 +98,31 @@ type internal FSharpProjectOptionsManager ) = // A table of information about projects, excluding single-file projects. - let projectTable = ConcurrentDictionary>() + let projectOptionsTable = FSharpProjectOptionsTable() // A table of information about single-file projects. Currently we only need the load time of each such file, plus // the original options for editing let singleFileProjectTable = ConcurrentDictionary() - // Accumulate sources and references for each project file - let projectInfo = new ConcurrentDictionary() - - let projectDisplayNameOf projectFileName = - if String.IsNullOrWhiteSpace projectFileName then projectFileName - else Path.GetFileNameWithoutExtension projectFileName - - let tryGetOrCreateProjectId (projectFileName: string) = + let tryGetOrCreateProjectId (projectFileName:string) = let projectDisplayName = projectDisplayNameOf projectFileName Some (workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)) + /// Retrieve the projectOptionsTable + member __.FSharpOptions = projectOptionsTable + /// Clear a project from the project table - member this.ClearInfoForProject(projectId: ProjectId) = - projectTable.TryRemove(projectId) |> ignore - this.RefreshInfoForProjectsThatReferenceThisProject(projectId) + member this.ClearInfoForProject(projectId:ProjectId) = projectOptionsTable.ClearInfoForProject(projectId) member this.ClearInfoForSingleFileProject(projectId) = singleFileProjectTable.TryRemove(projectId) |> ignore - member this.RefreshInfoForProjectsThatReferenceThisProject(projectId: ProjectId) = - // Search the projectTable for things to refresh - for KeyValue(otherProjectId, ((referencedProjectIds, _parsingOptions, _options), refresh)) in projectTable.ToArray() do - for referencedProjectId in referencedProjectIds do - if referencedProjectId = projectId then - projectTable.[otherProjectId] <- (refresh true, refresh) - - member this.AddOrUpdateProject(projectId, refresh) = - projectTable.[projectId] <- (refresh false, refresh) - this.RefreshInfoForProjectsThatReferenceThisProject(projectId) - - member this.AddOrUpdateSingleFileProject(projectId, data) = - singleFileProjectTable.[projectId] <- data + member this.AddOrUpdateSingleFileProject(projectId, data) = singleFileProjectTable.[projectId] <- data /// Get the exact options for a single-file script member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents, workspace: Workspace) = async { let extraProjectInfo = Some(box workspace) - let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map snd + let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) if SourceFile.MustBeSingleFileProject(fileName) then // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. // This is because we repeatedly recompute the options. @@ -153,48 +132,44 @@ type internal FSharpProjectOptionsManager // compiled and #r will refer to files on disk let referencedProjectFileNames = [| |] let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable, true) let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) return (deps, parsingOptions, projectOptions) else let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable, true) let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) return (deps, parsingOptions, projectOptions) } /// Update the info for a project in the project table - member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId: ProjectId, site: IProjectSite, userOpName) = - this.AddOrUpdateProject(projectId, (fun isRefresh -> + member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, site, userOpName) = + projectOptionsTable.AddOrUpdateProject(projectId, (fun isRefresh -> let extraProjectInfo = Some(box workspace) - let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map snd - let referencedProjects, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName, extraProjectInfo, serviceProvider, true) + let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) + let referencedProjects, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId (site.ProjectFileName)), site.ProjectFileName, extraProjectInfo, Some projectOptionsTable, true) + checkerProvider.Checker.InvalidateConfiguration(projectOptions, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName = userOpName + ".UpdateProjectInfo") let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId - checkerProvider.Checker.InvalidateConfiguration(projectOptions, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName= userOpName + ".UpdateProjectInfo") let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - referencedProjectIds, parsingOptions, projectOptions)) - + referencedProjectIds, parsingOptions, Some site, projectOptions)) + /// Get compilation defines relevant for syntax processing. /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project /// options for a script. - member this.GetCompilationDefinesForEditingDocument(document: Document) = + member this.GetCompilationDefinesForEditingDocument(document:Document) = let projectOptionsOpt = this.TryGetOptionsForProject(document.Project.Id) let parsingOptions = match projectOptionsOpt with - | None -> FSharpParsingOptions.Default - | Some (parsingOptions, _projectOptions) -> parsingOptions + | Some (parsingOptions, _site, _projectOptions) -> parsingOptions + | _ -> FSharpParsingOptions.Default CompilerEnvironment.GetCompilationDefinesForEditing(document.Name, parsingOptions) - /// Get the options for a project - member this.TryGetOptionsForProject(projectId: ProjectId) = - match projectTable.TryGetValue(projectId) with - | true, ((_referencedProjects, parsingOptions, projectOptions), _) -> Some (parsingOptions, projectOptions) - | _ -> None + member this.TryGetOptionsForProject(projectId:ProjectId) = projectOptionsTable.TryGetOptionsForProject(projectId) /// Get the exact options for a document or project member this.TryGetOptionsForDocumentOrProject(document: Document) = async { let projectId = document.Project.Id - + // The options for a single-file script project are re-requested each time the file is analyzed. This is because the // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. @@ -209,89 +184,42 @@ type internal FSharpProjectOptionsManager let tryGetOrCreateProjectId _ = None let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString(), document.Project.Solution.Workspace) this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) - return Some (parsingOptions, projectOptions) + return Some (parsingOptions, None, projectOptions) with ex -> Assert.Exception(ex) return None - | _ -> return this.TryGetOptionsForProject(projectId) + | _ -> return this.TryGetOptionsForProject(projectId) } /// Get the options for a document or project relevant for syntax processing. /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project options for a script. - member this.TryGetOptionsForEditingDocumentOrProject(document: Document) = + member this.TryGetOptionsForEditingDocumentOrProject(document:Document) = let projectId = document.Project.Id match singleFileProjectTable.TryGetValue(projectId) with | true, (_loadTime, parsingOptions, originalOptions) -> Some (parsingOptions, originalOptions) - | _ -> this.TryGetOptionsForProject(projectId) - - member this.ProvideProjectSiteProvider(project:Project) = - let hier = workspace.GetHierarchy(project.Id) - - {new IProvideProjectSite with - member iProvideProjectSite.GetProjectSite() = - let fst (a, _, _) = a - let thrd (_, _, c) = c - let mutable errorReporter = - let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) - Some(reporter:> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2) - - {new Microsoft.VisualStudio.FSharp.LanguageService.IProjectSite with - member __.CompilationSourceFiles = this.GetProjectInfo(project.FilePath) |> fst - member __.CompilationOptions = - let _,references,options = this.GetProjectInfo(project.FilePath) - Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] - member __.CompilationReferences = this.GetProjectInfo(project.FilePath) |> thrd - member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) - member __.Description = project.Name - member __.ProjectFileName = project.FilePath - member __.AdviseProjectSiteChanges(_,_) = () - member __.AdviseProjectSiteCleaned(_,_) = () - member __.AdviseProjectSiteClosed(_,_) = () - member __.IsIncompleteTypeCheckEnvironment = false - member __.TargetFrameworkMoniker = "" - member __.ProjectGuid = project.Id.Id.ToString() - member __.LoadTime = System.DateTime.Now - member __.ProjectProvider = Some iProvideProjectSite - member __.BuildErrorReporter with get () = errorReporter and - set (v) = errorReporter <- v - } - - // TODO: figure out why this is necessary - interface IVsHierarchy with - member __.SetSite(psp) = hier.SetSite(psp) - member __.GetSite(psp) = hier.GetSite(ref psp) - member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) - member __.Close() = hier.Close() - member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) - member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) - member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) - member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) - member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, ref ppHierarchyNested, ref pitemidNested) - member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) - member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) - member __.Unused0() = hier.Unused0() - member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) - member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) - member __.Unused1() = hier.Unused1() - member __.Unused2() = hier.Unused2() - member __.Unused3() = hier.Unused3() - member __.Unused4() = hier.Unused4() - } + | _ -> this.TryGetOptionsForProject(projectId) |> Option.map(fun (parsingOptions, _, projectOptions) -> parsingOptions, projectOptions) + /// get a siteprovider + member this.ProvideProjectSiteProvider(project:Project) = provideProjectSiteProvider(workspace, project, serviceProvider, Some projectOptionsTable) + + /// Tell the checker to update the project info for the specified project id member this.UpdateProjectInfoWithProjectId(projectId:ProjectId, userOpName) = let hier = workspace.GetHierarchy(projectId) match hier with + | null -> () | h when (h.IsCapabilityMatch("CPS")) -> let project = workspace.CurrentSolution.GetProject(projectId) - let siteProvider = this.ProvideProjectSiteProvider(project) - let projectSite = siteProvider.GetProjectSite() - if projectSite.CompilationSourceFiles.Length <> 0 then - this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, projectSite, userOpName) + if not (isNull project) then + let siteProvider = this.ProvideProjectSiteProvider(project) + let projectSite = siteProvider.GetProjectSite() + if projectSite.CompilationSourceFiles.Length <> 0 then + this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, projectSite, userOpName) | _ -> () - member this.UpdateProjectInfoWithPath(path, userOpName) = - let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) - this.UpdateProjectInfoWithProjectId(projectId, userOpName) + /// Tell the checker to update the project info for the specified project id + member this.UpdateDocumenttInfoWithProjectId(projectId:ProjectId, documentId:DocumentId, userOpName) = + if workspace.IsDocumentOpen(documentId) then + this.UpdateProjectInfoWithProjectId(projectId, userOpName) [] /// This handles commandline change notifications from the Dotnet Project-system @@ -301,13 +229,9 @@ type internal FSharpProjectOptionsManager else Path.Combine(Path.GetDirectoryName(path), p) let sourcePaths = sources |> Seq.map(fun s -> fullPath s.Path) |> Seq.toArray let referencePaths = references |> Seq.map(fun r -> fullPath r.Reference) |> Seq.toArray - projectInfo.[path] <- (sourcePaths,referencePaths,options.ToArray()) - this.UpdateProjectInfoWithPath(path, "HandleCommandLineChanges") - - member __.GetProjectInfo(path:string) = - match projectInfo.TryGetValue path with - | true, value -> value - | _ -> [||], [||], [||] + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) + projectOptionsTable.SetOptionsWithProjectId(projectId, sourcePaths, referencePaths, options.ToArray()) + this.UpdateProjectInfoWithProjectId(projectId, "HandleCommandLineChanges") member __.Checker = checkerProvider.Checker @@ -421,13 +345,34 @@ type let optionsAssociation = ConditionalWeakTable() - member private this.OnProjectAdded(projectId:ProjectId, _newSolution:Solution) = projectInfoManager.UpdateProjectInfoWithProjectId(projectId, "OnProjectAdded") - override this.Initialize() = + member private this.OnProjectAdded(projectId:ProjectId) = projectInfoManager.UpdateProjectInfoWithProjectId(projectId, "OnProjectAdded") + member private this.OnProjectReloaded(projectId:ProjectId) = projectInfoManager.UpdateProjectInfoWithProjectId(projectId, "OnProjectReloaded") + member private this.OnDocumentAdded(projectId:ProjectId, documentId:DocumentId) = projectInfoManager.UpdateDocumenttInfoWithProjectId(projectId, documentId, "OnDocumentAdded") + member private this.OnDocumentChanged(projectId:ProjectId, documentId:DocumentId) = projectInfoManager.UpdateDocumenttInfoWithProjectId(projectId, documentId, "OnDocumentChanged") + member private this.OnDocumentReloaded(projectId:ProjectId, documentId:DocumentId) = projectInfoManager.UpdateDocumenttInfoWithProjectId(projectId, documentId, "OnDocumentReloaded") + + override this.Initialize() = base.Initialize() let workspaceChanged (args:WorkspaceChangeEventArgs) = match args.Kind with - | WorkspaceChangeKind.ProjectAdded -> this.OnProjectAdded(args.ProjectId, args.NewSolution) + | WorkspaceChangeKind.ProjectAdded -> this.OnProjectAdded(args.ProjectId) + | WorkspaceChangeKind.ProjectReloaded -> this.OnProjectReloaded(args.ProjectId) + | WorkspaceChangeKind.DocumentAdded -> this.OnDocumentAdded(args.ProjectId, args.DocumentId) + | WorkspaceChangeKind.DocumentChanged -> this.OnDocumentChanged(args.ProjectId, args.DocumentId) + | WorkspaceChangeKind.DocumentReloaded -> this.OnDocumentReloaded(args.ProjectId, args.DocumentId) + | WorkspaceChangeKind.DocumentRemoved + | WorkspaceChangeKind.ProjectRemoved + | WorkspaceChangeKind.AdditionalDocumentAdded + | WorkspaceChangeKind.AdditionalDocumentReloaded + | WorkspaceChangeKind.AdditionalDocumentRemoved + | WorkspaceChangeKind.AdditionalDocumentChanged + | WorkspaceChangeKind.DocumentInfoChanged + | WorkspaceChangeKind.DocumentChanged + | WorkspaceChangeKind.SolutionAdded + | WorkspaceChangeKind.SolutionChanged + | WorkspaceChangeKind.SolutionReloaded + | WorkspaceChangeKind.SolutionCleared | _ -> () this.Workspace.Options <- this.Workspace.Options.WithChangedOption(Completion.CompletionOptions.BlockForCompletionItems, FSharpConstants.FSharpLanguageName, false) @@ -555,7 +500,7 @@ type // Roslyn is expecting site to be an IVsHierarchy. // It just so happens that the object that implements IProvideProjectSite is also // an IVsHierarchy. This assertion is to ensure that the assumption holds true. - Debug.Assert(hierarchy <> null, "About to CreateProjectContext with a non-hierarchy site") + Debug.Assert(not (isNull hierarchy), "About to CreateProjectContext with a non-hierarchy site") let projectContext = projectContextFactory.CreateProjectContext( @@ -584,7 +529,7 @@ type optionsAssociation.Remove(projectContext) |> ignore project.Disconnect())) - for referencedSite in ProjectSitesAndFiles.GetReferencedProjectSites (site, this.SystemServiceProvider) do + for referencedSite in ProjectSitesAndFiles.GetReferencedProjectSites(site, this.SystemServiceProvider, Some (this.Workspace :>obj), Some projectInfoManager.FSharpOptions ) do setup referencedSite setup (siteProvider.GetProjectSite()) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs index 15995d015f0..b2ad08f76ad 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs @@ -59,7 +59,7 @@ module internal SymbolHelpers = |> Seq.map (fun project -> async { match projectInfoManager.TryGetOptionsForProject(project.Id) with - | Some (_parsingOptions, projectOptions) -> + | Some (_parsingOptions, _site, projectOptions) -> let! projectCheckResults = checker.ParseAndCheckProject(projectOptions, userOpName = userOpName) return! projectCheckResults.GetUsesOfSymbol(symbol) | None -> return [||] diff --git a/vsintegration/src/FSharp.Editor/Navigation/FindUsagesService.fs b/vsintegration/src/FSharp.Editor/Navigation/FindUsagesService.fs index e3479737db0..0f7fde12e79 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/FindUsagesService.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/FindUsagesService.fs @@ -51,7 +51,7 @@ type internal FSharpFindUsagesService asyncMaybe { let! sourceText = document.GetTextAsync(context.CancellationToken) |> Async.AwaitTask |> liftAsync let checker = checkerProvider.Checker - let! parsingOptions, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) + let! parsingOptions, _, projectOptions = projectInfoManager.TryGetOptionsForDocumentOrProject(document) let! _, _, checkFileResults = checker.ParseAndCheckDocument(document, projectOptions, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) let textLine = sourceText.Lines.GetLineFromPosition(position).ToString() let lineNumber = sourceText.Lines.GetLinePosition(position).Line + 1 @@ -112,7 +112,7 @@ type internal FSharpFindUsagesService projectsToCheck |> Seq.map (fun project -> asyncMaybe { - let! _parsingOptions, projectOptions = projectInfoManager.TryGetOptionsForProject(project.Id) + let! _parsingOptions, _site, projectOptions = projectInfoManager.TryGetOptionsForProject(project.Id) let! projectCheckResults = checker.ParseAndCheckProject(projectOptions, userOpName = userOpName) |> liftAsync return! projectCheckResults.GetUsesOfSymbol(symbolUse.Symbol) |> liftAsync } |> Async.map (Option.defaultValue [||])) diff --git a/vsintegration/src/FSharp.Editor/Navigation/NavigateToSearchService.fs b/vsintegration/src/FSharp.Editor/Navigation/NavigateToSearchService.fs index a1cee3bff49..38c2abc9687 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/NavigateToSearchService.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/NavigateToSearchService.fs @@ -233,7 +233,7 @@ type internal FSharpNavigateToSearchService interface INavigateToSearchService with member __.SearchProjectAsync(project, searchPattern, cancellationToken) : Task> = asyncMaybe { - let! parsingOptions, _options = projectInfoManager.TryGetOptionsForProject(project.Id) + let! parsingOptions, _site, _options = projectInfoManager.TryGetOptionsForProject(project.Id) let! items = project.Documents |> Seq.map (fun document -> getCachedIndexedNavigableItems(document, parsingOptions)) @@ -265,7 +265,7 @@ type internal FSharpNavigateToSearchService member __.SearchDocumentAsync(document, searchPattern, cancellationToken) : Task> = asyncMaybe { - let! parsingOptions, _options = projectInfoManager.TryGetOptionsForDocumentOrProject(document) + let! parsingOptions, _, _ = projectInfoManager.TryGetOptionsForDocumentOrProject(document) let! items = getCachedIndexedNavigableItems(document, parsingOptions) |> liftAsync return items.Find(searchPattern) } diff --git a/vsintegration/src/FSharp.Editor/QuickInfo/QuickInfoProvider.fs b/vsintegration/src/FSharp.Editor/QuickInfo/QuickInfoProvider.fs index 8e4a6fa82a0..802d8948ca5 100644 --- a/vsintegration/src/FSharp.Editor/QuickInfo/QuickInfoProvider.fs +++ b/vsintegration/src/FSharp.Editor/QuickInfo/QuickInfoProvider.fs @@ -55,7 +55,7 @@ module private FSharpQuickInfo = let extLineText = (extSourceText.Lines.GetLineFromPosition extSpan.Start).ToString() // project options need to be retrieved because the signature file could be in another project - let! extParsingOptions, extProjectOptions = projectInfoManager.TryGetOptionsForProject extDocId.ProjectId + let! extParsingOptions, _extSite, extProjectOptions = projectInfoManager.TryGetOptionsForProject extDocId.ProjectId let extDefines = CompilerEnvironment.GetCompilationDefinesForEditing (extDocument.FilePath, extParsingOptions) let! extLexerSymbol = Tokenizer.getSymbolAtPosition(extDocId, extSourceText, extSpan.Start, declRange.FileName, extDefines, SymbolLookupKind.Greedy, true) let! _, _, extCheckFileResults = checker.ParseAndCheckDocument(extDocument, extProjectOptions, allowStaleResults=true, sourceText=extSourceText, userOpName = userOpName) diff --git a/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs b/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs index 36404fd5eb8..42c673d90b7 100644 --- a/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs +++ b/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs @@ -7,14 +7,10 @@ namespace Microsoft.VisualStudio.FSharp.LanguageService open System -open System.Runtime.InteropServices -open Microsoft.VisualStudio open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.Text -open Microsoft.VisualStudio.OLE.Interop -open Microsoft.VisualStudio.Shell.Interop -open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider #nowarn "44" // use of obsolete CheckFileInProjectAllowingStaleCachedResults @@ -113,7 +109,7 @@ type internal FSharpLanguageServiceBackgroundRequests_DEPRECATED let rdt = getServiceProvider().RunningDocumentTable let projectSite = getProjectSitesAndFiles().FindOwningProject_DEPRECATED(rdt,fileName) let enableInMemoryCrossProjectReferences = true - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, fileName, None, getServiceProvider(), false) + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, getServiceProvider(), None(*projectId*), fileName, None(*extraProjectInfo*), None(*FSharpProjectOptionsTable*), false) let projectFileName = projectSite.ProjectFileName let data = { ProjectSite = projectSite diff --git a/vsintegration/src/FSharp.LanguageService/IProjectSite.fs b/vsintegration/src/FSharp.LanguageService/IProjectSite.fs index dfdc99d8ec4..18e75ee37db 100644 --- a/vsintegration/src/FSharp.LanguageService/IProjectSite.fs +++ b/vsintegration/src/FSharp.LanguageService/IProjectSite.fs @@ -29,6 +29,9 @@ and internal IProjectSite = /// The '-o:' output bin path, without the '-o:' abstract CompilationBinOutputPath : string option + /// The name of the project file. + abstract ProjectFileName : string + /// Register for notifications for when the above change abstract AdviseProjectSiteChanges : callbackOwnerKey: string * AdviseProjectSiteChanges -> unit @@ -41,9 +44,6 @@ and internal IProjectSite = /// A user-friendly description of the project. Used only for developer/DEBUG tooltips and such. abstract Description : string - /// The name of the project file. - abstract ProjectFileName : string - /// The error list task reporter abstract BuildErrorReporter : Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2 option with get, set diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 122d685184a..237bd82b80e 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -7,7 +7,7 @@ // information is conveyed to the rest of the implementation via an IProjectSite interface. // // For most purposes, an IProjectSite has to provide three main things -// - the source files +// - the source files` // - the compilation options // - the assembly references. // Project.fs collects the first two from MSBuild. For the third - assembly references - it looks @@ -30,29 +30,47 @@ // This means a lot of the stuff above is irrelevant in that case, apart from where FSharpProjectOptionsManager // incrementally maintains a corresponding F# CompilerService FSharpProjectOptions value. -namespace Microsoft.VisualStudio.FSharp.LanguageService +module internal rec Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open System +open System.Collections.Concurrent +open System.ComponentModel.Composition open System.IO open System.Diagnostics -open System.Runtime.InteropServices open Microsoft.VisualStudio open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.Shell.Interop open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.CodeAnalysis +open Microsoft.VisualStudio.LanguageServices +open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem +open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList +open VSLangProj +open System.ComponentModel.Composition.Primitives +open Microsoft.VisualStudio.Shell +open System.Collections.Immutable + + /// An additional interface that an IProjectSite object can implement to indicate it has an FSharpProjectOptions /// already available, so we don't have to recreate it type private IHaveCheckOptions = abstract OriginalCheckOptions : unit -> string[] * FSharpProjectOptions - + +let projectDisplayNameOf projectFileName = + if String.IsNullOrWhiteSpace projectFileName then projectFileName + else Path.GetFileNameWithoutExtension projectFileName + +/// A value and a function to recompute/refresh the value. The function is passed a flag indicating if a refresh is happening. +type Refreshable<'T> = 'T * (bool -> 'T) + /// Convert from FSharpProjectOptions into IProjectSite. -type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames, checkOptions : FSharpProjectOptions) = +type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames, checkOptions: FSharpProjectOptions) = interface IProjectSite with override this.Description = sprintf "Script Closure at Root %s" filename override this.CompilationSourceFiles = checkOptions.SourceFiles override this.CompilationOptions = checkOptions.OtherOptions - override this.CompilationReferences = + override this.CompilationReferences = checkOptions.OtherOptions |> Array.choose (fun flag -> if flag.StartsWith("-r:") then Some flag.[3..] else None) override this.CompilationBinOutputPath = None @@ -69,21 +87,23 @@ type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames interface IHaveCheckOptions with override this.OriginalCheckOptions() = (referencedProjectFileNames, checkOptions) - + override x.ToString() = sprintf "ProjectSiteOfScriptFile(%s)" filename - + /// An orphan file project is a .fs, .ml, .fsi, .mli that is not associated with a .fsproj. /// By design, these are never going to typecheck because there is no affiliated references. /// We show many squiggles in this case because they're not particularly informational. -type private ProjectSiteOfSingleFile(sourceFile) = - // CompilationOptions gets called a lot, so pre-compute what we can +type private ProjectSiteOfSingleFile(sourceFile) = + // CompilerFlags() gets called a lot, so pre-compute what we can static let compilerFlags = let flags = ["--noframework";"--warn:3"] let assumeDotNetFramework = true let defaultReferences = [ for r in CompilerEnvironment.DefaultReferencesForOrphanSources(assumeDotNetFramework) do yield sprintf "-r:%s%s" r (if r.EndsWith(".dll",StringComparison.OrdinalIgnoreCase) then "" else ".dll") ] - (flags @ defaultReferences) |> List.toArray + (flags @ defaultReferences) + |> List.toArray + |> Array.choose (fun flag -> if flag.StartsWith("-r:") then Some flag.[3..] elif flag.StartsWith("--reference:") then Some flag.[12..] else None) let projectFileName = sourceFile + ".orphan.fsproj" @@ -91,9 +111,9 @@ type private ProjectSiteOfSingleFile(sourceFile) = override this.Description = projectFileName override this.CompilationSourceFiles = [|sourceFile|] override this.CompilationOptions = compilerFlags - override this.CompilationReferences = compilerFlags |> Array.choose (fun flag -> if flag.StartsWith("-r:") then Some flag.[3..] else None) + override this.CompilationReferences = compilerFlags override this.CompilationBinOutputPath = None - override this.ProjectFileName = projectFileName + override this.ProjectFileName = projectFileName override this.BuildErrorReporter with get() = None and set _v = () override this.AdviseProjectSiteChanges(_,_) = () override this.AdviseProjectSiteCleaned(_,_) = () @@ -103,20 +123,112 @@ type private ProjectSiteOfSingleFile(sourceFile) = override this.ProjectGuid = "" override this.LoadTime = new DateTime(2000,1,1) // any constant time is fine, orphan files do not interact with reloading based on update time override this.ProjectProvider = None - + override x.ToString() = sprintf "ProjectSiteOfSingleFile(%s)" sourceFile - + +/// Manage Storage of FSharpProjectOptions the options for a project +type internal FSharpProjectOptionsTable () = + // A table of information about projects, excluding single-file projects. + let projectTable = ConcurrentDictionary>() + let commandLineOptions = new ConcurrentDictionary() + + /// Go and re-get all of the options for everything that references projectId + let refreshInfoForProjectsThatReferenceThisProject (projectId:ProjectId) = + for KeyValue(otherProjectId, ((referencedProjectIds, _parsingOptions, _site, _options), refresh)) in projectTable.ToArray() do + for referencedProjectId in referencedProjectIds do + if referencedProjectId = projectId then + projectTable.[otherProjectId] <- (refresh true, refresh) + + /// Add or update a project in the project table + member __.AddOrUpdateProject(projectId:ProjectId, refresh) = + projectTable.[projectId] <- (refresh false, refresh) + refreshInfoForProjectsThatReferenceThisProject(projectId) + + /// Clear a project from the project table + member this.ClearInfoForProject(projectId:ProjectId) = + projectTable.TryRemove(projectId) |> ignore + refreshInfoForProjectsThatReferenceThisProject projectId + + /// Get the options for a project + member this.TryGetOptionsForProject(projectId:ProjectId) = + match projectTable.TryGetValue(projectId) with + | true, ((_referencedProjects, parsingOptions, site, projectOptions), _) -> Some (parsingOptions, site, projectOptions) + | _ -> None + + /// Given a projectId return the most recent set of command line options for it + member __.GetCommandLineOptionsWithProjectId(projectId:ProjectId) = + match commandLineOptions.TryGetValue projectId with + | true, (sources, references, options) -> sources, references, options + | _ -> [||], [||], [||] + + member this.SetOptionsWithProjectId(projectId:ProjectId, sourcePaths:string[], referencePaths:string[], options:string[]) = + commandLineOptions.[projectId] <- (sourcePaths, referencePaths, options) + +let internal provideProjectSiteProvider(workspace:VisualStudioWorkspaceImpl, project:Project, serviceProvider:System.IServiceProvider, projectOptionsTable:FSharpProjectOptionsTable option) = + let hier = workspace.GetHierarchy(project.Id) + let getCommandLineOptionsWithProjectId (projectId) = + match projectOptionsTable with + | Some (options) -> options.GetCommandLineOptionsWithProjectId(projectId) + | None -> [||], [||], [||] + {new IProvideProjectSite with + member x.GetProjectSite() = + let fst (a, _, _) = a + let snd (_, b, _) = b + let mutable errorReporter = + let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) + Some(reporter:> IVsLanguageServiceBuildErrorReporter2) + + { new IProjectSite with + member __.Description = project.Name + member __.CompilationSourceFiles = getCommandLineOptionsWithProjectId(project.Id) |> fst + member __.CompilationOptions = + let _,references,options = getCommandLineOptionsWithProjectId(project.Id) + Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] + member __.CompilationReferences = getCommandLineOptionsWithProjectId(project.Id) |> snd + member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) + member __.ProjectFileName = project.FilePath + member __.AdviseProjectSiteChanges(_,_) = () + member __.AdviseProjectSiteCleaned(_,_) = () + member __.AdviseProjectSiteClosed(_,_) = () + member __.IsIncompleteTypeCheckEnvironment = false + member __.TargetFrameworkMoniker = "" + member __.ProjectGuid = project.Id.Id.ToString() + member __.LoadTime = System.DateTime.Now + member __.ProjectProvider = Some (x) + member __.BuildErrorReporter with get () = errorReporter and + set (v) = errorReporter <- v + } + + interface IVsHierarchy with + member __.SetSite(psp) = hier.SetSite(psp) + member __.GetSite(psp) = hier.GetSite(ref psp) + member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) + member __.Close() = hier.Close() + member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) + member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) + member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) + member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) + member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, ref ppHierarchyNested, ref pitemidNested) + member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) + member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) + member __.Unused0() = hier.Unused0() + member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) + member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) + member __.Unused1() = hier.Unused1() + member __.Unused2() = hier.Unused2() + member __.Unused3() = hier.Unused3() + member __.Unused4() = hier.Unused4() + } + /// Information about projects, open files and other active artifacts in visual studio. /// Keeps track of the relationship between IVsTextLines buffers, IFSharpSource_DEPRECATED objects, IProjectSite objects and FSharpProjectOptions [] type internal ProjectSitesAndFiles() = static let sourceUserDataGuid = new Guid("{55F834FD-B950-4C61-BBAA-0511ABAF4AE2}") // Guid for source user data on text buffer - static let mutable stamp = 0L static let tryGetProjectSite(hierarchy:IVsHierarchy) = match hierarchy with - | :? IProvideProjectSite as siteFactory -> - Some(siteFactory.GetProjectSite()) + | :? IProvideProjectSite as siteFactory -> Some(siteFactory.GetProjectSite()) | _ -> None static let fullOutputAssemblyPath (p:EnvDTE.Project) = @@ -132,64 +244,95 @@ type internal ProjectSitesAndFiles() = static let referencedProjects (projectSite:IProjectSite) = match projectSite.ProjectProvider with - | None -> Seq.empty - | Some (:? IVsHierarchy as hier) -> + | None -> None + | Some (:? IVsHierarchy as hier) -> match hier.GetProperty(VSConstants.VSITEMID_ROOT, int __VSHPROPID.VSHPROPID_ExtObject) with - | VSConstants.S_OK, (:? EnvDTE.Project as p) -> - (p.Object :?> VSLangProj.VSProject).References - |> Seq.cast - |> Seq.choose (fun r -> - Option.ofObj r - |> Option.bind (fun r -> try Option.ofObj r.SourceProject with _ -> None)) - | _ -> Seq.empty - | Some _ -> Seq.empty - - static let rec referencedProvideProjectSites (projectSite:IProjectSite, serviceProvider:System.IServiceProvider) = - seq { - let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None - match solutionService with - | Some solutionService -> - for p in referencedProjects projectSite do - match solutionService.GetProjectOfUniqueName(p.UniqueName) with - | VSConstants.S_OK, (:? IProvideProjectSite as ps) -> - yield (p, ps) - | _ -> () - | None -> () - } - - static let rec referencedProjectsOf (enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite, extraProjectInfo, serviceProvider:System.IServiceProvider, useUniqueStamp) = - [| for (p,ps) in referencedProvideProjectSites (projectSite, serviceProvider) do - match fullOutputAssemblyPath p with + | VSConstants.S_OK, (:? EnvDTE.Project as p) when not (isNull p) -> + Some ((p.Object :?> VSLangProj.VSProject).References + |> Seq.cast + |> Seq.choose (fun r -> + Option.ofObj r + |> Option.bind (fun r -> try Option.ofObj r.SourceProject with _ -> None)) ) + | _ -> None + | Some _ -> None + + static let rec referencedProvideProjectSites(projectSite:IProjectSite, serviceProvider:System.IServiceProvider, extraProjectInfo:obj option, projectOptionsTable:FSharpProjectOptionsTable option) = + let getReferencesForSolutionService (solutionService:IVsSolution) = + [| + match referencedProjects projectSite, extraProjectInfo with + | None, Some (:? VisualStudioWorkspaceImpl as workspace) when not (isNull workspace.CurrentSolution)-> + let path = projectSite.ProjectFileName + if not (String.IsNullOrWhiteSpace(path)) then + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) + let project = workspace.CurrentSolution.GetProject(projectId) + if not (isNull project) then + for reference in project.ProjectReferences do + let project = workspace.CurrentSolution.GetProject(reference.ProjectId) + if not (isNull project) then + let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) + let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) + let outputPath = referenceProject.BinOutputPath + yield Some projectId, project.FilePath, outputPath, siteProvider + + | (Some references), _ -> + for p in references do + match solutionService.GetProjectOfUniqueName(p.UniqueName) with + | VSConstants.S_OK, (:? IProvideProjectSite as ps) -> + yield None, p.FileName, (fullOutputAssemblyPath p) |> Option.defaultValue "", ps + | _ -> () + | None, _ -> () + |] + let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None + seq { match solutionService with + | Some solutionService -> + for reference in getReferencesForSolutionService solutionService do yield reference | None -> () - | Some path -> - let referencedProjectOptions = - // Lookup may not succeed if the project has not been established yet - // In this case we go and compute the options recursively. - match tryGetOptionsForReferencedProject p.FileName with - | None -> getProjectOptionsForProjectSite (enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, ps.GetProjectSite(), p.FileName, extraProjectInfo, serviceProvider, useUniqueStamp) |> snd - | Some options -> options - yield (p.FileName, (path, referencedProjectOptions)) |] - - and getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite, fileName, extraProjectInfo, serviceProvider, useUniqueStamp) = + } + + static let rec referencedProjectsOf(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, serviceProvider, extraProjectInfo, projectOptionsTable, useUniqueStamp) = + [| for (projectId, projectFileName, outputPath, projectSiteProvider) in referencedProvideProjectSites (projectSite, serviceProvider, extraProjectInfo, projectOptionsTable) do + let referencedProjectOptions = + // Lookup may not succeed if the project has not been established yet + // In this case we go and compute the options recursively. + match tryGetOptionsForReferencedProject projectFileName with + | None -> getProjectOptionsForProjectSite (enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSiteProvider.GetProjectSite(), serviceProvider, projectId, projectFileName, extraProjectInfo, projectOptionsTable, useUniqueStamp) |> snd + | Some options -> options + yield projectFileName, (outputPath, referencedProjectOptions) |] + + and getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, serviceProvider, projectId, fileName, extraProjectInfo, projectOptionsTable, useUniqueStamp) = let referencedProjectFileNames, referencedProjectOptions = if enableInMemoryCrossProjectReferences then - referencedProjectsOf(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, extraProjectInfo, serviceProvider, useUniqueStamp) + referencedProjectsOf(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, serviceProvider, extraProjectInfo, projectOptionsTable, useUniqueStamp) |> Array.unzip else [| |], [| |] - - let options = - {ProjectFileName = projectSite.ProjectFileName - SourceFiles = projectSite.CompilationSourceFiles - OtherOptions = projectSite.CompilationOptions - ReferencedProjects = referencedProjectOptions - IsIncompleteTypeCheckEnvironment = projectSite.IsIncompleteTypeCheckEnvironment - UseScriptResolutionRules = SourceFile.MustBeSingleFileProject fileName - LoadTime = projectSite.LoadTime - UnresolvedReferences = None - OriginalLoadReferences = [] - ExtraProjectInfo=extraProjectInfo - Stamp = (if useUniqueStamp then (stamp <- stamp + 1L; Some stamp) else None) } - referencedProjectFileNames, options + let option = + let newOption () = { + ProjectFileName = projectSite.ProjectFileName + SourceFiles = projectSite.CompilationSourceFiles + OtherOptions = projectSite.CompilationOptions + ReferencedProjects = referencedProjectOptions + IsIncompleteTypeCheckEnvironment = projectSite.IsIncompleteTypeCheckEnvironment + UseScriptResolutionRules = SourceFile.MustBeSingleFileProject fileName + LoadTime = projectSite.LoadTime + UnresolvedReferences = None + OriginalLoadReferences = [] + ExtraProjectInfo=extraProjectInfo + Stamp = if useUniqueStamp then (stamp <- stamp + 1L; Some stamp) else None + } + match projectId, projectOptionsTable with + | Some id, Some optionsTable -> + // Get options from cache + match optionsTable.TryGetOptionsForProject(id) with + | Some (_parsingOptions, _site, projectOptions) -> + if projectSite.CompilationSourceFiles <> projectOptions.SourceFiles || + projectSite.CompilationOptions <> projectOptions.OtherOptions || + referencedProjectOptions <> projectOptions.ReferencedProjects then + newOption() + else + projectOptions + | _ -> newOption() + | _ -> newOption() + referencedProjectFileNames, option /// Construct a project site for a single file. May be a single file project (for scripts) or an orphan project site (for everything else). static member ProjectSiteOfSingleFile(filename:string) : IProjectSite = @@ -198,9 +341,9 @@ type internal ProjectSitesAndFiles() = failwith ".fsx or .fsscript should have been treated as implicit project" new ProjectSiteOfSingleFile(filename) :> IProjectSite - static member GetReferencedProjectSites(projectSite:IProjectSite, serviceProvider:System.IServiceProvider) = - referencedProvideProjectSites (projectSite, serviceProvider) - |> Seq.map (fun (_, ps) -> ps.GetProjectSite()) + static member GetReferencedProjectSites(projectSite:IProjectSite, serviceProvider:System.IServiceProvider, extraProjectInfo, projectOptions) = + referencedProvideProjectSites (projectSite, serviceProvider, extraProjectInfo, projectOptions) + |> Seq.map (fun (_, _, _, ps) -> ps.GetProjectSite()) |> Seq.toArray member art.SetSource_DEPRECATED(buffer:IVsTextLines, source:IFSharpSource_DEPRECATED) : unit = @@ -208,11 +351,10 @@ type internal ProjectSitesAndFiles() = (buffer :?> IVsUserData).SetData(&guid, source) |> ErrorHandler.ThrowOnFailure |> ignore /// Create project options for this project site. - static member GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite,filename,extraProjectInfo,serviceProvider:System.IServiceProvider, useUniqueStamp) = + static member GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite, serviceProvider, projectId, filename, extraProjectInfo, projectOptionsTable, useUniqueStamp) = match projectSite with | :? IHaveCheckOptions as hco -> hco.OriginalCheckOptions() - | _ -> - getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, filename, extraProjectInfo, serviceProvider, useUniqueStamp) + | _ -> getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, serviceProvider, projectId, filename, extraProjectInfo, projectOptionsTable, useUniqueStamp) /// Create project site for these project options static member CreateProjectSiteForScript (filename, referencedProjectFileNames, checkOptions) = @@ -252,7 +394,6 @@ type internal ProjectSitesAndFiles() = let parsingOptions,_ = checker.GetParsingOptionsFromCommandLineArgs( site.CompilationOptions |> Array.toList) CompilerEnvironment.GetCompilationDefinesForEditing(filename,parsingOptions) - member art.TryFindOwningProject_DEPRECATED(rdt:IVsRunningDocumentTable, filename) = if SourceFile.MustBeSingleFileProject(filename) then None else @@ -271,4 +412,4 @@ type internal ProjectSitesAndFiles() = member art.FindOwningProject_DEPRECATED(rdt:IVsRunningDocumentTable, filename) = match art.TryFindOwningProject_DEPRECATED(rdt, filename) with | Some site -> site - | None -> ProjectSitesAndFiles.ProjectSiteOfSingleFile(filename) + | None -> ProjectSitesAndFiles.ProjectSiteOfSingleFile(filename) \ No newline at end of file diff --git a/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs b/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs index 7a2976e0936..21b290c3819 100644 --- a/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs +++ b/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs @@ -17,6 +17,7 @@ open Microsoft.VisualStudio.OLE.Interop open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.VisualStudio.FSharp.LanguageService +open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open Microsoft.VisualStudio.FSharp.Editor type internal FSharpLanguageServiceTestable() as this = @@ -127,7 +128,7 @@ type internal FSharpLanguageServiceTestable() as this = /// Respond to project being cleaned/rebuilt (any live type providers in the project should be refreshed) member this.OnProjectCleaned(projectSite:IProjectSite) = let enableInMemoryCrossProjectReferences = true - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, "" ,None, serviceProvider.Value, false) + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, serviceProvider.Value, None(*projectId*), "" ,None, None, false) this.FSharpChecker.NotifyProjectCleaned(checkOptions) |> Async.RunSynchronously member this.OnActiveViewChanged(textView) = @@ -170,7 +171,7 @@ type internal FSharpLanguageServiceTestable() as this = member this.DependencyFileCreated projectSite = let enableInMemoryCrossProjectReferences = true // Invalidate the configuration if we notice any add for any DependencyFiles - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, "", None, this.ServiceProvider, false) + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, serviceProvider.Value, None(*projectId*),"" ,None, None, false) this.FSharpChecker.InvalidateConfiguration(checkOptions) member this.DependencyFileChanged (filename) = diff --git a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj index 7ddbf1b0dbc..6a735d64415 100644 --- a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj +++ b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj @@ -150,6 +150,10 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Shell.$(RoslynVSBinariesVersion).$(RoslynVSPackagesVersion)\lib\Microsoft.VisualStudio.Shell.$(RoslynVSBinariesVersion).dll True + + $(FSharpSourcesRoot)\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.$(RoslynVersion)\lib\netstandard1.3\Microsoft.CodeAnalysis.Workspaces.dll + True + True $(NUnitLibDir)\nunit.framework.dll From 0037eb1ac0cdffe6df3310e83f539caa5861da73 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 21:56:05 +0300 Subject: [PATCH 045/150] fix for identical sub module --- src/fsharp/TypeChecker.fs | 5 +- src/fsharp/vs/ServiceAnalysis.fs | 139 +++++++++--------- src/fsharp/vs/service.fs | 6 +- .../tests/unittests/UnusedOpensTests.fs | 21 +++ 4 files changed, 99 insertions(+), 72 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 819b73ed76a..19cfb835e41 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -450,8 +450,9 @@ let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs openDeclaration = match openDeclaration.Range with | None -> () | Some range -> - let item = Item.ModuleOrNamespaces mvvs - CallNameResolutionSink tcSink (range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) + for modul in mvvs do + let item = Item.ModuleOrNamespaces [modul] + CallNameResolutionSink tcSink (range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) env let AddRootModuleOrNamespaceRefs g amap m env modrefs = diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 0502a63f4c3..7ed8b0e3e1e 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -13,42 +13,44 @@ module UnusedOpens = { Entity: FSharpEntity IsNestedAutoOpen: bool } + member this.ChildSymbols = + seq { for ent in this.Entity.NestedEntities do + yield ent :> FSharpSymbol + + if ent.IsFSharpRecord then + for rf in ent.FSharpFields do + yield upcast rf + + if ent.IsFSharpUnion && not (Symbol.hasAttribute ent.Attributes) then + for unionCase in ent.UnionCases do + yield upcast unionCase + + for fv in this.Entity.MembersFunctionsAndValues do + yield upcast fv + + for apCase in this.Entity.ActivePatternCases do + yield upcast apCase + } |> Seq.cache + + type ModuleGroup = + { Modules: Module list } + + static member Create (modul: FSharpEntity) = + let rec getModuleAndItsAutoOpens (isNestedAutoOpen: bool) (modul: FSharpEntity) = + [ yield { Entity = modul; IsNestedAutoOpen = isNestedAutoOpen } + for ent in modul.NestedEntities do + if ent.IsFSharpModule && Symbol.hasAttribute ent.Attributes then + yield! getModuleAndItsAutoOpens true ent ] + { Modules = getModuleAndItsAutoOpens false modul } + /// Represents single open statement. type OpenStatement = - { /// All modules which this open declaration effectively opens, including all auto open ones, recursively. - Modules: Module list + { /// All modules which this open declaration effectively opens, _not_ including auto open ones. + Modules: ModuleGroup list /// Range of open statement itself. Range: range /// Scope on which this open declaration is applied. - AppliedScope: range - /// If it's prefixed with the special "global" namespace. - IsGlobal: bool } - - member this.AllChildSymbols = - seq { for modul in this.Modules |> List.map (fun x -> x.Entity) do - for ent in modul.NestedEntities do - yield ent :> FSharpSymbol - - if ent.IsFSharpRecord then - for rf in ent.FSharpFields do - yield upcast rf - - if ent.IsFSharpUnion && not (Symbol.hasAttribute ent.Attributes) then - for unionCase in ent.UnionCases do - yield upcast unionCase - - for fv in modul.MembersFunctionsAndValues do - yield upcast fv - - for apCase in modul.ActivePatternCases do - yield upcast apCase - } |> Seq.cache - - let rec getModuleAndItsAutoOpens (isNestedAutoOpen: bool) (modul: FSharpEntity) = - [ yield { Entity = modul; IsNestedAutoOpen = isNestedAutoOpen } - for ent in modul.NestedEntities do - if ent.IsFSharpModule && Symbol.hasAttribute ent.Attributes then - yield! getModuleAndItsAutoOpens true ent ] + AppliedScope: range } let getOpenStatements (openDeclarations: FSharpOpenDeclaration list) : OpenStatement list = openDeclarations @@ -56,10 +58,12 @@ module UnusedOpens = |> List.choose (fun openDecl -> match openDecl.LongId, openDecl.Range with | firstId :: _, Some range -> - Some { Modules = openDecl.Modules |> List.collect (getModuleAndItsAutoOpens false) - Range = range - AppliedScope = openDecl.AppliedScope - IsGlobal = firstId.idText = MangledGlobalName } + if firstId.idText = MangledGlobalName then + None + else + Some { Modules = openDecl.Modules |> List.map ModuleGroup.Create + Range = range + AppliedScope = openDecl.AppliedScope } | _ -> None) let filterSymbolUses (getSourceLineStr: int -> string) (symbolUses: FSharpSymbolUse[]) : FSharpSymbolUse[] = @@ -76,44 +80,45 @@ module UnusedOpens = // it's `open System` which really brings it into scope. partialName.QualifyingIdents = []) + type UsedModule = + { Module: FSharpEntity + AppliedScope: range } + let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = let filterOpenStatements (openStatements: OpenStatement list) (symbolUses: FSharpSymbolUse[]) : OpenStatement list = - let rec filterInner acc (openStatements: OpenStatement list) (seenOpenStatements: OpenStatement list) = - - let isUsed (openStatement: OpenStatement) = - if openStatement.IsGlobal then true - else - let usedSomewhere = - symbolUses - |> Array.exists (fun symbolUse -> - let inScope = rangeContainsRange openStatement.AppliedScope symbolUse.RangeAlternate - if not inScope then false - else - openStatement.AllChildSymbols - |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)) + + let rec filterInner acc (openStatements: OpenStatement list) (usedModules: UsedModule list) = + + let getUsedModules (openStatement: OpenStatement) = + let notAlreadyUsedModuleGroups = + openStatement.Modules + |> List.filter (fun x -> + not (usedModules + |> List.exists (fun used -> + rangeContainsRange used.AppliedScope openStatement.AppliedScope && + x.Modules |> List.exists (fun x -> not x.IsNestedAutoOpen && used.Module.IsEffectivelySameAs x.Entity)))) - if not usedSomewhere then false - else - let alreadySeen = - seenOpenStatements - |> List.exists (fun seenNs -> - // if such open statement has already been marked as used in this or outer module, we skip it - // (that is, do not mark as used so far) - rangeContainsRange seenNs.AppliedScope openStatement.AppliedScope && - openStatement.Modules - |> List.exists (fun x -> - // do not check if any of auto open nested modules has already been seen, - // current open statement should be seen itself or as an auto open module of its outer module. - not x.IsNestedAutoOpen && - seenNs.Modules |> List.exists (fun s -> s.Entity.IsEffectivelySameAs x.Entity))) - not alreadySeen - + match notAlreadyUsedModuleGroups with + | [] -> [] + | _ -> + let symbolUsesInScope = symbolUses |> Array.filter (fun symbolUse -> rangeContainsRange openStatement.AppliedScope symbolUse.RangeAlternate) + notAlreadyUsedModuleGroups + |> List.filter (fun modulGroup -> + modulGroup.Modules + |> List.exists (fun modul -> + symbolUsesInScope + |> Array.exists (fun symbolUse -> + modul.ChildSymbols + |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)))) + |> List.collect (fun mg -> + mg.Modules |> List.map (fun x -> { Module = x.Entity; AppliedScope = openStatement.AppliedScope })) + match openStatements with - | os :: xs when not (isUsed os) -> - filterInner (os :: acc) xs (os :: seenOpenStatements) | os :: xs -> - filterInner acc xs (os :: seenOpenStatements) + match getUsedModules os with + | [] -> filterInner (os :: acc) xs usedModules + | um -> filterInner acc xs (um @ usedModules) | [] -> List.rev acc filterInner [] openStatements [] diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index d8ef04dd885..83725c76311 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -1993,9 +1993,9 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp (fun () -> [| |]) (fun scope -> [| for (item,itemOcc,denv,m) in scope.ScopeSymbolUses.GetAllUsesOfSymbols() do - if itemOcc <> ItemOccurence.RelatedText then - let symbol = FSharpSymbol.Create(scope.TcGlobals, scope.ThisCcu, scope.TcImports, item) - yield FSharpSymbolUse(scope.TcGlobals, denv, symbol, itemOcc, m) |]) + if itemOcc <> ItemOccurence.RelatedText then + let symbol = FSharpSymbol.Create(scope.TcGlobals, scope.ThisCcu, scope.TcImports, item) + yield FSharpSymbolUse(scope.TcGlobals, denv, symbol, itemOcc, m) |]) |> async.Return member info.GetUsesOfSymbolInFile(symbol:FSharpSymbol) = diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 946ab5da9d8..cb249be7afb 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -664,3 +664,24 @@ let _ = x let _ = y """ => [] + +[] +let ``single relative open declaration opens two independent modules in different parent modules``() = + """ +module M = + module Xxx = + let x = 1 +module N = + module Xxx = + let y = 1 +open M +open N +open N.Xxx +open Xxx + +let _ = y +let _ = x +""" + => [] + + From 077d13aa8f38179bd8358aceb5f0e7b996bdf854 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 12 Oct 2017 23:52:23 -0700 Subject: [PATCH 046/150] Parameterise rc location (#3744) --- .../src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj | 1 + 1 file changed, 1 insertion(+) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index d475e39d0df..92382344396 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -43,6 +43,7 @@ $(IntermediateOutputPath)\ProjectResources.rc.res + From 29c1df1211979a06d716ab8367a129735419680c Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Tue, 24 Oct 2017 12:04:53 -0700 Subject: [PATCH 047/150] Fix issues --- .../src/FSharp.LanguageService/ProjectSitesAndFiles.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 237bd82b80e..7f706e98443 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -391,7 +391,7 @@ type internal ProjectSitesAndFiles() = | Some site -> site | None -> ProjectSitesAndFiles.ProjectSiteOfSingleFile(filename) - let parsingOptions,_ = checker.GetParsingOptionsFromCommandLineArgs( site.CompilationOptions |> Array.toList) + let parsingOptions,_ = checker.GetParsingOptionsFromCommandLineArgs(site.CompilationOptions |> Array.toList) CompilerEnvironment.GetCompilationDefinesForEditing(filename,parsingOptions) member art.TryFindOwningProject_DEPRECATED(rdt:IVsRunningDocumentTable, filename) = From 55859f9368a391052f7bd1aac0d20debcd6d6914 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 24 Oct 2017 22:17:49 +0300 Subject: [PATCH 048/150] fix auto opens --- src/fsharp/vs/ServiceAnalysis.fs | 19 ++++++++++++++----- .../tests/unittests/UnusedOpensTests.fs | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 7ed8b0e3e1e..cac4ef3962e 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -93,11 +93,20 @@ module UnusedOpens = let getUsedModules (openStatement: OpenStatement) = let notAlreadyUsedModuleGroups = openStatement.Modules - |> List.filter (fun x -> - not (usedModules - |> List.exists (fun used -> - rangeContainsRange used.AppliedScope openStatement.AppliedScope && - x.Modules |> List.exists (fun x -> not x.IsNestedAutoOpen && used.Module.IsEffectivelySameAs x.Entity)))) + |> List.choose (fun x -> + let notUsedModules = + x.Modules + |> List.filter (fun x -> + not (usedModules + |> List.exists (fun used -> + rangeContainsRange used.AppliedScope openStatement.AppliedScope && + used.Module.IsEffectivelySameAs x.Entity))) + + match notUsedModules with + | [] -> None + | _ when notUsedModules |> List.exists (fun x -> not x.IsNestedAutoOpen) -> + Some { Modules = notUsedModules } + | _ -> None) match notAlreadyUsedModuleGroups with | [] -> [] diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index cb249be7afb..6f50fa11937 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -183,6 +183,25 @@ open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 let _ = Class() """ => [ 13, (5, 68) ] + +[] +let ``opening parent module after one of its auto open module was opened should be marked as unused``() = + """ +module NormalModule = + [] + module AutoOpenModule1 = + module NestedNormalModule = + [] + module AutoOpenModule2 = + [] + module AutoOpenModule3 = + type Class() = class end + +open NormalModule.AutoOpenModule1.NestedNormalModule.AutoOpenModule2 +open NormalModule.AutoOpenModule1.NestedNormalModule +let _ = Class() +""" + => [ 13, (5, 52) ] [] let ``open declaration is not marked as unused if there is a shortened attribute symbol from it``() = From aacb7966880f0d55f88b76369369a9cd77a25c00 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 25 Oct 2017 10:26:06 +0300 Subject: [PATCH 049/150] fix tests --- tests/service/EditorTests.fs | 21 ++++++----- tests/service/ProjectAnalysisTests.fs | 53 ++++++++++++++------------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 3696dabdf63..541ae2c5703 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -634,15 +634,18 @@ let _ = let r = su.RangeAlternate su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) |> shouldEqual - [|("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)) + // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces + [|("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + ("System", (2, 5, 2, 11)); ("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))|] [] diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 2477763aa40..1a345c4a76b 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -3688,32 +3688,33 @@ let ``Test Project25 symbol uses of type-provided members`` () = allUses |> shouldEqual - [|("FSharp.Data", "file1", ((3, 5), (3, 16)), ["namespace"; "provided"]); - ("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"])|] + [|("FSharp.Data", "file1", ((3, 5), (3, 16)), ["namespace"; "provided"]); + ("Microsoft.FSharp.Data", "file1", ((3, 5), (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 From d225014a372a391ca3fd320e0a581ccbd5588e13 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 25 Oct 2017 11:29:42 +0300 Subject: [PATCH 050/150] handle C# extension methods --- src/fsharp/vs/ServiceAnalysis.fs | 9 +++++++++ .../tests/unittests/UnusedOpensTests.fs | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index cac4ef3962e..c3348593cd2 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -8,6 +8,7 @@ open Microsoft.FSharp.Compiler.Range module UnusedOpens = open Microsoft.FSharp.Compiler.PrettyNaming + open System.Runtime.CompilerServices type Module = { Entity: FSharpEntity @@ -24,6 +25,14 @@ module UnusedOpens = if ent.IsFSharpUnion && not (Symbol.hasAttribute ent.Attributes) then for unionCase in ent.UnionCases do yield upcast unionCase + + if Symbol.hasAttribute ent.Attributes then + for fv in ent.MembersFunctionsAndValues do + // fv.IsExtensionMember is always false for C# extension methods returning by `MembersFunctionsAndValues`, + // so we have to check Extension attribute instead. + // (note: fv.IsExtensionMember has proper value for symbols returning by GetAllUsesOfAllSymbolsInFile though) + if Symbol.hasAttribute fv.Attributes then + yield upcast fv for fv in this.Entity.MembersFunctionsAndValues do yield upcast fv diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 6f50fa11937..bb64f920faa 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -703,4 +703,23 @@ let _ = x """ => [] +[] +let ``C# extension methods are taken into account``() = + """ +open System.Linq + +module Test = + let xs = [] + let _ = xs.ToList() +""" + => [] +[] +let ``namespace which contains types with C# extension methods is marked as unused if no extension is used``() = + """ +open System.Linq + +module Test = + let xs = [] +""" + => [ 2, (5, 16) ] From 06768486232f54a5d3859d667b30ff1be3a554c5 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 25 Oct 2017 16:39:54 +0300 Subject: [PATCH 051/150] do not use MembersFunctionsAndValues --- src/fsharp/vs/ServiceAnalysis.fs | 18 +++++++++++++++--- .../UnusedOpensDiagnosticAnalyzer.fs | 5 ++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index c3348593cd2..e0fa2a5718e 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -126,9 +126,21 @@ module UnusedOpens = modulGroup.Modules |> List.exists (fun modul -> symbolUsesInScope - |> Array.exists (fun symbolUse -> - modul.ChildSymbols - |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)))) + |> Array.exists (fun symbolUse -> + match symbolUse.Symbol with + | :? FSharpMemberOrFunctionOrValue as f -> + match f.EnclosingEntity with + | Some enclosingEntity -> enclosingEntity.IsEffectivelySameAs modul.Entity + | _ -> false + | _ -> false + //| :? FSharpEntity as ent -> + // match ent. EnclosingEntity with + // | Some enclosingEntity -> enclosingEntity.IsEffectivelySameAs modul.Entity + // | _ -> false + + //modul.ChildSymbols + //|> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)))) + ))) |> List.collect (fun mg -> mg.Modules |> List.map (fun x -> { Module = x.Entity; AppliedScope = openStatement.AppliedScope })) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 10b266d2735..67d927e8442 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -43,7 +43,10 @@ type internal UnusedOpensDiagnosticAnalyzer() = do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) - return! UnusedOpens.getUnusedOpens(checkResults, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) |> liftAsync + let sw = Stopwatch.StartNew() + let! unusedOpens = UnusedOpens.getUnusedOpens(checkResults, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) |> liftAsync + Logging.Logging.logInfof "*** Got %d unused opens in %O" unusedOpens.Length sw.Elapsed + return unusedOpens } override this.AnalyzeSemanticsAsync(document: Document, cancellationToken: CancellationToken) = From 26526dde5f0ecc0260b9ce7a6396cc8792faae7f Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 25 Oct 2017 16:57:59 +0300 Subject: [PATCH 052/150] wip --- src/fsharp/vs/ServiceAnalysis.fs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index e0fa2a5718e..d5e86874192 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -127,19 +127,15 @@ module UnusedOpens = |> List.exists (fun modul -> symbolUsesInScope |> Array.exists (fun symbolUse -> - match symbolUse.Symbol with - | :? FSharpMemberOrFunctionOrValue as f -> - match f.EnclosingEntity with - | Some enclosingEntity -> enclosingEntity.IsEffectivelySameAs modul.Entity - | _ -> false - | _ -> false - //| :? FSharpEntity as ent -> - // match ent. EnclosingEntity with - // | Some enclosingEntity -> enclosingEntity.IsEffectivelySameAs modul.Entity - // | _ -> false - - //modul.ChildSymbols - //|> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol)))) + //match symbolUse.Symbol with + //| :? FSharpMemberOrFunctionOrValue as f -> + // match f.EnclosingEntity with + // | Some enclosingEntity -> Some (enclosingEntity.IsEffectivelySameAs modul.Entity) + // | _ -> None + //| _ -> None + //|> Option.defaultWith (fun () -> + modul.ChildSymbols + |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol) ))) |> List.collect (fun mg -> mg.Modules |> List.map (fun x -> { Module = x.Entity; AppliedScope = openStatement.AppliedScope })) From d6fade9e2e9094ecdcca04fc9a9142257b39846e Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 25 Oct 2017 20:44:08 +0300 Subject: [PATCH 053/150] use EnclosingEntity if available --- src/fsharp/vs/ServiceAnalysis.fs | 23 ++++++++++--------- .../UnusedOpensDiagnosticAnalyzer.fs | 4 ++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index d5e86874192..13f1c14ca96 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -33,12 +33,12 @@ module UnusedOpens = // (note: fv.IsExtensionMember has proper value for symbols returning by GetAllUsesOfAllSymbolsInFile though) if Symbol.hasAttribute fv.Attributes then yield upcast fv - - for fv in this.Entity.MembersFunctionsAndValues do - yield upcast fv for apCase in this.Entity.ActivePatternCases do yield upcast apCase + + for fv in this.Entity.MembersFunctionsAndValues do + yield upcast fv } |> Seq.cache type ModuleGroup = @@ -127,16 +127,17 @@ module UnusedOpens = |> List.exists (fun modul -> symbolUsesInScope |> Array.exists (fun symbolUse -> - //match symbolUse.Symbol with - //| :? FSharpMemberOrFunctionOrValue as f -> - // match f.EnclosingEntity with - // | Some enclosingEntity -> Some (enclosingEntity.IsEffectivelySameAs modul.Entity) - // | _ -> None - //| _ -> None - //|> Option.defaultWith (fun () -> + match symbolUse.Symbol with + | :? FSharpMemberOrFunctionOrValue as f -> + match f.EnclosingEntity with + | Some ent when ent.IsNamespace || ent.IsFSharpModule -> + Some (ent.IsEffectivelySameAs modul.Entity) + | _ -> None + | _ -> None + |> Option.defaultWith (fun () -> modul.ChildSymbols |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol) - ))) + )))) |> List.collect (fun mg -> mg.Modules |> List.map (fun x -> { Module = x.Entity; AppliedScope = openStatement.AppliedScope })) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs index 67d927e8442..88568b4a2a2 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs @@ -43,9 +43,13 @@ type internal UnusedOpensDiagnosticAnalyzer() = do! Option.guard Settings.CodeFixes.UnusedOpens let! sourceText = document.GetTextAsync() let! _, _, checkResults = checker.ParseAndCheckDocument(document, options, sourceText = sourceText, allowStaleResults = true, userOpName = userOpName) +#if DEBUG let sw = Stopwatch.StartNew() +#endif let! unusedOpens = UnusedOpens.getUnusedOpens(checkResults, fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString()) |> liftAsync +#if DEBUG Logging.Logging.logInfof "*** Got %d unused opens in %O" unusedOpens.Length sw.Elapsed +#endif return unusedOpens } From ba6e2b83abc620112f665214d622bc26c852d7db Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 26 Oct 2017 10:36:44 +0300 Subject: [PATCH 054/150] fix compilation --- src/fsharp/vs/ServiceAnalysis.fs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/fsharp/vs/ServiceAnalysis.fs b/src/fsharp/vs/ServiceAnalysis.fs index 13f1c14ca96..5923459c031 100644 --- a/src/fsharp/vs/ServiceAnalysis.fs +++ b/src/fsharp/vs/ServiceAnalysis.fs @@ -127,17 +127,18 @@ module UnusedOpens = |> List.exists (fun modul -> symbolUsesInScope |> Array.exists (fun symbolUse -> - match symbolUse.Symbol with - | :? FSharpMemberOrFunctionOrValue as f -> - match f.EnclosingEntity with - | Some ent when ent.IsNamespace || ent.IsFSharpModule -> - Some (ent.IsEffectivelySameAs modul.Entity) - | _ -> None - | _ -> None - |> Option.defaultWith (fun () -> - modul.ChildSymbols - |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol) - )))) + let usedByEnclosingEntity = + match symbolUse.Symbol with + | :? FSharpMemberOrFunctionOrValue as f -> + match f.EnclosingEntity with + | Some ent when ent.IsNamespace || ent.IsFSharpModule -> + Some (ent.IsEffectivelySameAs modul.Entity) + | _ -> None + | _ -> None + match usedByEnclosingEntity with + | Some x -> x + | None -> modul.ChildSymbols |> Seq.exists (fun x -> x.IsEffectivelySameAs symbolUse.Symbol) + ))) |> List.collect (fun mg -> mg.Modules |> List.map (fun x -> { Module = x.Entity; AppliedScope = openStatement.AppliedScope })) From b9bca6a8c9025571cfedab5eca153c2fef1497a5 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Thu, 26 Oct 2017 14:31:32 -0700 Subject: [PATCH 055/150] Merge dev15.5 to dev15.6 (#3825) * don't update project info if the source file collection is empty (#3792) * install templates VSIX to a unique directory (#3804) * P2p references (#3777) * P2p references * Fix test * test fix * go faster stripes * new project works better * Re-add debug assert for sourcefiles * Parameterise rc location (#3744) * Fix issues --- .../Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index addf142025c..6fa0bbfbc68 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -35,7 +35,7 @@ true true CommonExtensions - Microsoft\FSharp + Microsoft\FSharpTemplates None Debug AnyCPU From 01938e2f15a46fabfb211a07eab998a3c464e454 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Thu, 26 Oct 2017 14:34:08 -0700 Subject: [PATCH 056/150] Merge master to dev15.6 (#3826) * Put nupkgs into artifacts (#3806) * Make FCS build work on Jenkins (#3788) --- .gitignore | 3 + build.cmd | 6 + build.sh | 8 + fcs/.paket/Paket.Restore.targets | 225 ---------- ...FSharp.Compiler.Service.MSBuild.v12.fsproj | 2 +- .../ProjectCracker.fs | 60 ++- ...Compiler.Service.ProjectCrackerTool.fsproj | 83 +++- .../Program.fs | 37 +- .../ProjectCrackerTool.fs | 406 +++++++++--------- .../paket.references | 4 + .../FSharp.Compiler.Service.Tests.fsproj | 66 ++- .../paket.references | 3 + fcs/build.cmd | 3 - fcs/build.fsx | 78 ++-- fcs/build.sh | 8 +- .../MSBuild.v14.0/Microsoft.Build.Engine.dll | Bin 742616 -> 0 bytes .../Microsoft.Build.Framework.dll | Bin 101608 -> 0 bytes .../MSBuild.v14.0/Microsoft.Build.dll | Bin 1521336 -> 0 bytes fcs/dependencies/README.md | 0 fcs/paket.dependencies | 7 +- fcs/paket.lock | 16 +- netci.groovy | 2 +- tests/service/ProjectOptionsTests.fs | 58 ++- tests/service/data/Test3.fsproj | 62 +++ 24 files changed, 612 insertions(+), 525 deletions(-) delete mode 100644 fcs/.paket/Paket.Restore.targets create mode 100644 fcs/FSharp.Compiler.Service.ProjectCrackerTool/paket.references create mode 100644 fcs/FSharp.Compiler.Service.Tests/paket.references delete mode 100644 fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Engine.dll delete mode 100644 fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Framework.dll delete mode 100644 fcs/dependencies/MSBuild.v14.0/Microsoft.Build.dll delete mode 100644 fcs/dependencies/README.md create mode 100644 tests/service/data/Test3.fsproj diff --git a/.gitignore b/.gitignore index 1a7e530e494..a4c90c19878 100644 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,6 @@ tests/fsharpqa/testenv/bin/System.ValueTuple.dll */.fake /fcs/packages/ */paket-files/ +/fcs/TestResult.xml +/tests/fcs/ +/fcs/.paket/Paket.Restore.targets diff --git a/build.cmd b/build.cmd index b24937a8647..7431a36c19e 100644 --- a/build.cmd +++ b/build.cmd @@ -538,10 +538,16 @@ set _ngenexe="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\ngen.exe" if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure echo ---------------- Done with prepare, starting package restore ---------------- + set _nugetexe="%~dp0.nuget\NuGet.exe" set _nugetconfig="%~dp0.nuget\NuGet.Config" if "%RestorePackages%" == "true" ( + cd fcs + .paket\paket.exe restore + cd.. + @if ERRORLEVEL 1 echo Error: Paket restore failed && goto :failure + %_ngenexe% install %_nugetexe% /nologo %_nugetexe% restore packages.config -PackagesDirectory packages -ConfigFile %_nugetconfig% diff --git a/build.sh b/build.sh index 6c3323a4f9b..561a129c522 100755 --- a/build.sh +++ b/build.sh @@ -412,6 +412,14 @@ _nugetconfig=".nuget/NuGet.Config" # Restore packages (default to restoring packages if otherwise unspecified). if [ "${RestorePackages:-true}" = 'true' ]; then + cd fcs + mono .paket/paket.exe restore + cd .. + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + eval "$_nugetexe restore packages.config -PackagesDirectory packages -ConfigFile $_nugetconfig" if [ $? -ne 0 ]; then failwith "Nuget restore failed" diff --git a/fcs/.paket/Paket.Restore.targets b/fcs/.paket/Paket.Restore.targets deleted file mode 100644 index 67f745a3671..00000000000 --- a/fcs/.paket/Paket.Restore.targets +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - true - $(MSBuildThisFileDirectory) - $(MSBuildThisFileDirectory)..\ - $(PaketRootPath)paket-files\paket.restore.cached - $(PaketRootPath)paket.lock - /Library/Frameworks/Mono.framework/Commands/mono - mono - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - "$(PaketExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" - $(PaketRootPath)paket.bootstrapper.exe - $(PaketToolsPath)paket.bootstrapper.exe - "$(PaketBootStrapperExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" - - - - - true - true - - - - - - - true - $(NoWarn);NU1603 - - - - $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) - $([System.IO.File]::ReadAllText('$(PaketLockFilePath)')) - true - false - true - - - - - - - - - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached - - $(MSBuildProjectFullPath).paket.references - - $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references - - $(MSBuildProjectDirectory)\paket.references - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved - true - references-file-or-cache-not-found - - - - - $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)')) - $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)')) - references-file - false - - - - - false - - - - - true - target-framework '$(TargetFramework)' - - - - - - - - - - - - - - - - - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) - - - %(PaketReferencesFileLinesInfo.PackageVersion) - - - - - $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).NuGet.Config - - - - - - - false - - - - - - $(MSBuildProjectDirectory)/$(MSBuildProjectFile) - true - false - true - - - - <_NuspecFiles Include="$(BaseIntermediateOutputPath)*.nuspec"/> - - - - - - - - - - - - - - - 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 e929138c567..f66cda2f775 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 @@ -89,4 +89,4 @@ - \ No newline at end of file + diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index 45fab18685b..7a36085de06 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -8,18 +8,17 @@ open System.Diagnostics open System.Text open System.IO open System +open System.Xml -type ProjectCracker = - static member GetProjectOptionsFromProjectFileLogged(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp, ?enableLogging) = - let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading - let properties = defaultArg properties [] - let enableLogging = defaultArg enableLogging true +module Utils = + + let Convert loadedTimeStamp (originalOpts: ProjectCrackerTool.ProjectOptions) = let logMap = ref Map.empty - let rec convert (opts: ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions = + let rec convertProject (opts: ProjectCrackerTool.ProjectOptions) = if not (isNull opts.Error) then failwith opts.Error - let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions + let referencedProjects() = Array.map (fun (a, b) -> a,convertProject b) opts.ReferencedProjectOptions let sourceFiles, otherOptions = opts.Options @@ -41,7 +40,7 @@ type ProjectCracker = { ProjectFileName = opts.ProjectFile SourceFiles = sourceFiles OtherOptions = otherOptions - ReferencedProjects = referencedProjects + ReferencedProjects = referencedProjects() IsIncompleteTypeCheckEnvironment = false UseScriptResolutionRules = false LoadTime = loadedTimeStamp @@ -50,6 +49,16 @@ type ProjectCracker = ExtraProjectInfo = None Stamp = None } + convertProject originalOpts, !logMap + +type ProjectCracker = + + static member GetProjectOptionsFromProjectFileLogged(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp, ?enableLogging) = + let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading + let properties = defaultArg properties [] + let enableLogging = defaultArg enableLogging true + + #if NETSTANDARD1_6 let arguments = [| yield projectFileName @@ -70,20 +79,47 @@ type ProjectCracker = let codebase = Path.GetDirectoryName(Uri(typeof.Assembly.CodeBase).LocalPath) let crackerFilename = Path.Combine(codebase,"FSharp.Compiler.Service.ProjectCrackerTool.exe") - if not (File.Exists crackerFilename) then failwithf "ProjectCracker exe not found at: %s it must be next to the ProjectCracker dll." crackerFilename + if not (File.Exists crackerFilename) then + failwithf "ProjectCracker exe not found at: %s it must be next to the ProjectCracker dll." crackerFilename + let p = new System.Diagnostics.Process() + p.StartInfo.FileName <- crackerFilename p.StartInfo.Arguments <- arguments.ToString() p.StartInfo.UseShellExecute <- false p.StartInfo.CreateNoWindow <- true p.StartInfo.RedirectStandardOutput <- true + p.StartInfo.RedirectStandardError <- true + + let sbOut = StringBuilder() + let sbErr = StringBuilder() + + p.ErrorDataReceived.AddHandler(fun _ a -> sbErr.AppendLine a.Data |> ignore) + p.OutputDataReceived.AddHandler(fun _ a -> sbOut.AppendLine a.Data |> ignore) + ignore <| p.Start() - let ser = new DataContractJsonSerializer(typeof) - let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> ProjectCrackerTool.ProjectOptions + p.EnableRaisingEvents <- true + p.BeginOutputReadLine() + p.BeginErrorReadLine() + + p.WaitForExit() + + let crackerOut = sbOut.ToString() + let crackerErr = sbErr.ToString() + + let opts = + try + let ser = new DataContractJsonSerializer(typeof) + let stringBytes = Encoding.Unicode.GetBytes crackerOut + use ms = new MemoryStream(stringBytes) + ser.ReadObject(ms) :?> ProjectCrackerTool.ProjectOptions + with + exn -> + raise (Exception(sprintf "error parsing ProjectCrackerTool output, stdoutput was:\n%s\n\nstderr was:\n%s" crackerOut crackerErr, exn)) #endif - convert opts, !logMap + Utils.Convert loadedTimeStamp opts static member GetProjectOptionsFromProjectFile(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp) = fst (ProjectCracker.GetProjectOptionsFromProjectFileLogged( 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 07bae7e5765..66d196a1d54 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -46,24 +46,9 @@ + - - $(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Framework.dll - false - - - $(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Engine.dll - false - - - $(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.dll - false - - - $(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v12.0/Microsoft.Build.Utilities.v12.0.dll - false - @@ -71,13 +56,75 @@ - $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.4.1.20\lib\profiles\net40\FSharp.Core.dll false - + + + + + ..\packages\Microsoft.Build\lib\net45\Microsoft.Build.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Engine\lib\net45\Microsoft.Build.Engine.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Framework\lib\net45\Microsoft.Build.Framework.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Utilities.Core\lib\net45\Microsoft.Build.Utilities.Core.dll + True + True + + + + + + + + + True + + + + + + + + + ..\packages\System.Threading.Tasks.Dataflow\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll + True + True + + + + \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/Program.fs b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/Program.fs index ed8a8b15992..7ce360c312f 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/Program.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/Program.fs @@ -1,21 +1,46 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool open System -open System.IO +open System.Reflection open System.Runtime.Serialization.Json module Program = - [] - let main argv = - let text = Array.exists (fun (s: string) -> s = "--text") argv - let argv = Array.filter (fun (s: string) -> s <> "--text") argv +#if !DOTNETCORE + let addMSBuildv14BackupResolution () = + let onResolveEvent = new ResolveEventHandler(fun sender evArgs -> + let requestedAssembly = AssemblyName(evArgs.Name) + if requestedAssembly.Name.StartsWith("Microsoft.Build") && + not (requestedAssembly.Name.EndsWith(".resources")) && + not (requestedAssembly.Version.ToString().Contains("12.0.0.0")) + then + // If the version of MSBuild that we're using wasn't present on the machine, then + // just revert back to 12.0.0.0 since that's normally installed as part of the .NET + // Framework. + requestedAssembly.Version <- Version("12.0.0.0") + Assembly.Load requestedAssembly + else + null) + AppDomain.CurrentDomain.add_AssemblyResolve(onResolveEvent) +#endif + let crackAndSendOutput asText argv = let ret, opts = ProjectCrackerTool.crackOpen argv - if text then + if asText then printfn "%A" opts else let ser = new DataContractJsonSerializer(typeof) ser.WriteObject(Console.OpenStandardOutput(), opts) ret + + + [][] + let main argv = + let asText = Array.exists (fun (s: string) -> s = "--text") argv + let argv = Array.filter (fun (s: string) -> s <> "--text") argv + +#if !DOTNETCORE + addMSBuildv14BackupResolution () +#endif + crackAndSendOutput asText argv diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs index 9be9c375370..a20c7a33c0e 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs @@ -2,12 +2,13 @@ open System open System.IO -open System.Reflection open System.Text open Microsoft.Build.Framework open Microsoft.Build.Utilities module internal ProjectCrackerTool = + open System.Collections.Generic + open Microsoft.Build.Evaluation let runningOnMono = #if DOTNETCORE @@ -36,17 +37,159 @@ module internal ProjectCrackerTool = member th.Compile(_:obj, _:obj, _:obj) = 0 interface ITaskHost + let vs = + let programFiles = + let getEnv v = + let result = System.Environment.GetEnvironmentVariable(v) + match result with + | null -> None + | _ -> Some result + + match List.tryPick getEnv [ "ProgramFiles(x86)"; "ProgramFiles" ] with + | Some r -> r + | None -> "C:\\Program Files (x86)" + + let vsVersions = ["14.0"; "12.0"] + let msbuildBin v = IO.Path.Combine(programFiles, "MSBuild", v, "Bin", "MSBuild.exe") + List.tryFind (fun v -> IO.File.Exists(msbuildBin v)) vsVersions + + let mkAbsolute dir v = + if Path.IsPathRooted v then v + else Path.Combine(dir, v) + + let mkAbsoluteOpt dir v = Option.map (mkAbsolute dir) v + + let CrackProjectUsingNewBuildAPI fsprojFile properties logOpt = + let fsprojFullPath = try Path.GetFullPath(fsprojFile) with _ -> fsprojFile + let fsprojAbsDirectory = Path.GetDirectoryName fsprojFullPath + + use _pwd = + let dir = Directory.GetCurrentDirectory() + Directory.SetCurrentDirectory(fsprojAbsDirectory) + { new System.IDisposable with + member x.Dispose() = Directory.SetCurrentDirectory(dir) } + use engine = new Microsoft.Build.Evaluation.ProjectCollection() + let host = new HostCompile() + + engine.HostServices.RegisterHostObject(fsprojFullPath, "CoreCompile", "Fsc", host) + + let projectInstanceFromFullPath (fsprojFullPath: string) = + use file = new FileStream(fsprojFullPath, FileMode.Open, FileAccess.Read, FileShare.Read) + use stream = new StreamReader(file) + use xmlReader = System.Xml.XmlReader.Create(stream) + + let project = + try + engine.LoadProject(xmlReader, FullPath=fsprojFullPath) + with + | exn -> + let tools = engine.Toolsets |> Seq.map (fun x -> x.ToolsPath) |> Seq.toList + raise (new Exception(sprintf "Could not load project %s in ProjectCollection. Available tools: %A. Message: %s" fsprojFullPath tools exn.Message)) + + project.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore + if not (List.exists (fun (p,_) -> p = "VisualStudioVersion") properties) then + match vs with + | Some version -> project.SetGlobalProperty("VisualStudioVersion", version) |> ignore + | None -> () + project.SetGlobalProperty("ShouldUnsetParentConfigurationAndPlatform", "false") |> ignore + for (prop, value) in properties do + project.SetGlobalProperty(prop, value) |> ignore + + project.CreateProjectInstance() + + let project = projectInstanceFromFullPath fsprojFullPath + let directory = project.Directory + + let getprop (p: Microsoft.Build.Execution.ProjectInstance) s = + let v = p.GetPropertyValue s + if String.IsNullOrWhiteSpace v then None + else Some v + + let outFileOpt = getprop project "TargetPath" + + let log = match logOpt with + | None -> [] + | Some l -> [l :> ILogger] + + project.Build([| "Build" |], log) |> ignore + + let getItems s = [ for f in project.GetItems(s) -> mkAbsolute directory f.EvaluatedInclude ] + + let projectReferences = + [ for cp in project.GetItems("ProjectReference") do + yield cp.GetMetadataValue("FullPath") + ] + + let references = + [ for i in project.GetItems("ReferencePath") do + yield i.EvaluatedInclude + for i in project.GetItems("ChildProjectReferences") do + yield i.EvaluatedInclude ] + + outFileOpt, directory, getItems, references, projectReferences, getprop project, project.FullPath + +#if !DOTNETCORE + let CrackProjectUsingOldBuildAPI (fsprojFile:string) properties logOpt = + let engine = new Microsoft.Build.BuildEngine.Engine() + Option.iter (fun l -> engine.RegisterLogger(l)) logOpt + + let bpg = Microsoft.Build.BuildEngine.BuildPropertyGroup() + + bpg.SetProperty("BuildingInsideVisualStudio", "true") + for (prop, value) in properties do + bpg.SetProperty(prop, value) + + engine.GlobalProperties <- bpg + + let projectFromFile (fsprojFile:string) = + // We seem to need to pass 12.0/4.0 in here for some unknown reason + let project = new Microsoft.Build.BuildEngine.Project(engine, engine.DefaultToolsVersion) + do project.Load(fsprojFile) + project + + let project = projectFromFile fsprojFile + project.Build([| "ResolveReferences" |]) |> ignore + let directory = Path.GetDirectoryName project.FullFileName + + let getProp (p: Microsoft.Build.BuildEngine.Project) s = + let v = p.GetEvaluatedProperty s + if String.IsNullOrWhiteSpace v then None + else Some v + + let outFileOpt = + match mkAbsoluteOpt directory (getProp project "OutDir") with + | None -> None + | Some d -> mkAbsoluteOpt d (getProp project "TargetFileName") + + let getItems s = + let fs = project.GetEvaluatedItemsByName(s) + [ for f in fs -> mkAbsolute directory f.FinalItemSpec ] + + let projectReferences = + [ for i in project.GetEvaluatedItemsByName("ProjectReference") do + yield mkAbsolute directory i.FinalItemSpec + ] + + let references = + [ for i in project.GetEvaluatedItemsByName("ReferencePath") do + yield i.FinalItemSpec + for i in project.GetEvaluatedItemsByName("ChildProjectReferences") do + yield i.FinalItemSpec ] + // Duplicate slashes sometimes appear in the output here, which prevents + // them from matching keys used in FSharpProjectOptions.ReferencedProjects + |> List.map (fun (s: string) -> s.Replace("//","/")) + + outFileOpt, directory, getItems, references, projectReferences, getProp project, project.FullFileName + +#endif + //---------------------------------------------------------------------------- // FSharpProjectFileInfo // [] type FSharpProjectFileInfo (fsprojFileName:string, ?properties, ?enableLogging) = - let properties = defaultArg properties [] let enableLogging = defaultArg enableLogging false - let mkAbsolute dir v = - if Path.IsPathRooted v then v - else Path.Combine(dir, v) let logOpt = if enableLogging then @@ -55,152 +198,17 @@ module internal ProjectCrackerTool = Some log else None - -#if !DOTNETCORE - let mkAbsoluteOpt dir v = Option.map (mkAbsolute dir) v - - let CrackProjectUsingOldBuildAPI(fsprojFile:string) = - let engine = new Microsoft.Build.BuildEngine.Engine() - Option.iter (fun l -> engine.RegisterLogger(l)) logOpt - - let bpg = Microsoft.Build.BuildEngine.BuildPropertyGroup() - - bpg.SetProperty("BuildingInsideVisualStudio", "true") - for (prop, value) in properties do - bpg.SetProperty(prop, value) - - engine.GlobalProperties <- bpg - - let projectFromFile (fsprojFile:string) = - // We seem to need to pass 12.0/4.0 in here for some unknown reason - let project = new Microsoft.Build.BuildEngine.Project(engine, engine.DefaultToolsVersion) - do project.Load(fsprojFile) - project - - let project = projectFromFile fsprojFile - project.Build([| "ResolveReferences" |]) |> ignore - let directory = Path.GetDirectoryName project.FullFileName - - let getProp (p: Microsoft.Build.BuildEngine.Project) s = - let v = p.GetEvaluatedProperty s - if String.IsNullOrWhiteSpace v then None - else Some v - - let outFileOpt = - match mkAbsoluteOpt directory (getProp project "OutDir") with - | None -> None - | Some d -> mkAbsoluteOpt d (getProp project "TargetFileName") - - let getItems s = - let fs = project.GetEvaluatedItemsByName(s) - [ for f in fs -> mkAbsolute directory f.FinalItemSpec ] - - let projectReferences = - [ for i in project.GetEvaluatedItemsByName("ProjectReference") do - yield mkAbsolute directory i.FinalItemSpec - ] - - let references = - [ for i in project.GetEvaluatedItemsByName("ReferencePath") do - yield i.FinalItemSpec - for i in project.GetEvaluatedItemsByName("ChildProjectReferences") do - yield i.FinalItemSpec ] - // Duplicate slashes sometimes appear in the output here, which prevents - // them from matching keys used in FSharpProjectOptions.ReferencedProjects - |> List.map (fun (s: string) -> s.Replace("//","/")) - - outFileOpt, directory, getItems, references, projectReferences, getProp project, project.FullFileName -#endif - - let vs = - let programFiles = - let getEnv v = - let result = System.Environment.GetEnvironmentVariable(v) - match result with - | null -> None - | _ -> Some result - - match List.tryPick getEnv [ "ProgramFiles(x86)"; "ProgramFiles" ] with - | Some r -> r - | None -> "C:\\Program Files (x86)" - - let vsVersions = ["14.0"; "12.0"] - let msbuildBin v = IO.Path.Combine(programFiles, "MSBuild", v, "Bin", "MSBuild.exe") - List.tryFind (fun v -> IO.File.Exists(msbuildBin v)) vsVersions - - let CrackProjectUsingNewBuildAPI(fsprojFile) = - let fsprojFullPath = try Path.GetFullPath(fsprojFile) with _ -> fsprojFile - let fsprojAbsDirectory = Path.GetDirectoryName fsprojFullPath - - use _pwd = - let dir = Directory.GetCurrentDirectory() - Directory.SetCurrentDirectory(fsprojAbsDirectory) - { new System.IDisposable with - member x.Dispose() = Directory.SetCurrentDirectory(dir) } - use engine = new Microsoft.Build.Evaluation.ProjectCollection() - let host = new HostCompile() - engine.HostServices.RegisterHostObject(fsprojFullPath, "CoreCompile", "Fsc", host) - - - let projectInstanceFromFullPath (fsprojFullPath: string) = - use file = new FileStream(fsprojFullPath, FileMode.Open, FileAccess.Read, FileShare.Read) - use stream = new StreamReader(file) - use xmlReader = System.Xml.XmlReader.Create(stream) - - let project = engine.LoadProject(xmlReader, FullPath=fsprojFullPath) - - project.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore - if not (List.exists (fun (p,_) -> p = "VisualStudioVersion") properties) then - match vs with - | Some version -> project.SetGlobalProperty("VisualStudioVersion", version) |> ignore - | None -> () - project.SetGlobalProperty("ShouldUnsetParentConfigurationAndPlatform", "false") |> ignore - for (prop, value) in properties do - project.SetGlobalProperty(prop, value) |> ignore - - project.CreateProjectInstance() - - let project = projectInstanceFromFullPath fsprojFullPath - let directory = project.Directory - - let getprop (p: Microsoft.Build.Execution.ProjectInstance) s = - let v = p.GetPropertyValue s - if String.IsNullOrWhiteSpace v then None - else Some v - - let outFileOpt = getprop project "TargetPath" - - let log = match logOpt with - | None -> [] - | Some l -> [l :> ILogger] - - project.Build([| "Build" |], log) |> ignore - - let getItems s = [ for f in project.GetItems(s) -> mkAbsolute directory f.EvaluatedInclude ] - - let projectReferences = - [ for cp in project.GetItems("ProjectReference") do - yield cp.GetMetadataValue("FullPath") - ] - - let references = - [ for i in project.GetItems("ReferencePath") do - yield i.EvaluatedInclude - for i in project.GetItems("ChildProjectReferences") do - yield i.EvaluatedInclude ] - - outFileOpt, directory, getItems, references, projectReferences, getprop project, project.FullPath - + let outFileOpt, directory, getItems, references, projectReferences, getProp, fsprojFullPath = try #if DOTNETCORE - CrackProjectUsingNewBuildAPI(fsprojFileName) + CrackProjectUsingNewBuildAPI fsprojFileName properties logOpt with #else if runningOnMono then - CrackProjectUsingOldBuildAPI(fsprojFileName) + CrackProjectUsingOldBuildAPI fsprojFileName properties logOpt else - CrackProjectUsingNewBuildAPI(fsprojFileName) + CrackProjectUsingNewBuildAPI fsprojFileName properties logOpt with | :? Microsoft.Build.BuildEngine.InvalidProjectFileException as e -> raise (Microsoft.Build.Exceptions.InvalidProjectFileException( @@ -384,66 +392,57 @@ module internal ProjectCrackerTool = static member Parse(fsprojFileName:string, ?properties, ?enableLogging) = new FSharpProjectFileInfo(fsprojFileName, ?properties=properties, ?enableLogging=enableLogging) let getOptions file enableLogging properties = + let cache = new Dictionary<_,_>() let rec getOptions file : Option * ProjectOptions = - let parsedProject = FSharpProjectFileInfo.Parse(file, properties=properties, enableLogging=enableLogging) - let referencedProjectOptions = - [| for file in parsedProject.ProjectReferences do - if Path.GetExtension(file) = ".fsproj" then - match getOptions file with - | Some outFile, opts -> yield outFile, opts - | None, _ -> () |] - - // Workaround for Mono 4.2, which doesn't populate the subproject - // details anymore outside of a solution context. See https://github.com/mono/mono/commit/76c6a08e730393927b6851709cdae1d397cbcc3a#diff-59afd196a55d61d5d1eaaef7bd49d1e5 - // and some explanation from the author at https://github.com/fsharp/FSharp.Compiler.Service/pull/455#issuecomment-154103963 - // - // In particular we want the output path, which we can get from - // fully parsing that project itself. We also have to specially parse - // C# referenced projects, as we don't look at them otherwise. - let referencedProjectOutputs = - if runningOnMono then - [ yield! Array.map (fun (s,_) -> "-r:" + s) referencedProjectOptions - for file in parsedProject.ProjectReferences do - let ext = Path.GetExtension(file) - if ext = ".csproj" || ext = ".vbproj" then - let parsedProject = FSharpProjectFileInfo.Parse(file, properties=properties, enableLogging=false) - match parsedProject.OutputFile with - | None -> () - | Some f -> yield "-r:" + f ] - else - [] - - // On some versions of Mono the referenced projects are already - // correctly included, so we make sure not to introduce duplicates - |> List.filter (fun r -> not (Set.contains r (set parsedProject.Options))) - - let options = { ProjectFile = file - Options = Array.ofSeq (parsedProject.Options @ referencedProjectOutputs) - ReferencedProjectOptions = referencedProjectOptions - LogOutput = parsedProject.LogOutput - Error = null } - - parsedProject.OutputFile, options + match cache.TryGetValue file with + | true, option -> option + | _ -> + let parsedProject = FSharpProjectFileInfo.Parse(file, properties=properties, enableLogging=enableLogging) + + let referencedProjectOptions = + [| for file in parsedProject.ProjectReferences do + if Path.GetExtension(file) = ".fsproj" then + match getOptions file with + | Some outFile, opts -> yield outFile, opts + | None, _ -> () |] + + // Workaround for Mono 4.2, which doesn't populate the subproject + // details anymore outside of a solution context. See https://github.com/mono/mono/commit/76c6a08e730393927b6851709cdae1d397cbcc3a#diff-59afd196a55d61d5d1eaaef7bd49d1e5 + // and some explanation from the author at https://github.com/fsharp/FSharp.Compiler.Service/pull/455#issuecomment-154103963 + // + // In particular we want the output path, which we can get from + // fully parsing that project itself. We also have to specially parse + // C# referenced projects, as we don't look at them otherwise. + let referencedProjectOutputs = + if runningOnMono then + [ yield! Array.map (fun (s,_) -> "-r:" + s) referencedProjectOptions + for file in parsedProject.ProjectReferences do + let ext = Path.GetExtension(file) + if ext = ".csproj" || ext = ".vbproj" then + let parsedProject = FSharpProjectFileInfo.Parse(file, properties=properties, enableLogging=false) + match parsedProject.OutputFile with + | None -> () + | Some f -> yield "-r:" + f ] + else + [] + + // On some versions of Mono the referenced projects are already + // correctly included, so we make sure not to introduce duplicates + |> List.filter (fun r -> not (Set.contains r (set parsedProject.Options))) + + let options = { ProjectFile = file + Options = Array.ofSeq (parsedProject.Options @ referencedProjectOutputs) + ReferencedProjectOptions = referencedProjectOptions + LogOutput = parsedProject.LogOutput + Error = null } + + let result = parsedProject.OutputFile, options + cache.Add(file,result) + result snd (getOptions file) -#if !DOTNETCORE - let addMSBuildv14BackupResolution () = - let onResolveEvent = new ResolveEventHandler(fun sender evArgs -> - let requestedAssembly = AssemblyName(evArgs.Name) - if requestedAssembly.Name.StartsWith("Microsoft.Build") && - not (requestedAssembly.Name.EndsWith(".resources")) && - not (requestedAssembly.Version.ToString().Contains("12.0.0.0")) then - // If the version of MSBuild that we're using wasn't present on the machine, then - // just revert back to 12.0.0.0 since that's normally installed as part of the .NET - // Framework. - requestedAssembly.Version <- Version("12.0.0.0") - Assembly.Load (requestedAssembly) - else - null) - AppDomain.CurrentDomain.add_AssemblyResolve(onResolveEvent) -#endif - + let rec pairs l = match l with | [] | [_] -> [] @@ -456,9 +455,6 @@ module internal ProjectCrackerTool = | true, true -> true | _ -> false try -#if !DOTNETCORE - addMSBuildv14BackupResolution () -#endif let props = pairs (List.ofArray argv.[2..]) let opts = getOptions argv.[0] enableLogging props 0, opts @@ -466,8 +462,8 @@ module internal ProjectCrackerTool = 2, { ProjectFile = projectFile; Options = [||]; ReferencedProjectOptions = [||]; - LogOutput = e.ToString() - Error = e.Message } + LogOutput = e.ToString() + " StackTrace: " + e.StackTrace + Error = e.Message + " StackTrace: " + e.StackTrace } else 1, { ProjectFile = ""; Options = [||]; diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/paket.references b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/paket.references new file mode 100644 index 00000000000..3ad1f9662c7 --- /dev/null +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/paket.references @@ -0,0 +1,4 @@ +Microsoft.Build.Utilities.Core +Microsoft.Build.Engine +Microsoft.Build +System.Threading.Tasks.Dataflow \ No newline at end of file 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 98e86a06448..d53494b86f2 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -80,8 +80,8 @@ PreserveNewest + - @@ -97,7 +97,6 @@ - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll @@ -112,7 +111,6 @@ $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools\FSharp.Core.dll true - CSharp_Analysis {887630A3-4B1D-40EA-B8B3-2D842E9C40DB} @@ -130,4 +128,66 @@ + + + + + ..\packages\Microsoft.Build\lib\net45\Microsoft.Build.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Engine\lib\net45\Microsoft.Build.Engine.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Framework\lib\net45\Microsoft.Build.Framework.dll + True + True + + + + + + + + + ..\packages\Microsoft.Build.Utilities.Core\lib\net45\Microsoft.Build.Utilities.Core.dll + True + True + + + + + + + + + True + + + + + + + + + True + + + + \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.Tests/paket.references b/fcs/FSharp.Compiler.Service.Tests/paket.references new file mode 100644 index 00000000000..c64e284f16b --- /dev/null +++ b/fcs/FSharp.Compiler.Service.Tests/paket.references @@ -0,0 +1,3 @@ +Microsoft.Build.Utilities.Core +Microsoft.Build.Engine +Microsoft.Build \ No newline at end of file diff --git a/fcs/build.cmd b/fcs/build.cmd index f7242b03912..c18c0a1f227 100644 --- a/fcs/build.cmd +++ b/fcs/build.cmd @@ -1,11 +1,8 @@ @echo off -dotnet --version -.nuget\NuGet.exe restore -PackagesDirectory packages setlocal cd fcs -dotnet restore tools.fsproj if errorlevel 1 ( endlocal exit /b %errorlevel% diff --git a/fcs/build.fsx b/fcs/build.fsx index d3c850757e4..1e39de8bbb9 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -13,8 +13,22 @@ open Fake.ReleaseNotesHelper #if MONO // prevent incorrect output encoding (e.g. https://github.com/fsharp/FAKE/issues/1196) System.Console.OutputEncoding <- System.Text.Encoding.UTF8 + +CleanDir (__SOURCE_DIRECTORY__ + "/../tests/TestResults") +File.WriteAllText(__SOURCE_DIRECTORY__ + "/../tests/TestResults/notestsyet.txt","No tests yet") #endif +let dotnetExePath = DotNetCli.InstallDotNetSDK "2.0.2" + +let runDotnet workingDir args = + let result = + ExecProcess (fun info -> + info.FileName <- dotnetExePath + info.WorkingDirectory <- workingDir + info.Arguments <- args) TimeSpan.MaxValue + + if result <> 0 then failwithf "dotnet %s failed" args + // -------------------------------------------------------------------------------------- // Utilities // -------------------------------------------------------------------------------------- @@ -69,6 +83,22 @@ let buildVersion = else if isAppVeyorBuild then sprintf "%s-b%s" assemblyVersion AppVeyorEnvironment.BuildNumber else assemblyVersion +Target "Clean" (fun _ -> + CleanDir releaseDir +) + +Target "Restore" (fun _ -> + for p in (!! "./../**/packages.config") do + let result = + ExecProcess (fun info -> + info.FileName <- FullName @"./../.nuget/NuGet.exe" + info.WorkingDirectory <- FullName @"./.." + info.Arguments <- sprintf "restore %s -PackagesDirectory \"%s\" -ConfigFile \"%s\"" (FullName p) (FullName "./../packages") (FullName "./../.nuget/NuGet.Config")) TimeSpan.MaxValue + if result <> 0 then failwithf "nuget restore %s failed" p + + runDotnet __SOURCE_DIRECTORY__ "restore tools.fsproj" +) + Target "BuildVersion" (fun _ -> Shell.Exec("appveyor", sprintf "UpdateBuild -Version \"%s\"" buildVersion) |> ignore ) @@ -88,11 +118,24 @@ Target "Build.NetFx" (fun _ -> // Run the unit tests using test runner Target "Test.NetFx" (fun _ -> - !! (releaseDir + "/fcs/net45/FSharp.Compiler.Service.Tests.dll") + let testDir = __SOURCE_DIRECTORY__ + "/../tests/fcs" + CleanDir testDir + + let outDir = releaseDir + "/fcs" + + !! (outDir + "/**/*.*") + |> CopyFiles testDir + + let toolPath = __SOURCE_DIRECTORY__ + "/../packages/NUnit.Console.3.0.0/tools" + !! (toolPath + "/*.*") + |> CopyFiles testDir + + !! (testDir + "/**/FSharp.Compiler.Service.Tests.dll") |> Fake.Testing.NUnit3.NUnit3 (fun p -> { p with - ToolPath = @"..\packages\NUnit.Console.3.0.0\tools\nunit3-console.exe" + ToolPath = testDir + "/nunit3-console.exe" ShadowCopy = false + WorkingDir = FullName testDir TimeOut = TimeSpan.FromMinutes 20. }) ) @@ -109,26 +152,14 @@ Target "NuGet.NetFx" (fun _ -> // -------------------------------------------------------------------------------------- // .NET Core and .NET Core SDK -let isDotnetSDKInstalled = - match Fake.EnvironmentHelper.environVarOrNone "FCS_DNC" with - | Some flag -> - match bool.TryParse flag with - | true, result -> result - | _ -> false - | None -> - try - Shell.Exec("dotnet", "--info") = 0 - with - _ -> false - Target "Build.NetStd" (fun _ -> - runCmdIn __SOURCE_DIRECTORY__ "dotnet" "pack %s -v n -c Release" "FSharp.Compiler.Service.netstandard.sln" + runDotnet __SOURCE_DIRECTORY__ (sprintf "pack %s -v n -c Release" "FSharp.Compiler.Service.netstandard.sln") ) Target "Test.NetStd" (fun _ -> - runCmdIn __SOURCE_DIRECTORY__ "dotnet" "run -p FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj -c Release -- --result:TestResults.NetStd.xml;format=nunit3" + runDotnet __SOURCE_DIRECTORY__ (sprintf "run -p FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj -c Release -- --result:TestResults.NetStd.xml;format=nunit3") ) @@ -136,7 +167,7 @@ Target "Test.NetStd" (fun _ -> Target "Nuget.AddNetStd" (fun _ -> let nupkg = sprintf "%s/FSharp.Compiler.Service.%s.nupkg" releaseDir release.AssemblyVersion let netcoreNupkg = sprintf "FSharp.Compiler.Service.netstandard/bin/Release/FSharp.Compiler.Service.%s.nupkg" release.AssemblyVersion - runCmdIn __SOURCE_DIRECTORY__ "dotnet" "mergenupkg --source %s --other %s --framework netstandard1.6" nupkg netcoreNupkg + runDotnet __SOURCE_DIRECTORY__ (sprintf "mergenupkg --source %s --other %s --framework netstandard1.6" nupkg netcoreNupkg) ) @@ -168,7 +199,6 @@ Target "PublishNuGet" (fun _ -> // -------------------------------------------------------------------------------------- // Run all targets by default. Invoke 'build ' to override -Target "Clean" DoNothing Target "Release" DoNothing Target "NuGet" DoNothing Target "Build" DoNothing @@ -177,10 +207,12 @@ Target "TestAndNuGet" DoNothing "Clean" =?> ("BuildVersion", isAppVeyorBuild) + ==> "Restore" ==> "Build.NetStd" "Clean" =?> ("BuildVersion", isAppVeyorBuild) + ==> "Restore" ==> "Build.NetFx" "Build.NetFx" @@ -190,15 +222,15 @@ Target "TestAndNuGet" DoNothing ==> "Test.NetStd" "Build.NetFx" - =?> ("Build.NetStd", isDotnetSDKInstalled) + ==> "Build.NetStd" ==> "Build" "Build.NetStd" - =?> ("Nuget.AddNetStd", isDotnetSDKInstalled) + ==> "Nuget.AddNetStd" "Build.NetFx" ==> "NuGet.NetFx" - =?> ("Nuget.AddNetStd", isDotnetSDKInstalled) + ==> "Nuget.AddNetStd" ==> "NuGet" "Test.NetFx" @@ -206,9 +238,7 @@ Target "TestAndNuGet" DoNothing "NuGet" ==> "TestAndNuGet" - -//"Test.NetStd" -// ==> "TestAndNuGet" + "Build" ==> "NuGet" diff --git a/fcs/build.sh b/fcs/build.sh index d6559cfaa8b..53e6962df76 100755 --- a/fcs/build.sh +++ b/fcs/build.sh @@ -4,10 +4,6 @@ then # use .Net cmd fcs/build.cmd $@ else - dotnet --version - - mono .nuget/NuGet.exe restore -PackagesDirectory packages - cd fcs # use mono @@ -15,8 +11,6 @@ else mozroots --import --sync --quiet fi - dotnet restore tools.fsproj - mono .paket/paket.exe restore exit_code=$? if [ $exit_code -ne 0 ]; then @@ -24,4 +18,4 @@ else fi mono packages/FAKE/tools/FAKE.exe $@ --fsiargs -d:MONO build.fsx -fi \ No newline at end of file +fi diff --git a/fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Engine.dll b/fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Engine.dll deleted file mode 100644 index 06611509976350999c724ddd307a604e466c1567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742616 zcmd4437A|}ng4(L-l|($cPEvuRCN~UB+%hfOG6UCBy0g$R5k&{1Qh}TLKH4kC8!h? z(Q!qBD=u-5`-1y|xG&=<3WLs!!zi|lGww6vj5DLZ8E3-(^L@{~RnE8M;Ej*&C( zUir8yuj;J0wjDpUeaY1;o^r`G*TmabTzdJ6_Ks^-Ty@QgQ_eYm#ntg;m(Pri6%S2N zKlW75J98xPEV{i z{8R5JQLe4e_q>JnZ{Q|Dm)aWv?>X{=_c#e5{i~L|`%WORwd9TBJpJ&Jw>*t|IPQu* z>y|oC_)$aoX0~7c%kCG#IK`b4MBjQ$I1U^2)ShA>GH9k&Qb4fxA`OQUs z3Q$f1=IR^$AQK%gDkdZg($eS3>@xTvy6hvV*Y_p00x{kcL?@EE82at^NtZSeh)?3D zlxr@_?WBbj<45Y}6n>&p`Jpk4&Q8u&a?LOoPXf3f1SUJ
U;dIa<;~HieL~^IpONM3%ICQ;#*z6 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 z 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

    a07)9;>J~SpQisG74 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%0AS^Q`XB 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 S{#~`OHj6pKa=r|(*$e>O#|^{) diff --git a/fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Framework.dll b/fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Framework.dll deleted file mode 100644 index 74d6e05b852e748f53c8e1dbce658d69fdb7c84b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101608 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%0A^I>1Z3h(%sC=_wpf>R0C)ltX3u5zO*V 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%0AuL;jm$e&-GlA0t( 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 fl&b?ie?Yoogj>t}HA5nHQ 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%0DL${mePtYsFJbj4!P*Sxa#)W?N6Ic6J_(*- z^cRfF2{Cg|L`Mo}a)3T6D?~EyY)mr4rw<942`j^ot=02a=5bitlR)+jC9_h~s6TI8 zrNpp@h#=AJrEKWXt*2rpS=ddhwN|4g0V_1Fs`nX`nBYi*;a{CKN<=6yHDK6wD59Dc zN`?4gx;0isUZZi{@FZGtmoke#8zl+^&i^H$NVMrl(4ueP3?9MPY&je5d&EKClXgVv8g+SZI`5OASzaI>srr&x z4bn#rtNI^f%veaW*%h?*(RQldErbpD|JQwxeiE|Cq%K2EZrE>ZB>WN**B?Ttx!p~$PxkrpeJ@bj?&bqvKSn(l|{Vp*mv z$;;fF*<0m>*7Qfs$0Mz_giZos8CW-cs{mW4dVpohQXnqY86))CIaNQDvmM~6^?2)q z@iNO`D4UC?ET7z4#3>sR-&}$}*{w6ik_3P&M;J;8=vNP(&Li;#w*%A-+Mg{r| zs+4+(=7sznSd|DBTle*7ZD<%YNqt?cs$Xm|*HrH8K;mn(b{KBm;{1r-sc7sKuXRbo zRqUkKS+-VOK({cFWu|6EaOcP7k7#{I-YWP+wZ>Yi;`nN zYKxqe7&rM-{X$z_JjQs6#r#5cF0q-j2cB8i-k>V3h>SF(iu39kyKo^(--QR+>c+|d zTOH*i>IHsmW8hIOL3js$=rY*d^#vO^Yoc1iwH7xq0j%eC(`TWgQ*eO*P{dj3AM!0!)BRL#gbg0w|uI;o-vxE zF{BAiC@5cDI-r$t6v6;(rpWH2NOA(_F}fqIP4c@ycketYjF`P z;qznZvWA$sPjdqIbmfvN#*zkoY%L_QORt)z=j0n>@S)3q6`2w$y7_&43(f0DjFNk+ z&FIDN@}6&wE@MIMQ)^eBBv0h?W4Z^MQ`d@0PewI{Hr%mDbs@<0%8Ry8Q$3z!iHS>x^Z&()Yl^IWDe@<>FzMhRbIc~MVj@Oe=Lc?R;LJK8_ zHLHVMN>}ayVy{Zx$5O}TGVBdC;ZU(qPf{Tjp2Q`+%e%m1G@1!q0$mU#B=*)(l7YEN z^{BdWzGq#P`50apeJpbT+&U*8Y>+84^)I{Kl|e#i`d{i<`lNCNih598(ZW+IquB%8 zf2`!bQM!8WPL9ZZhv}TT&`2>!;z0AJnBt}Wh6GiEHTI&a$Lf+0+DUzzhM5*vA%_>N z4E4eT!*O+SnX<)Y9NL@s8L}6aI$gGD<;N5=Dx*BzZ7ginQ9SD4B90`FnY}C=mR9vn zDOa|W%iNw%QLM{GFp96ba7%5b^gk8MqN?vm(RXpNmszfn(0v#cI(5=bnarkK(}L;z zoMRP7ZQxcK)I<7C4D}>#m)Xmr;!%#T$5VC_gmPm!AHei>MJNWTA7r%0N7=_`Jv8lu z?Cji;1Z27Hnrs57n{U|Bk= zr;!v_O}>Y-gl^F z#=FQppNB;f&!-}`NeU^falQ-6X8d5H5bPp`#GV5#MQjObP_cvhDaoe!g3~IMgFDUp zGK#75w(q#9nc6pE+HbGN9Tbr7lzrw3d8KLnAlZW14ewD8?UWi(gln8o99>HK=whfx zvC1}JZ?iBLh$wb2%306WsXX1D`iE!7Ar@k=%?X?A=gaG!uGNw}dZ^-+)&y(%LC=Y*;vHk8SpG z>nS!p8SfjMt2W9zTBw#!Wq9T>>`~3Px3P{lWH%K0{VZXU4&nz1FMl#gBt=;-;1)bA zXqAZ6#j;p05l9%Ae=K%NTK6(+rX`Ctb*@vPlP-@J4Q~-cH9u@hkfWt4Jv}pLyEJoU zGL`D%8%&PWXv}nRy)c&v+qR76K_*P&S-pTSANb*w%iJYX9gaHIuWub%C37FjJJUgO zq&H;lu;A8t)oJ32Mf%%%AHBy?H_chF@!4s&qqQni7I%uD7 zUZ>44QIedQ0M7v>QAMo4lNqgbSuPsVoe&cV8E~}lO*2&-d~IMrX*9h)jcp^Aj2jRq zR2RoMNJoQlx?FR_IA#skYn#mP$5>V@|t87(-PP>Tqj`0bWDf_mPQI6D6Fh^JLD9`XcYU4iaLIo~Rue+mYeTKyBi-;=?q>e2XrTowyyYl#t=nL@jV5v1#rn zYJ>fT^3A<>Xv=&K@EzJ}Rs+_FhAcR0ov1AnvhE?a7)OT9mjD;nnk>4ftXAG;-G5;- z+%pl|dXca2J-plrfv?VuQ!q+wHTO&)q$*jMFyaF^EELLhz1hSBtgY_tqz5jxQP3F)A`2s-IveB69qNufpUe z@{-zn{bghVZ&l_~QmLfsF3{ge%j)<$bfR50uJmq9a%a~&v{|lVpIDgHm)G8*Z+(gK zmG1<6l-jTH!ERJ6zPr!08v%ce03Qk&1z(4ObPDIr-%@a^96y6Ca2b<#w zStw+N38Py@Tr)*ZO+Cs&$tx@HnBCugU5@0YlyBFx}_zX3xEXqtG~o2e-KpL(oXFI^wIU_6M8UwbGh^)OIhq86AZDrv z1Y4b0oWPJ{qBt&}A7d+w+L|Rtm*om^KdUep)G9J26FB9zEPv4r&os*<_Qf4Eb0bJ5wx~ zD$q)d?ATqY&I=VLfeK>Jf_eu9Hh1OfD+|5pq=HC3?PaDp$g$d!yllXuMbb~Q9;=o& zS)(&7VoDg)P*!%|O0vnT(8u^p+UeUj*z4KQDZOvJ;6v%#(=zdCT$#7*?0e_NGpwli>&F2VT~-86$_)1>1EtoS>{heHa#Dbq z(SQaD1?xOv3=az|`wx#oXmg1FDZN7ZhR19Ea=@C>9Nr zs)|}!yFtNFK#k6uzDUtgn{16a>Mj1NsVJwD&P?HxhMK4IOHfa8kMA};t!Q#0i#%p~ zjb;xAo+PW;X)bC#ts^hDlq zQcuBg8Bf6+2%)Yy$^_Cc@P*UQ);U%M-_I^=0wb@OEq>Yq`6^F<(UG7mv%Y1&BG0l@ zKI3N?i`4ACO*5Lw-p!OOjukBTWwb%3C?2Hxyb# z)5m8J(!IfyZs=k^VHTa#3z+C+)6ap-o5x-X=b)omlZ?G2z6 z_jJ3pMZy54MNTcY2@e&Uo+Zn$se)kfEaV>=1czF%08AOIv%bW0oVq}Pcy&)stDI5;9z zg?@l6_ktfF?SJA=C;jw)&?gTaAoGjUs%u=&VGdR6$EoxCe>_M3voqgMC$_%){zk#` zpUrucg|Ey7oEFM6S5znxpsz&I{7N^##-t+*%a_4bIIMxO%&|<_-H>sxQdGJQyCkfa z8X7E0P|b1Kr+VtVIF{&O*~u8G7X9wQpU=*a>s4?~4W?aob|ou9aw0$j>krx5!VWDcA#A5P@aP)~$tweaiZ)TJ-Gt{T_cFt^3AbH)$yq z36d4(rE+9J`J|)4U7OW+4`(x*5=!uBB9|Yz0PB+5Fc;)@Th4}%PWl4(@rv;AI5Bba zxCQZ6=hzB`6@xNXz0FFjHYtp1WU+5igaX8=F|ltH+AR|` zew2lhl3`5bfDA6>p``EHM7%+&!+a;l>o{hpjTPcDFdp$;vRS`~ww9lM6#-FQ7-qV@ zC?KySE5NY^L5>|GC|M&(YRI5a(p*p*SUt5hKoRN%4akN}lfH`E%bM!E-CP~u=>u}> z&5PsG%lF#{q6s|^I?!7D(@X4!9==7&t)^yQH@kPQ)S^~td(fD$hr*=1M|NY7%RP>W zC1tl?+ekGe-(M3;IIW{+%CHfS=htq90)Ju|kK-_g#7AMlo5!y1MYlGfO>mt>EARKQoO zuV$fO{wCE)|yS*l&0qh0|n^RQ&TEpqA`?QyhwLPBg zK5!rQEabIu{x^{JNTE1jV>ULsB;3cEAcU7(wzQUf^pp#Vy6yvO-b}WnO_CY6_2I4n zOAH$=jJkT83D80gZd=vRs2P17o!!Q-fr$JRNj^fajnthjvm-O5=Ul3^o#PQ1p%DMj zPyW%8alx?~<$qro#|o_O)6zr4Yi!=CSDeyTdEfb8gh z##E8>KGvp*k^41KFmbC>URTxUBG@ zVa$|WzE?v+{9-R+6_%n!qo0ApGJyxX3`YG^e*JT+atK&Y5g(sCBD3{s1f6p9wGyVC zeFNpf!Es?>1ykz_Pi1=03i)*L=?;a6x#O45;$tg?gjC0MUS3_{ZUaMCi7RF`I8@ZA z|BQo`;aZO-I&uQpSI*T;+_8OF+;iPYcS=7z{T70weNm-GE%fT2 z{`~hBx5Ub=&}f|j)S8gE$QXe)v`k6VD%K-mjU{IH0k;l=DJDk`V3uEmFnbAqaYKmt z9K-dyvpu##HwP8-ZkSk_|M2&=)e*B>&_1`Ft`2ZjKzb{l71B)w_ zDGX!3fh3<=fWfJj^x}Y`M_~&dA{TD|=iIiw#F2o`_UOu}pQOo>Z#@T0WAyEv(8`gQ zA^$W16W0`BMu)SEds=nRq0Dc8q&YKB*;ic;PUi*v>{f+yxD& zd0kJN2I8Y-Q~GLKv*j}ZlWpxZy0iiDL~Kl!un&eou|(*%OOnloV4dnvL(i}CX>Y#6 z#UoKt7^5hIu0YJ=bCP9erNn8byaL%1T_Ub`e>iOxptIf2 z9B|NRsxJ5he4psL(r@pjM^gO0EJ5wpJEU5Ej@sFZeHWuRK6?rPqQsD79kcy%U_m98qWYz3;OBdK5@Q)H-MP` z2^ld?9!T7>gM&p7=i2~bh%6MoJLPY;4N4vIYQWR4N>Hz0x~%`2Ov6LKcQfcM(L}J3 zxtc#w`ur<_VfJ6U?^BlV!m@ySFS&ZHspQ#*SYsL(4L=5|a*A5R)gl_?U41NC<-&Y= z7tz3sq_ENUW;exEl+YRk8kV7n2nP89=K>8GRo4(EddOp9f%y8ts!DaR(KL8DOj^qL zj29e%SIYwzTGHbQc7|gbm7K>U*7=rEN#aUcV3yIsKfQRr|Eil>m!G{J?`t#;<0q|h zwAk{~#&=3nn9KIuF-Yy?F;@T<@B{mjEm8-gaIW1RTZY{L>OMME9F3(lTidk7$?7ty zfsr_0;`?1oNv%l8mqv7@LA??Ks#m*2LvRi-rBN$gB%mgVM}30SnJysn&0g_R?{Ffoi(Al z)rDP_bdE*xE=z`_pdsjq{~9=ooCW4OIJ6wI4;w7gO7cAuq*=kfIX8fivKg{}EHsd+ z8Rth!BlnU(qXn_mrgdL5?sFukVE{OyfzNGA)r*T*Gqu<@hGb3g*pjO4evov%wfKAX zDb0x0;oZWj8^RmS9%;P81W7TaaSk8F! zr;ER^!m(_^C3W)&G<5&)M?bMnV4p<9fPDh5Ll&0nYy+}HyN2z5Y+v3U>#edyY$eWF zQ`w+%8Bp1iecKyC9UvxV_0uIgR#|jKfp0}J1C-U#H?XIv`f=L&CH(p-r>EpLJzTZ+ zHBm+n*EjAR<7s(q(NC5=6r}YEw-zC*?W#Dj5oXNvC(jbOFJO=4^4jl-LPc5Zl!gR4 z_6=e0Ztf6pA;QTn;1*u2TC6viW%k=W5{2@cJ<@l~Td~HN^gbFW7MpU6u=p>g1~AvW z%$7$+rKL9r&pksU7J@nV;*jGYuQ#wuNDq%M(A*`A3Pe(cBs3{A{W(g|v}<2%wnRMu za&^RY5*@61a5O8c&5Cuh2lb;>57bu>SiKirkAf=q(nM->6-*CWv zpN0@IXa&YMztn3AK+ROl8M7=zW{nQeis#zw%Ey%4*O}uY0&a9f^YaKR9akTCPn$48 zVig6CH9Ixs|9D&~d`=HudO4BE=S&e{l&b1$?$6}jLrb$XEn(4Va@@2V__}#^JyB%v z0qmJo7{~{6-V3}&$Ph+6mp+lzf`EytyE0%AYtM>wS%6`k$(^g61+^^EEltl-+QH~$ zk$@njFgx>3AI?|;c#Jm3S`hQteEOG_!}BT5=%S%{g6@*>(x% z0F%1>%#3y2%{mj&;h8){9d5S!tHm~~{?1mHdjwBd`^gy3e&2OBvJE3Pr|+l4hq5nH zpeXmD(SvHv?rcCki$A0XE&Y~|BTW*GP?MT>7~iyjWs78=w<3^e=c9Y*=$-Z?qsEU| zylnnzL*I1JmPJxNd$>>8illk)iUx!=mLXnnfd+an>nsba-$Ji9TzY4Cebz7QulDS( zjzlfXSXd+Ai>_41(O$kI>iZaM;u^oXZFbfs^wKu1;n1dW*C1qKGb2LgB#wu;F{rK=b_H%tGfQj2*r}wPZ$*#yo9nqvt952Uwr9T}$e8{5 zo8`XK&ot(YGVa`lyr8WQleLB+Vl`i|jt+P;UefbJPn zsMiDoy;oF3Eo7$AGAF*%-HOOXj^moU#YzTNe!;gr*%H3C$6Fg@_NY5H>5uP_9CQ4C zu|{UTKGf`&tSK^$cxz!sxxSCE?46^DVfZA@O7`o$UJ_`{#enf9EtmGFCe#i#1*a|z zYO_4-yZ!a?#O6s2!d(r@Ph>+d8WP3it0A<87qMEzav?RaUxaTsWp*+%^ zRj|`mFVQLj78!b7$4W!fuL|-xjeO(ACq`&TQ+rZ% zC0ntCwwvwIy{>ph;u#1v7RxAxC|p*cPgXXQBcLx=8WTYsSUchxDv7cO>5>+JgqX%q z%H0I`(0c#S-CBd`wOqpO1wM-vki)A0Q>}63Q&hhJQ@N~M+ssiSI1Q3oOj`1#5b{y)F z-`Y#BSvU~YdG+jm?@~LO%y=gQ*g%+V7~DsD6|6Y63iK1ai1YMyJas1~Mcgb;!i{l# z_{Sh}_mrPb^ijVxZy0LS%nX{ew#o941zM2oOyl%I4NpA+`_sEi@LSg2YrOg6E-iS0 z$XULT(mq|J=PwBj3e%Z&+;6eGWmWdj6nMR$+KvmbVAl{bBWI@{m>w=bzubG&@tGC_ zyhaVH29D>>AnM^5p}3M_2lr~f?shm_5FNm(`?G_6Gjucf=LtiN7x|tlPRk$)S-poL zl`na}zvm7exPD@<<7g};Bx259{cK0zYwpkSuYgU@tQy@DV9u8#Qhl>;9CFp+o9*NJ z5Ye>OIY!b0_^GZ3Ql>ba_28=86#UKTP}j=_IwZVPne*J&%Q7%9>ETqnve5M~#3Atw zeHvYt$6l^DTlQd!#-Pc1>f_lmrndBT~4uk6i z{PV*ap267U_ec{Irdu3=`OP5+iH3KN#=xYxR)WDBC4Cd|Tk{ zK8C#q!)GJX2l%0c7;&q$!KP#x=3iylte4cQ^8B)}8B&HBmK`8MT>5@wKq>xcY}ce& zr=K4<@h!H#{=8Ie(Z`{cT^_CV1yIejF>CMtDAQUaE0&NIbY?Pst%JU{bC?P%Toy{N ztvdiD^z4H#pHsM8TBmUB@w5p!Xd2n*pnSzN=^v&@5n`}X%l)B4Q!CBzpe#EG-77fU z6n1FjIYr~%20s{i5bwmzdWX7i!L8Wz$r7c6DVU!NS2)h}T$sW^zYM-Nl>R2RU|dB2+YFCm08-CAxOZ3@MqNcaF<0xdU7Jz563v!H1hcO&le(*i79#Oht zE-SBfoEgH@n0Xx(uQzWXoFgjn4)jQHR<0in(B5#EvsX z+8>Bh6#aoUMd3X^h3R+s6h-OjDP-eyI{f}04KZ1c-d4U?(?Lnk_&W|Le>_O#fL;1! z|LzymacDo`lA}3o6b^aP?@>8B`dz9wgtzw3EpL5+lw&o3^?B`D>R^IY#BgLcn7$Qd zi|Cn9Rzw{2blOm-Aiz*;#9!f=XM4pQ(H+DyGvf`t@z0AbkfN6f!}Pe~5h1FMRVjBy zpE(vr2Wd(_3$3eauvLp|mQ*vzstW;^^&yb%$wLdyBWajaB?Lm#bp8@mi%ZecuA`Ka zSiMIyTm3f)dQ|%5=D>+`fiX==QVPMLP%1{rY)bZ0)W*769KOrY|50K>+sPZWR;Yvm~7N^fz2 zRB*@%k+3=$A}|vi7QmU`ETs#OiI%`!eRf{9U@~!7ua9u7aF%EV_dwl&8JN&Sjl&k!4Kz0=E!=Asa8ii-%6L zPsd!v%`5Qk3Ai`Wh@1&a%Zb;864%@pv?Qm` zpmCqTTUcHLHOCx@K6eWDfNpK;YhNW*ZtJrOvLulfFZl}8p3&-G6%Tm?HQMaFG5sXw zNwduIE_Q}?Xx2(xAcZ$cqTNGN=n)1^fte?mG)2!xRV4V56GqMZBSdz~*AfkQ$wn0^ zv4$RsL0Ryx>zIo-7gRGGhp4FwQ9+0j_WZ$mNzF}659#`El;dm z-|mS+C~G}M{kM-9T_SK*NKhUQno7=i5kFaI5!34X_YOUIJG` zdRg?IKiHS}rQ;5WnJuR>!V|=s(E!zyf0AQrbP!xew4*v$g9R%APr$I^EM<%7*)AM{ ztva@zon1TCll>F}&pxA3X;B{6H2D=wspt9|OZvurOH&2;{wbNX7yO14hK&pWy z{7`6If>!g|A35`>{HQ8Z)^@rebErm953Y~v0W@Y=o;=rlmruQMrp3USj|j!@)R(5} zv$5y^>xU@40srGqf8Zit>$zwXI}gBjHNJ<=ZF;u{o0*B1_~f&n>UPQoq(eiSj-y-w z9lSZP@5)T;d=L|-)s7{{J?Qj-$=l%fbW9ZjO_ypp^dSUa@|U7aelsto8zQ0 zk!D7}h5R@L93N3;5p+|=!X>Y)Jf(l#`+5YU8Qcxju!&9j!-7Lr^hhCEtXBBX457ub zW{BW+0}R>Du8GCB!H)<_x!uY>(}SJ+qu+o4x1}&gGX<{th~2cJD4vOTZI_f@D2tA--E{h;5dYj))B93i=A26N6y_tWnOqvvFtYIN2~@?_e8z zY!^)-JDpd*Pv?`QJz=QrWYJa2QmZrELO_XgV?}XHVNLQdp)Gt|Y#dygtaiuuf>4L+ zZByb$MdieDNz-1c!#lJEdG%sms=oE-f=$C@dzV@%l# z7u!m{`bxt#X$%G{GQaCDn-!)Q6`tL~lDBxgz*VQBm_*|Cm~c9L!-K&sz1rUq>aWsh zN`058gh{IT^0gWYu{e*B3h=308Cl*I+YuFabI8}2L$AU~V3ahbh}MNS3*kx_nq<6%@IP+saeJ0gZ$e6yzpuLV$z zNY8SwfSKs{+J}|HuAzfR`XM@%hqQ?OCV8HRd&#yqTnl%>b=-C2=-|C&KUf-@y4y$F6cr;AYGXU+KO_at7P;>JrUCZ+LD`h4IfjT_C5(CR?Uhn+( z@{?k^8K3M=8uk8!bo4K{2grVPg&fX-n%{lMu(g6SW^p_@W5d0}Li50coN>Rk-WN znL8%tCmSh!RBQ3)cs{4hMu%Lv+|v`7CiufLPvxFeW&a6ZA5UeE+3F(eZ3k1f>w9$K zAK=&!;ICU!1ji3VkN&d8)xEw1=EM`l&Nl5m8e8I51V$6{aCq!n6aU@iPl%r$sYjHN z4+OLL!{2kz%D4sARNM7+&_$TIS_=-xp72?$?KBp;fGn6geYk|9ZCi`Y#vQ z4DtJ~_N!{z!^Aq%e$^Qf{J(MdQ{L~8s>qgHvSNRw?n|&o;vy}+ZSEeBhZZH7As8-j zV^0L4cq`r=`*{Y;_lYmKvV*Z+sad5OF_jgdnic^I{i0gNiDL+k@Et}H%VZsZ2EDic zyu}1%NLW>x{32gG=&Arq&hbX!$cLZ0W1We5yE&Zw&!k+UYxty4iAyM zeP~mizA};eoLKr0?;tQv`HE?-r!kEb2ADTyFTGu;N}Qb?tIaIrFB z=DmHvh`*lA7i!^IchrA*lNdAoVsWE@zoT1rbikY?LtanL24>T>UoCv=)r-y1Qb#iA zwZ4wyaqa@nNWNja;W!GzEUCL~tlB06tAljdRz&z=Y&_g#AZDhq`lx7@u+}rN+xm?e z=7Ugxf0e9D5B~kWK-ViPX4tQbP1mU&rI`pnUjF>&*SjUohmor!j4?}0$39Xpd`o#I zc((_QEs*(YPuv?A_zGEPF+=7vnEEG`W{JvVmwV)Fj zRFqq5_(9drifwVvV55(wa;n@n7L9<2qUeIr#>mIadj=UXvau;Nv4Ee(d31w*dBY}6 zeWRMpRF~a}j0^N?x{6v*o2A{CE0FW*ItC?Cg`9@~H8FHG$_SWz7%rV%VJQ>EjJRNz z*1J_|m$&M%26U~p0IW!>_Mf%UudHQ4u-^T;K0U0>=)x+VJWd}hF~e%Dv!#gC;4Dq9 zctYrE6`6oh_a2S%{er1PT=Zv)V4LQ^RdB^H!B!f*;pG~!3BS+oNIuKMi_|pjwkcai z7Uum|iCB+EOLGvAIzsYAl^at$4lO4k+!IE8miD-ank6U3d=!@|64ncM9a0Co)K1_x z=oQtEf?9VA=uCkcRO`~a#r?gYPerNY#H|uc;b6`dZ&=*eN64b~^mEOOqnVxlUUA?K zkc0^F$T=;JvH?&|jVP&?t*AI9M{3D3jf9h^42ee)%QEI8Her$DLxPDB|4RmB@`F))CDR@mve<6j6cIp1!T`d=ZVAlZ zFo;d;(>|AzaR7;!kOjLdcEG=2Do1NZO1-Q=8#DXTv)`mhxfRaaL||y^y}6ZGM`4+ zJ&9u}b|PA}xA1UsAV!q{2TMf*Hkgss73lFPl9$Pj@K>e5Xt1Io98-zo{`iNjNKa zIhUkb=lKEHlML7_#e^`v5ve#eu;#uQB(adO?<_x8^ffQK+-I5o+lu)*2aUvg0pG;$ znFcpH5bEl}w}8hsq*g>GvOla$C;s{y0uL{^$VZCI!r{{ye}4GuUmu+y#&WPQ47Fda z_3rGytQf!Allgl4bI3(j`8 z@D&2m(Z*J_uwV8=sP}`@a6Gj9&c?*>Mt0~>O}exaJtNo}SC{eS=R2F|oKH8rSh2C>o2Eboy}I|4dN&Th5*3kxsvzZ8ukH4r|nx?i22-gBU8qaP%|L zP61d1Vqa_24Ms$(D&Tub>k~)C_16DFN>-xt9Zcq7WnE{Xi20<5jJadDE0p>6pckB8 zA+=*{6hO)X4WJh60ZibDE{V3%!r8+ieR46PW&K6miM-S-1*eB7)E*~Py0mXkbB&C^8U+g2GP!r8WOk3*xXaEX zLwLq{DVeEGc}DVIp6&V^`x@sGJ{~q&zYQYG3EfGWX$ut90z6B;JIU1d=Q}F_P87#y zv0)n5YX=gt&XE4ear!a{mAr)Bo+ZEtOUcA}u=GrM3!bgm?F^(QJBR5zut{r6U~7xn z9HN>rQZ4!<^3EfWk8{P@YmAuhCtq)jmsLjZt0{PKuE{V2B9KEdLvavHnOIrQRz`8} zQ`Me*j<|5c07nzs*<-8}_Ka}BR(Ou2GCC-RK{5+B0?7l2gGFPRy@}e(#H{?%6(s~Z zni7=ew6iz)3pQdXioyb^y#dlHy5vjcfnn7>h1(io%2e@sLEDFz5wo2^`|#+!oVS*H z#U%yp*M^p53U|@oacKlCmyD*x6*N;>^Amhf_DM}o_i>Az0gG(ao%M<{nzypExcIt( zmwJwj8CG1PpQF=|WCeVV1di=)^KkbZ$)^__g*b0=07|XjxaOZ;{s>X=5`Dg?i|5Na zwB2ycDtfQ+$Gz#lZdN>KWVw*u(?pz<#NHE&)&F@QLMx{eR?2Tdz}J<8a=*18OU56> z<8M89;_>AnNM8RN`&J$@&#xtYiy~pk@~#k$7Ivz$6RAn)#x!xN-3Dg9iwAfkeO;vd zQzM~I31c_{koq^_ngxe$5lJ2J2L8mKCMpydEdmO2YxN5licg)1I6?84UT64u&`xlK=i{ zV`W^JP=rm(OYD*n5~S6MDvg8at0(+yQ`o|ddoqpr0V>3}el@`l(55eV`xYA0e85{6 zZjmt&`p|SzZJ`}X8@?#~b-8|s-qdb^<-@zh|Ctd`ZnpLtsb|_c20p)Sgoh^rruIm} zkx=4|b}gEsnSwnPWFs9E`)=)1C7j;C{uaw$DFQQZ--)}IS7I3PuiQgo%lfdZL~KQw zVB$M8r(7GdOa~K02fNsM3dlD{XNd~X2KQKDT<}DmO*3i}ycL9nx5LbzE-f(R1=`20 z%r)_goF`5t-4J{hGW#K%eH){!Zd8oLUq0yYT8kE}yl0s&jM2cLQwz#kEIVUrfVB9W z3B!Cj8;0=lz-UWrFJl|#eA!$)HpDS$a-vP3-1psgz#*F6`poG+X6X=HV_^(2b@;aR z9}nFY+ulZ0%0r2VcvPN#Gh^pW;DYXSuZzQE(We8ugfQqxk7fiDx(BI3&uu634jQemtEv02J7>aWc?np6L;!=_K{R466+8pQ>EGMn5&%Wg>0=X|oD2Jcr z0kdRm4{Ir*=9ubyY3$GWl9sk8$etpO&wy!tp44qzs5y&_iwo>^fGI(XtBsz7sfzbQ z_;56&oxp^0K!O!3>kPL-RyFG_b;icR-y14)J=R4!zIg+BF1KJnn1{y6kK%UrpK&(= zu7+;4W|YjTHfa{$hM==Ngt{+mXR8O<+d{>bVg^X=R^$it@J?FTz z#Bb;)E$Wz&(9n#p-i@Br& zmrW`RJeP>owuGaVX2N!<5WURyxGkY~-9B|18FdRAltp%E5baU*q~Hs8D{)@ri50S> zbG2};qJXDbrH5=7z1l8?LL%emDO|H=+Z%ULXYD?$cZi-|vjaaCSlBG3^(3>72)Ubk z8Z0=f3K&l6!lRtnz9iAjA5Y*?bJsP!@LTlF$RB6Nm#TFqQ$>`JsY9gU=n=Zrg~}x9^4@VRQbi=d7O+hC zUK+w$8pvARt z=_Td;YSwZxjHnJ0m}4M%#Ik)>gLr#dHH=u!rqFk&#`hRH$A`UJ+^ieI;Go^o#q+`r z!LR%C*50Yu?5q&7K7%EDG&5$RtuiIKM^U(Kc|yH3Bnukd6%~)pOPp@E#bi#;Ul}C& zqX6UPL0U&54FP#eACOXR8|`sc4zan+ zHZXaDE7N=);D`zG4}UyaHPx`ha0ZLu4)+u8<{98~eK=|4W!z_wrcK>|ythIQ$wD-g za-Lj?d4-8HB#V@kLN|c@6W-u6Us&A~ES4@AjL*;?hIFC?%Jn!ZW}gH{*w32+^{3!2 zpf=McBZ-v|U8Z%8el-yFOAR#@3X3S1Y}_~K8)RZ@am8=601ER4KeXNBQ`qi_TuT^K zi_kVKj+s}?ne+-*?@EfIms#jRJ!n9k?TF{DgeqPVn}mu4lW8YWBHA-^G|BklEcnCX zs~+dy_{WOG>}K5#12Lra=qzW>{VT}5q~)vz;=Pp`?l8TZYpk)B>V7Tk2gqd$jrmZ9 zSwzKvZT`#_`OY3~V8BFwJZvp|9n1cDac6EB@u*Kz{z%ebSTAHsNK^@^VLYFVT*Vqk z($7i_fOR6)qOO4|mk9udFf_D^3l&Yt=?rrfd`Bfjc%Jk^T8(K+TXLfkQzePtm+pZP zq%+hMi4_qW))Zbv7>&sXhZJtYB%?^Rw57D4KJ}rd>UxT@{mwq&=rjB1sjuu)Shf40 z(RWXv>n9haj5F+lH2iHC>G9zR$aLvVqza7(WDe;5A@PJ!K&BYr&YO;rO#{Y^XgBlp zc5D2z(kYG-m`d{h)a-BAQv0@(@0q_^rinK;Z}Ni8W%_Tfo2J#@RKJq(J9T`H?uS~> z)EG-5Ci(+XpdpLr}kVo``?Vqa|ru-G=Bvn zG(nL#K*>2HD-l{Wn=NJHQ{|{2TVQHZq+&nsE)yh4QEM)^#!Cnb=VE~qdd=yTm z)tL>?YkS1{%6{#pwAnf0Qfi9U#x9-G9vM;5fa&UP4hpB+8@~H^d&i|$59oUCBxmLu zD`BO$L~lR4)b<0*+7Y+M_)#URREqwz4mYYpKjA*lhG~VuUf})8_E!E`+J^|=l^tc! zXf4?b$n(UuLU?j6*yM0;6guVGg9MtVd{2A(u8tFS>dOubWgDGIJIf!?M$t9LfAn7L zqcs_U5rvVcOp^FCtVcjEpV|vnb*no}+spfhf-M8{HQu?-UUl|(7PSDn>G5L~e&+)V z3N6x{9(fl5IbeslPgwn#kNtCRd*Ge<{jYFFI{w0La*{s6Y{DgyRB;*!Rxh`Hx9z}S z>5f<-HlqxujCG6{$dCirypwCsgP1s@p~}4@9VT{+A49>4VbUZWF)g`6D8m^P`wX-% zyV=)U{%O$L#eXSC^)sz3O1V;6*8nnx?U>twkPaA%NhkI&%%csY0$;lIYn1Ce<9oZ@ z57RS;Qs)8WXxTADQE+Hxnb*zYCnK((8K=!^iY2U|_ZsVEkg-g}Q_~Ltk*I|6AQ$OZ^8T7# zNrqvXxN{T4$u)w5u;fsZ>1hOLAO+G_^4T3({`a1L_5u^_+lj^{|C&A=M#Sl|4hBq= zOpQq4>Y0y6;(CvWsE86#abX%O=yo4<-z5AWLV-hjPt7S~ymUE6BB$2&F#kBBJ zN(-zKkq@W_Ex&yW5+uCU*noG-?E{e-*DP*qs@v5PJ*9~tjCTElbO`mHD@Lz0AC_8j z*xFWrRVxip+4L3Az>mLSlsZd$XOp#A_0k|xymEzVYmh{g#YNWgjhQPECUL*X@&<;? z6%pG>1-wBwUb2yputo2bkr>-=#jOj~gq@U)xAP0+4_0{upqR5@C4VzdklG-h#V3|$ z1<<=Da!_RDPRi)NgoJ@`Ci^!TBvf*sC-0e>oqh1rh^svPzOl@C_5lgkcK?`x8T;6J z(UysX(`KxjF3Ha`Q@9VjgUvEu+HJZ05VxVt?&JNKuk!hjGEaQ7M@IHYZB#?95S*Gqz>Y>Te(8#N~Y+wSFw+@U@DZv^eLXuo$c`hcQOVgr)g&JhC-%R<4$=| zCL*26F)`<}Fb**0$uyPi%S5fz$eGukH*2O=LYCX|*k;B6c3%*MdBoQu@}1_xtj!fj zu_(DhRl;t5G*d3)>7;RCAv`a|s7!Gq02B%k`Udq0@K&LOy0CS9CQ7YBe3!lSh2$9LmZ`g)0M7P*dy|-$|A%av7 zw(?q}MOqJ+>Oiwc*`CgHft`LZ>5R|{y94|--P1EA`^1g2n*lNh+O*q=*hJC@Md|l!!|2O*4=gewRaS#0!j66~7Asy2j7A zDKv=3(A?(67?qN%*cjVR-Z3_3@ED^~V{;!PbIy)2Hc7i7tH-SfZ0QGNNw;ODAgw@l z3>%U&q42np;5KmaZOCgZl6cZ4<4fq#hA&MKLc$8CJ4D0`9fB8KM?CZGW9GmA+Wj@3 z(-P7pf4K+iObesoT(U_5cI)*DZ_cHHx*{hE1=86$77=$y-jEGRdh~Ebk7cR`Olp7^ zn1%Cqvt4_TqXxy}LKe8C0A#AmTUDijr4(`kL~YZxqQP!tV#U2ch-e$Asv&hldUG_W zIcD(0Y~u49U>97@O9WDA9WYoz;Ep7vAt}Zv^#cfuP(H>uI0jb4v`_Q#27+h-sWE(_ z8=E$mH`2Hw(+>rQ6~*m7NEhAYz?Id+aH++2^-MGdxbbTKO|lvgfUIF z(ikgMh05>VsjukQab^!2R63zg;L4>wETSv+ftt5Ye6~ZC)JH~+35;Z)u7~R9sKrfT zqr54U)E$E_!ZM^^co(8DlkLv3XoJ@LJXWQfqrDZBY+^g%t4)(pB?mkHY; zsfUF1N5UafcDuKt`}BuDrbJn;EPdRc3QFJJOSq&y>se4)#n2EIxbiDn^f-f6e@K2e z1So$9+E=B}5Du2K6XDS-AA$nas*k790E*y$08#D`8<)J8C7J-Z07OKDJPCyhj2YVp zuui6Xa$MOGs!6V&z-Z^*ZcAr{#IGRnRYc?|C6$Cn1Mmb0k)DY8nMO`ShvfDR&EcuOw_TMBROE$mC{V?n zabBW;vTe%XEf{O0G59|1H40(83$um?f;pMYtl;#PrAHpO0<-fak0hA{OXq9Pm=PE->4){>MZtSzQc zZl8=B(hwOY$rBirczSInG5uG~7gJD?2k$?8hu00pqE?svqL&tla|D$}uwHiz3HqHf z!tTv3re9v{AEj%~Vg?t0UOI$XT<{?fX}s>A9)eLuD30L}Y)726N1E)t%WK^O<-SvZ z>@29i?zD}uc*S-+qEgMZzJ#-J$xTJgj=KQt6IIC``V!>^R|s-%D*!yDV-=HO z1}zOok5P`6W3$lFoH5U9;6;rRYnbz6QBCk^2%|i_S=Jc8e*5$PYLqPr#^_cdIIqnj zMC99hHA)N7$Kh(!Dz91ne1o^Gt@U(M-abhaH2L7n@a9GoZR3m>u_U~=+2gHVg>&C*l@G-ZvT@Z=gm!j>>bo&};!X>UCG4t=hSDRt+YsxO zz?Y4I#t8J^%VSA>>}19`ZKOL5gFk(FT(w^v2d0GwJLj ze3qFMBs!pv=Tm$zu2-6MeA6V^$KAq)>~l1X(TNIZ50jU1|Fz9ZqaEjkyxN+zfugKC zhVW&N>S?*T@qTWhC`p=&AUDc4s){Ik~I?7fKzmn{dd^|)r`8|7;4^fHd4^)rlIJh-s+|E zkMH=gFS{mx^Vc3Q?-ro#Et)_ei7V>b^v=&QBQ(eNV%{C3c6R6!wpYxSl0WHkEh8q< zQSY^tMI2&Y9*7UT7SF*rDXrs0s!{Cj6YWmSVqef&$o$c+0d}TR`|5u zF;q$t8*nS@Xu#GJO*LXBg<06~1?e0xlxrSCE4H~PK$9o0hjZw zb+d@3`T3#X^bTnSTwuSh2&PnbJfK>a%l5Y^L@A?4@bi2;#$+cI40gU+14i)c{QlwY zRO+K9(|}d4d4xT;24@&7ZcuwQ@aULVYpph4CUJgdYx1b*i(WuB;;!{y^&I-?oGSR^ zZp##m35cL*Q1CNoE-ZX9Yf1;2(pYBUX)S<(Ld=$p-qn9ECA# znr7JaTP60uTr?X(jZ^$#yh$}OOF|f_D+++Om`J|><|eu?$*aw=Jilbq^!XsKcy$+^ z7XR?aa$gtjLelsj*RS5bt-!PM`mER2lxkK}p{PXeh-mz!M1F9}6%A`8Db8I3iX5`r zu5^pl3U{sWQVBzYZ&G=xzOKH08jl#?ErUyrG!-rY*Le~|pg<~%=sLp|r`mkn;Rm?d z>LTi_hmPXD*R;?gQ=C9uiJc<2*Zsb0v*6&$oujDTTA=Ry;qD|!o9ZjuE16ojf3SrO zIXv9=vKTwWb+8uRpwyj$bm`;(`fdZ4p_?+e8?nArjRpPBgq&}nL`)e2Un?4lnH7z3 zux?{uIUJiuFhJuDHz(LB%FF>OStn0za15 z<|a`y_!t~Q%itR#PH%1wL>N6buXNkTy)GZA#hS>6z&DcE`PD=fcY1fVxq0A@Mmt4R zxMrM2TZL%W^&zGTtON*OnSDA*R9H5h0QS0hG=5R4?*l=HM@_Sn$C$(Ax=@GMRvVLgSGv{7SRf19hb`; zVir!mtcHZgVL7e%=(d*xi>$yD>Q)GQ?eeqyITS&-f{(h3uO_u|K4Opct%6b=a(KBp zETwF9Ew-X;RU%s@Jr+s@_6B2wu_{fCBn7zA~)N&H?_*egcS9NSy+sV@;|u(oi{t#w?&nU$CeY<0kiQ@v;&^ z%Q-vKJ<)9iml^0A=78G7!M-7K|;y&d3em*70^eFxoS z;KUe1m5@(a3wG#?Fn3;bp(f~{w#>dlsOdid5gMvbl7+4!qTul((m*Q=33JCIvKN*K z_855O0KHMH&M=_oCUjjsUNO3zs|B&H?ynVlB}l~8<&}61$eF|eqU_c|s5MC;h2e#d z+`sPiLzY+*2M4;OPa+{=)$1#$vbVZS=^D6OxgYhN;^z^m#n)>-nrO`)CW2QfG>0<) zvyZ>Lgn{J%=M9(7-uw>#Wxp%JOr7>qn4YxS*2?8yV!0Cm6C)o;t)g8EUp)bTb-*Gq zGnY&4tZqljNQ}1bo!GTkYW*grz5PJhSWL}vJ|{{l*f3K!J0ACs8JZAS6reK(17N zS7VO0Q0=rMbGB=SY2XXF*@Sd8xl9py0aXUWB7A<_ecq{VmzVpIV{% z^;VSxm5fuXDSqBBHixA1c}PsSpX{5a-_w+zR7_V5cFE>tCY1}PR5+H_LST#qvTYna zstsG%$&Xjjy-7{Mr&fv(?!7=KNsk6^2Hv&#TQka>|$pZTl@WiG(3D)y^>QPtuNX<8dsmf*2mfQnKxrkx_zt7oTGWy9sUT0E( zg32l2fcu!ap1RSEEY>?EycbdnKw_~5pgHy<9_7nPC|8!i9((Ro5yj;9`Lmd+pEutq zBX&NP+kcyJ&&*c@oaYCE{vF{qcqo3H+LVb6c6)}=a*vIaA7)r@Ua+tpbi7hMOAeQQ1r+(c`2s}JRxyaN$*G)FYKMT!REMS03xpyb zb&!om0jN`lu#6y4h^)<3vjSn^vyBh- zW<4ib(Q&~Ra=uj?szl>S)m!Z|`!cxoOJG@q(LJo0EK>7 zKXB@VA@k9mVET9APRM@hd?yzIM%=znhIl%2SX|vq5_W8!A(o&pQ8Y=LBw<(9 zCi*P+?@Yfb9C<=g_?+o~{OLIN+b8(MU)NVOwGN|sYImvb%(mLaHd7&5iKJTITOpdh zBxq4$(n+bSHUg_{yCmG>CsFcdfI@|ZWPsT!2sOS#Vx~tvhc%GC2fB&}Wr#|5XWUz2 z$b0{a0x(0N^ay+LSdCwt{=!Cxro3O{tE0BYOb^1!Ys*=XI8W+11C#?zHv#*2K_iW+ zUH_KD2p^`;Yq+|wlPzVct~P?+Ep|vfni-b>QDi@A0ww&aO?2rViaBJJ4rp)yixGWr0H zQtE3HzzW{ezEnd_mcTLcfGBMO3`0s)M&#GS!b=pdc)d*q&m0g9q;yazX! z9^tZ=Qnn~FrCO29Zp}B^c%;lot4^sHRp)HI%grZ3eJ_};{ygs$zZgl>D{NoBXw%38 zOB!T?8-d=qeOYU_DXz=q3Qa~o$`BXYSGj_@vuF;ySJS0r6t@C%i`oQ?eS_}j@uY`! zEP^__*vB!c0&GAron3EJG>^2;#XrAgq*cc4?FN6ocN{}DxL)y6_PCCC;=d(}?|L8a z(W)}8%o37qU6I0;7?vz zr9|I1{*jcpUitEUNU>srHX+{kvV~>KZ!SE`h3{sU!XBqo#QG!EoLM`K&mk<{IRrYH44~e817Lhs76ya0V~xqAmI(8fO@LP39zchQFNHqZBdNoM zIg?|Xxx`qLWx`KD7Q!t-^;FRV4|T2OW>!1C7-fSeD%z?LCY$89BOpsCG8=5XRw5W*JPDey)4p7A7E)x59w_qVRR4db+q~3gBv+rkgH*-=9LZ!QwVNp>2Vst3-n6ORkW10h-I|^))MSz zDu!0G3D{Pm{aJ>rNjAUb1iNMP{q_By|K869D?(V3`x>^-_H&!Z$l=4o`0m~i5ed2< zPJDJ&m?0RL?zpH)$;Q_;dA?g;T%LM|!DHCW!Fn3)4lh0Hx(5zUHk8l<7kJ(s0!e&c z@uISLUcmik3Uj4O(8Y40d+N9=asQbx5*Ra>!rED0;2XONkO%D$=U+woW_|RBi+n(R z09@4+*Npf?<~Tsa?3&2C57vkb3R+x5k@7vJ0TkZrZ5VzAA%g9Ay4-(6T&zk_1-QnP z5Jp7b*->U{>tiN;cQ`!K1_{!K%|HHfc6s^w;`02LxBuFzVv|VQ;dhCA>2@7%X3WEG zzBu7uJvQ+S>ALAWy@5-jT*H*-g@WO}3V6flrqF2*k#PQU8XIEca$a+PS!15KrWMwR zilYL7?gKfkyE3Sdp|4E^QGunVOA4I=RKv#nnx*999ABS__Ra!P(yumVoPp%nRs@?f z(N3S&cpb*`8CC~K>5mnnuO0zoLaH-Up*f;S#)TGQBKZ-lDc1yN%Y1Lgxjw4Ey7X|( zphHoPP`*S;Xx29ANI4neMVu=`O)+lZVB(7L$juo?6z$AoNIu@ zq(QBQ_iPrUcC$BCh_6L8ty_Fh)d=cuw@{iRoWEikhtgzR99G!~KZYp#pjx;kSr4w{XQlD)@)jh_GQX?o`-0)q zoU`nHz1=KtF?BKPOL~cUb@XR7_32kGV`7#-pN|?Pc9udaBE}(}eHDuYhv*7MZ5D}G zI4Y4eT#<6cRwO*k(m}T>e>Lx`vG$7YRK=vcibrPLKqmKci-|(PQW$fw4_hwaIL@z4 z(X~=bcP}(hR5FW_Bde!_+XA2|8<4W7dK-*_3j+ZN%t=j1 z{u=OH;JFR(5VB<0t{c8w>xyNRrn08Fd~R(Bw7E>t=9$xir{E*CHY&FUpPQZL))!|A zX|Z&6AAuDR)=nLa%XS9$r$u51p_Vx^I%Y*1lzgpTlYLTiX z+2m;}v&~C;O03;LU+-4;++oHVL*iclWC106NmM&DZQ4Zq3y<9#<(`J$64P(DOKpNU zzF6NbzHA^PwPm2}j-oo^X;~XUG=x$2xs|jHoZ0Qgapg}(x|!8s?I}ouv4}?Op`3;_ zrx07YHm>d6I94LHm1mnJIUnu6<|f(C<0&;Vjj9kY8T--{V?&r5tqq|Jc8!deC{=vn z9}z5vWsi6I2)Q|n8wY2S{L-jizqNhF*##!*9Zee-8b^wW?O=Vydj{`Xc0Z6s)8+7I ziRbhlpcjQArI#SaMGN*x5 zDck_z4VTiTCI>7`D|c!z3^2wvdW6o7_7d+Bj-Fz`+vjluKCZ2aC-?_7c zn{!GnAWYC$ogx-bwW`ifKslDiWLD!$I8XF<7g$*HLCx!aTbWa@&W-vBgYLiSb=(gA zH|6{EH|C30@K*X8%NUBnE4On}jdN^gb(N!ZQ2#-%VzP8*Ax)7d{b2}7LFdDH0z z?Zq^rii1kd%u`XCKpbo;;vVi2R?8R@_ufeyZJCec@@q)Cyu@RTL5a(9$sa zn3|?mvwSe~_+~zpRV_mhiwyHEr3O)Ha%R)(i)WCGa<8E3=e~|uVw=T%uMiX)x_6xQ znMg8C;d*&28x1slu^LbmfIX4jp^f75iLQT^jq>P$MXcHA|ZT$0xj% z5L8$jzj(}=pYzEFW}${_j;t{7^!`qhTQ~Z2n7Vcd*C?BUyQu&Q11+Li2qLfngyyBm zm(Iv>0yoU_+Q)7wRA*gaY&ncW5UKOjwWmPN0Dp`}v<51MAvt=!&TJ`WI4R{h8 zrUav0QR)b8rS+k$tE1S&Ng;mxij@527yZ30WHvdY3<%AX5MLEp}3>j6~5(t5y& z!cWiyL0%9ekhN1<1}~yb&v$H}ow>`z_M^t`ht?vS-qFgNYpaCdqu$ggM?JL$wt@= z`L6l-OXcL6$4D?wLWU$Uoj{nHxrwJMn9AZBGWJdxg|h)mG@oLw5kZS^JwyvpLx#*t zIZ@5@0UF~bcjQ<|hy<$>By;pf_H0`5xMafkW&qXU_dybM$#}X-ot(t!wXwzenBltKNR9schWL*q?|1wCnrTfNh}UV7 zzsn)POmwl9#a@qn=Jz=}G&-i6Ljz?RQ&epejTlRc&J~VLDSi{gx!3A*)6qDm(u_;h z3;rpKQ^=|8CsphTlyZriIKZT|Iiw>W0v|AA`^ZIFtn;S-ZZoJH7*Oz%D2(x{!gF}( zq@T>J!o~NaLVT|L?~s_KZS##`4U~FLZRaCw13+B-Wy6WoE}T{{6WD+jjgnj9lonPG z!wsRaTTR+~K$Z#(P|f9RLj$ZW-vCq7)qqrDx$B@E10x_Zh7pX4SP-ibf?GqK6KG{} z7*lm4N;3=cG4BR5R8G3L5#bw?do7~e5qd7B`bp%?KZ7`5eBY4|1q8<26K^_I90fg;YZG9SiFYdA58#LL9^LGRHt{B5L z-ZJlS*G)ClS%~>fb$%jIe*1Z!VxEo}x#|2iUjChB*w;K+#@vpBO+(iz`h=N8_4}q~ zd9}H|=HPg1acht!x&?pxwPwRYyIhA4Q-_8s?v%*$cxFn)O{VYj;p%LMiU8a5h1>$V z*=_t<+!8yLuEcv!9g$|z)SX`!w4_L$V6n`Qcn+Ym%e|HZIPcDSJ zI6mtA!$DHCG)+`C2cPN*8B**0PqtG;=lF1DRnK-Sl}t|myRYMYL4X+dEIg7O_$lc)x6y zd#B>X5(;=iqD0Cw!)=!pp6{?BRGb@~@^R_$M|CIj77Y&KXJxR!Z6{~vC-R0x{@?+m zE|#=IM+88Y6Ib|Ev#h|4%(W7Zl^(7&@^V?df56sdX84I0_QtWDwyN9e=U9iGy#@+Sq4BM=`VbRuHOdKME<)*By3COLY! zxR))zOO8qc@m+vT{|Z{;8KwiJ$?k~JB%)Cskc)vLw~WVlqQcQHBv4fG-ksv>D}`K~ zJzPQO9k4>8cw|?s_c>dAe0$>!x}+Y_#Uz^U>!`E@ZVg^LfM=h^50|Omg;2rOf8H#E z_R^r~UG40HU;ygh@7!U5zCjwPCGBW^|8EaS)KD5(((Mb*cW9>qlINn(bp`a232XOI zp>O69CQsA$9>2PPs&1!8V2XUvamBDJ)*H|lM&_zX|I53@=XI05W)W|a+j~v%2H2E`lrW_4u zAujI%yKE+j`SmwA>0{99ThnQ|Ra6))w}{R>Plxl^xb=W;k7z-8OrZ?HQ^cdWm}E$6nM>@@ZN>lZ%M_p_B`Kb^wWv z_->7jL?0TYr-$V&%dh!I4d^FO5g)~PHC9x%M^?7bj65Cnka?=2vZM^)*HMj-@>%D3SF6#}wjTICwco zA8K@2C+LnAmDLlguK}c0ytt6k(C| z+Rq`OpoQ0ZfUkmifQ8vdOvS{_@3isTLazdXJ$St(l8a)IR>WbgRki}|8@AL2ahCYT zY^YdUWyY64qUTB(-_3qT2z~v{SF)(dI2)~KOWl(MKD5Uftr~DF#Zt~Hr&^4FgG!9>gF1}xUWE}@ zy=b+ljo=K*5XkXKt||tOuB%zDEFhY9Vuk8Eq>_u?tcc@N2u_40YDDd)STbsUd)){c ztSsk<_N=3OI&DXZEuWmJe%5e^40R7Vrx5w6MfDgb-B?Kk_TL}WFAPj8AQybKgIF6*u0+TgCny&X^m%D z?KlNnnzc70NVt*RY!0{ZK*@%tCt`?YSEU`8<5LooHX-$O#l^XsB~cg`I1S4h$H_HT zpzORI2jFt_mt(w%@&56d<6%@Mxx=4M%$@#+3dt*1(g7jM$nE3bQx?@S`O4o?))ze8 z?I@5H%fd>9hV3zNjmODZu#xCw2!#|zd(k+r-BjW9P;DRsQ+Q8BGYFoD;|zjS`|k{= z&O;i0>u+vN_%k@!w|^ikiEdffG#Xj0q+_T_BAzA4;wZu;qR*Fy4a;+{v)TM~Z6ZL+ z%Pm3b)(2A?%$8S7y~SNOyDm&V7Tf6R+;M&^BmG^7D|86^oqoFZdjEXb!gzXNQNP)H zio}{tNhcMKaPZPj4$nOVsVvyZ6utzZ${j;p9~;vj%@z#5m#acp_(T0UL7?)UC6LAV z)7kyS{w|h&t&I21eV3&q+QUqp{MmL^e~dfbJQ4nmYo*+ar_)9ylVs#82JW~yy-gXL zoki)q>(8m#^_2Nxvm<+oYZ15t?`V?8pw_9F!;1D9hs0;$S6*Sqf^DqFoE%e7PU*H3 z_ww@{tdsi|h71-jOhNn$d6UKgho4FbM`u9Kr%=XiI@;Hf!v(%wU_?QWTkP=h&N$rE zL|r!_c6on+OC9~WI_WUIWqkPPaC7u5J88tk8+Q^c>%GZxrrONd0uP+fi}_)&()9ZU=ufZ|g}6obZy9V9BF_ z*(UAY$@gfp8=#a6@6B-28rYnd8?+V&28hne4HWm`a=lsuj$zk8ELcgCR&nK~;DIS> z9PnBBy1YyHDGG*O3O=O7qj#}QhRL`%qD7+SSzTkcDC-e$YikB-;RnjsoOVO^t!x-wy|Rnb&{0D z2ZnCZ*|OgEfa34rp3FJYt-xs{vwZ$|-x9{F%Y@`WQA&n!=_1m(MauEHEk`>7`-XXE znYwOsoKQ77pJ4tWeN1DZoWxk_gk z?OfKq)9Ab=U@EIhHqK45+FD}s!V0u8LkNrV-fej@dZwWtSMaj8J_~OSyB{JzZxo?m zyZ(Z&VxLweFtncrW~mg2V^h|>>E1D4>8L$hI@q+59JFR4idM`kPM@- zL6NFV&b$H2M#~epB90v7DS=u4NmsuOkh;WZ0CEX&zcEy$SfK{gR-IgEq=lL`JC7UqS`MoZEPv+PrAGlCDTlfg|2$Yv`&~kfDMm=zBd7S61x=H z3=I;*tXzM~#IWCrkkvcHrenPmJ9*_kgWaQBI;FEo-s#BLxbe_;Fa^Ik@6r2qA#_{Iz-WwhIcsGpv=fX9P2ah z#-k8Q5a6KQ!=2xN;Yk|NA68%g#o}^h>R+3brW5T&S9yK&IgUYuuM%UGP(M6mN_pv< zukDT0UdkBid%^lJ#*Ct@bxjB`*nxaomXPTfO}vm@hz2~r)>5He-8X7|k+Gj+Fj9;6 zx`co*`h1*}%Ob9U$9StrSKX2g6kROqowNOWtXm2+G^!qJwIkYocbm_3u}es7-@OIa z6)s7k<}}`lP?a5W!H|*S#I10Hh3k?Dk#0ma%Weo6+4)G}#(X1{G^1>FIL=DexAU(E zOyw`z0K?SFh51rWHaORYaUQ+jF3gsy!Ete76b3U^{9_w})hJR=gVcAjX7M_&SwDH9 zO-NBEJhHzFYy0FQ7-4@9_clbsWvy?dym{*@N%xP?=8dQww5nNfcS2Uyo6)|!H$3mWcc|iPT5F~TFVV4&2vsP?m)gpg3du zns>Sclv&fjnrTe|l5I3d9=ql?mj)9p&_I%pap(I6ksQkiai#mFY)QD%d9TSrJ2WXy zf4$_97Iytd8JyYhVYFO3(VAccO>*}gtdTOAr7C<3&I}pQwy7PJvp%0dxguGeGJ({K zCct`Aynh1Q)NTShzc!c0#|hMixP-?xNGP9rUz=$%YAxnix(>ycr9#|5Rh!TV=};I! zB`J9mRv=Tzdq3Szp-_qP`BRu!*gp|S&;nLAOMQXF8d%cHBvq5L=-XWOh<;QN1BV_! zL=oo>DbNi@g|VBu8N@6t86qk2j2IA=+q1}PFie0~UnhWb_yF$U^_%h7wUl4Q`ZCXo zO}Y27n|+HRPl>zc@Aw`K!&puEbRlo*g*_(F)aD!V%|-@hEDgIARt$C{uvai+`Ou2$ zc7^q6HG^EYDrwkz6q7_**66p`t3(a_7A+;d&S7U#x%3#5g!{_tDYeR3=g&oQzK7#p(#R*YN zgIj!4pq~kxzQQ}KGk=*ID?A2g3$hcKu4{AZhWJSqAq>2%bJl3aU5$6*XSs1Xp({g1 z`)5vSR*wpLe+!?HV0_Y!cIUzUJ%f`Bi3oZI%x7)_PUyww2W+&y5Dv3n?5ACq5H*9O z3lpkN854*#UOk7_%C<)~VsVLWuf&*#0L@e{y*~WLX=db=j56MCuGdEea|vQ1AEh*U zh}sTF<6W6kRcGx?rk;Cz;KdSYVRK5t7yS=rWmQgG+Sq-`Vt9E%MJ5MauWh92h>jj4 zrkFye%83T8tEAE{-L|g;zskT+9Lh;4ek;0zu$EmXyp7)JN#s` zcF+#+N(0E!v{?h7T9AE8{Mi5#`}YJURa%1#oc+yhKSv}rfX9`OxMHnKlf8&Y^ggZ8 zq9>_p;g+Rc9t50q904OzRYUf>ocxUg#aL4KyI@%~Wd5fWG)a4{u(;+tlGEx9o+*ko znCai;RDs|1_yo>S{4U$T*Vq4P2Thm3c<^8y1E6n}10b`hooa|+1_Wy5*h>ePW-lFJ zaxWc%SN&0&f-~t7muq-ubZH8KC~3Iv*I2)hMg_jv_3UE z4t*wJ6l9a8Vqaq*4A-AY1T)nvNQQ7&q5XwDy$~of@{T5LS2i_}G=ZYZ@|!k6t9hPK z4HqE&Wg~{axb<67@`_iR8)5YLm-V+u(a;iK%Da1Ecekr43?#EdLQt85nf%I7WLR*W z-Zx|jplEj^_{2Q|3Z7rTv|xMDX|P0NEkT8=TVBk>WQ(FS(`I0)D|-rHkFBW~A-X4F zM;ARPazO)4)8M2s-}UE!tI!5 zP@Va{*50u~Ln3;5gNzEAdJ8~IfQV`Sdb_sx4w5pDiOfZ)CFujq0l%O%kYC>Jk%ksf z)ua}XsD8a&?+U=ofz9xv529<0U*(!n?zOrvNQ=mM?;LRf#`G&`y@d}o*;WCr^IIh& zlZ+Z=gMU2DW?KJW_Ln$0pDRxPB_4{>qFeK+xU^?85v8nY996`AL-=Y>@a~fPGy`cc z9M?ohu4$E>He3~|1!)Y$d{)*7W5oO#j{pg1YYEm)i}KnG{982lp)fLyvsKg8CeDiZ zpsSAkiX)*$GQv0OBhH^PYB`e~Q-NPR0YB2*(Fuh%G=g;UT9JV-m~Y5@&18fnCc1Y3 z^*PxGs`X5?n^{fB9tk1cul(j^xJw2`%{z^;0MBT+1{qSy&h(5Ts;x_f>4nmcv1FKO zHsbl94xND8T@+nXAZbwZa*kF;rH941RxXUOaAYv8Ro**C>nz(9&~&O&QV6EM=Trp<4V( zXqFcb#LPGjiBz3XCxwcL`d-PxPx03A3+$rK6A|-gn6Qq*=;K4_w^o1Lp+H16+>~>s zYpf|q_R-v5SYM!mM!=%wvhVIy#)emcyvKu*)@Tauuo0c850)j^m-Q6J z=+=iR)Q1JPZA=tqvtsm$Uc3b#4*#kxwx+EGJ5I#VM&CmN!!UB)2^is@x{xZ{oAbwv1+fs*`sg2 zns16&?`Efg!p9_@N?_>{s;wf@Vk{tfiy7;?q$VEUKjkKTcFmf+#Kw~aho1J)!eXY) zvMHtyk*!ff@J!*q?4uA@a76+mBgFymO($Rv_qbKE?)897+6_I@gRQc@bO;*j9&Q87 zjV8>O)^pkz=2Y;kERH)Qgr&S&QcQCd@T|2T$EB5BAcFtzR|cf-RL zS>cO4{-|u|n1|SFo3ea7Utt!IrE7!xux=q7OxmQf^x{6XIj0f*xKK&|OrPg~N>XQj z?FK0y-h6^>e1#x3!c1eIAz?}PIRQiAz%w>?)xs+?SBU0pfx5X(CZGA7U-n7lV>na3 zj4?L3oO!qMwwRM(DYw9~M_4=rRysK>aWb~hfyAJUhkCZeK%cSv?}rZmu2~KM=|wkAYsM2EcNu%db=*dqh0FQM}wc z-KyyrqQw}6`qNyJF!#nn;?rjRwVQph|Gws*Zoe)bC%yfCD3lc|{bc6WRq!dAA9{gW zWZs+Gn@Xjp8{e=Ub zKwH}Ub@e#W0QJ?yO(gPO?&CqoYVu?D6HSs=6RXMW&fumR1asD{(*|{ENI14MDN1Tm zjbYJj?^P%Ki8x9N6es>n8Y%055H(oU@;UfOUq=`eEA!K%Q>(p^0xhd!;uPqleTvsd zxh`gzI??1a_IqyJlK=|K$Mc=Z2S2QLSk5a`u`+t|+Fa$%8*cwCDxJ9=ttJSvK?NAg& zajmx|DXV+BJp{!UnPZA%laysmPh;o=i$yR9f?zNhEP_R_$YBq`Vo!U>F~}*%Ifoqf z6znm`VGn!V@28%6e)aPE{r{vSd$2n_uqFL}^dN+@;7cXgqHg5Z}oQEKrhtt*ywKd5CHnMGI15rbF2b07v* z$frPAE~~cZ?764G&WXo&5CwZXAtOew+n0(Dt+?K?CpoW25rEb^i}?q!VGH&|3=D}i zb;id+v`ABCr|n{iXiowsM#@^3%)YapKExJeVsqKz_HJZ+VoWIuphp`$Cz%^4e~(f0 z={Gi5gci4VHk>Pur$tb7<6%10n;I~i z#;Br7N~5iEIL#F;p(a&|71l+nKdY(wQJfB)3CvIV8kxCji?kRM9JfAlIUpVxWvbT! zBYiKgu1?vllDXlIm2`NZ69aM43wXr+q{OT}d&n1aM;Dfe)5IwAek+Lwc>`)+6CVV% z;2xdOsf`v*{vZfduu0Q5=9fOi&eAVdTi7Cwni4oql)v`lD(>C?a%1I79l*3`!mCeH z*(Nt?OkE}|Cxq+L&XY{e z%joo8o}rqK3UtqvY^|1!%xuYB^VpkQkV&G!L~FTVED%a18jn9Qzc`r3(mz;eCE z_)FXRmB$;3P9Jz8($7>ieLaZxK*^miCYx^N$R}d=CjEVP9q^gdf~b(mwDcSMJ8rDr zSzjl!1` zf5VJYQFZA*J(eJB>MG0Z0E%yNbhs!*a_8wTcU$TJnr7w@=Gd3E$F9S?26t$_w1chq2>RaJ?>Tyws5ZNEX zY5Z*ly8H4{r~zBxTv8E3r`x zsmfW4J|+fgd;6M%Cni@{krG9SsKZNGBhX2m(p|IQ$v)OzM(G-j$Dey8O1ShgcWk|T z>1CyIc>BdrnX>|0e28FT@oB!eBH^35D4LvCm9j0*gI(^HR^A{}7IF}jX?D%fldUqX z9D14FIiAYIjbaqmWf5#u;X;`%{*tX(pF|$9L{SRG^1O2F{oHC~{cOhAPtDzx@m?KL zGs!BW1xuAl7ga)TJ@;G{7@kp8r0sD;OZD{nEp)i4_RK$3m9dc?sgMz9RlA!;zGBJO ztQvkl+uYbyV>T4AP;uz}r&X5sGniTSG+01X+HW%Q#wT2il}IKw(+7lSj{=nEt7n|V zqZ@#ErF$j3j={oG`fCvRXIUoR_6rLPvf|_VLZjgY~tI~ z(zw_}bBCN~(LhH`_qZ0Vu1dZJm)B>YOgYB7c1QYkGL0%2r%v3Deh42|G9COAY`B&} zD9g0sF8?47Tz*m|fwfG&WA{F=PGz!Y=$iy(ayNl8F?rslYYnt7D`IaT+5PEdJ4?IL zlzcYvGGgiHdKada5s@}M%?ZtD-BZg2sB?^ry+pAAK$7&5`C9n+USv8f2nC6Z7bldcD&~09~WNpSy)A(9~v+hXVjgi0F!th^l zOIr(kL#N@QcDk@Qg-)Adgww8wb}xzP#hv9pr4jhg*v8zt0X5xiyEnC|xWrh=LgYT* zST0_pk%LEDW93V#(cDVLO!o{j>MplNlrmd{0)J3`eOJ>PbiUrs6 z1G)pK`w~obHFq?Cx->gYA+)wj-ZJv1@6Lr|SHDem?%4>~uHIxufiA7*jT=?B7qEWR znpo<3oQ^y2(r^Kc7zl(5s;8fGLI8w<+lDDwaOOsr^h}DqdX=&aR55NV-ibzoTIH0R zoa{s1+AcC@Mi)y#o!h&9rTF4wc|`ofc94Fw@bjNfrmKOTv9;1g?42s8CHi^pE^lzQk}_-qb)g{Vy?96@37+c+k%A4z!eZnWW; zo@7bdkGhNEFq;-H+=*;E+cGbvlccS(@a3-UexIGZaNEuxQmj7_GRfKW%uNq$q~tR$ zGrCdv>DVUAO_ygRg4FXUYKKETUyIK{@z2qjNceebJzq6Z|8sQKaDeA%;d!~hchS|6 zIKg+&(b2fU_uJ8PEpNLxcH@`pTEDfw2~San1vSHb6XH5TMM}`=St8b>=o^4#;)Ls zn#0_>^v^xC9lYCLuWjXoeH`ccGtS#WG@`17grQ!1t~kk3oD!Zc4}cURoptjB8sOYA zTkdPCQJuUl-{YQ+dC{>caAOO^6H)^eV>+U{Zcm#aF{c|`*%_l*klsF+8Lg&KnXKe+ zwKNVqIPFOE)D0nQ<|U~!eI!G9K9HfjIF6x=^$My>igMW5-q_;x0%H3d+5^iGJrSbUj%Y!zE>avf*(6YUZzHU&zZU-K)>C*@XoBDYHJ(0;{+eS<6# zcZ5WhqW-JzSRw(x@T>{+3b5af*Kk_nV3#bw>a9~%M!&u-e1)lD)wosMz6 zlB|eOnR>jh;Q#J3&PhiQEEBTPZY(S&2sw0HWc(RJ#I%_jc@Ni20B+VGr-7jPYiCXS z176;u^YizbXAH@lc}j+!{d7B*TBk3FU&RNwl^+^5Bd7BYWRKI%(p$msN`o}FIJ%_^ie6_V$#OpZYmd-rue#F|G)TecV| zPEz~OFp>!@?a|J?i}{tCxMiDBZYroA5KDye6bwHZZVv6uX}C6|kHrPq$iFFWQYU4S zkWO0rU~(e^2f=e@dj>t{B*#lW5uUTyLh8{PmUpD_dD)Q}vzyxw;^CR$dJ*(Z zTcl-oP}@^lk*>~yZhydz;GaV%oD-Ia(8J2H&Ry9hj$+1I3ayI&&Pt2Y`#IJU8i?Y? zSH6mafD-q7LaRh|Dxoybciu`R$pl%7E|`E0Zw zD~%;JtX(Fxt|HRn>_&ulbBq)zMe6D*l|~bm4>TJv}@zwSQA* zl;D`eeukx`S)FGT)8UbU>O5as~ivWSxYSpLsWq8Y&EIspht&L$$3C!p3;3Ds@mb$Ec%6WHYOPNAvMFB*(7dB{W_MQ;0Kk^UlzxvO( zmYm7AF$`Q7#n|_9i8#ZoRfYwHP3*1b26j_RbFc(sDg5|@`l&z$RwpJet?#bcFRc*jT1>?jS$w)< zA8|N$cI|S|m@P8U*$FQFil50|iofkh6|Teh+z`5&ZGgvI>2P~%XxYUVN{5uRE;U`e z*L^Q-Y~rBSfe_6i+Enq^KVXJrh(`~~EcyqaRODjtke92xhCRXvbk<&ouzhXe>Il) z?~eMvh=hbIr{xC->*_OxV@-K*^cpsRT3Y#WC_l(hVI|}<+T|;L)?^+mZ1|_ z$)y>S_t~rICksgN%noHx-377f&E5CCaSpOrHvxVkD15C4_I5j$QkUzFPhB0TEiYL~ zY|q6@oMP{|hHWQgQI~?I7Q4GsxS1doAQ&yyh#hy4Bi6{iYSu|pD>0@}izctwy`5N$ zDRt3GF$MjuPH952tof)F)#akAxOT-y&69Tx|z#SBD4a+g|6V5OzpuwF96xHd>A=;!o?Gnsh8wq%4Sw|P^0 zY#AC!cTEk~9?qm%(o&+{ySD4WZcXRo3t8{xJ0H=2yUN>aJ2;g<=AEuS@n8E1g7gqC zA`4$G?AtYE5#DN6Zv{j5vYcdI_=jI48grzvaj=U*c2SGU(zPhTPs zS1a!5c0a!bPF?ma#Z)6*KxQ~0-&5R!zRizYQi9_Tc~tmLzOhAq$3R*!iee`)rZao) zVi?GRK1XE5hq?x;M4#2%mdu^lcw#s7zo`%`Md|YsC#RIGJS_i^dK43dj%hy(zT-*v z%{g2q&EV)Q6W9!shTbJ9Ecr|A&BrEeo#kSSUra9E>>Iyk@$V%sS4`MqpwyVc7bqOs zCxJ>;!nU8D^b)!!AhJF=`>jeM%vhZRlb%l7iR?Uy)|(_s(L$3PubyktxGSbf0-c(q z$lRMWI!SBU>5X%-Z2e8>1P@%a! zd>m`que5Jen|Zm|VCAWH{=+M6JR@9l+MVIMyj8Sy` z`VIWmwe?$?jL$YX62+p@(iGRF^OW+r}y{$W)^CLL(G8z5R`rSo#7#Zfj1a zBieTi1uGNeE%-3O-Vt$nwKA zwtXc00AgxkV=u|<^lhjbS;#!a=M+=jue-ZbeZ+R-S!Xg{*I9KgiHl>` z_T}xuoUHP+uuWBA1sfSvsiuXYB0JXCW9>Q3d?S^DHgp5d{+A1n3?=RvxRZuk z?0B;~%PT6;iPxrQvny51JLR$7=WMy-B#KvS=Qf-5_WMEiYpy$|WI2YLO#{)m zi`F*wx2`Sl7Q1`AAe3T{IHxZZ3Y66X<>vP6w}KzEQmnY|C0qJ~4IR;;tEJ`mPqS3q zoM&5z&YJW->to*1p1ixQJ5ruv&t(=AQM=EX#7rZYrBK!_whwk*unxJPg;H)wd|!f$)0aW zSn@QM+DT5G`0;?*w*JR5vS}_}Zab;J!yovbN##>$OPSxDRV9&LvPMV>!>CgV{g499Ru@UlZWl?>ZcO&% z!ehlx?mo?Mp@1gS@}dl93iR&&tg{(;+Vn3LC{}!;l~pW2le{j>XnOQzrB<`(W!BQN z9{zZ=BaKU!CJTqlybk>pbbx*kb;{B6i~CWzP<&kHEA{>-+m9Z|L*`e!-P&H|YlE$d z?ey`;(qK+EHWbCOyYi)g^neY`{9Qa|krM@KmycJU=H%SzQi)-sab9T|JGi+Zrts5x=PJT^g30_DZ_%MFj$N zA8Muhy|i48Nk^XJ#bZ%V@_nOCL-bL3OS>Z~shj+wjRYm9mem&Ghlt=c-G&lhecA?q zEETTWWa z3X~e(Upca-bYX{RhoPIE)V~DObQLYibX*a0PNN9y?}{JqbMGnFQW3Br4JMY6!Zp4? z3`SOIthIRS8X9Y?>b%&`dd{sYf?37<%Kum>J?Lg5yuPUy!$eay1U-8zv=OBUD8Ev?Nue;V_*i70A^6%EgJ*5!U227bs%r34vRxQ z?-Fb&zvB=*GqDwMJiPLg3+dL7X_0se`tM(O zTN~{AhYkwiDYJ!dGRd> z3CH`(+9~sCP74kXwLc#@vP?mVD*KjC-#DC{US&F~6*J1jHTY+luvfG+zrV>QojDcb z)v)O&O{F-1xJhjx0fKzIchPe+5DsXGJ$}8hvgWCY%Q02waGu4ob>*@T$g{Cg=eU1T zE|qToYcC2(FA{x1{=q1zQ7Bi93=2)ctB<7jQy>lSx^dy@2J z9uA4e61y~Zi{@mWHOY2((MvHc_8t6N>JLd**Npn*F!UUfabm{|CYH12_68Co^r$eH zxt_qt+M22b2`Ge6s%DhG!sVQw9S6`gm?Sy5w*hZA#}*0xDm(KXBYbVMYz zv~y#27W2vV8I&^+bf}yY)rrJf>YVPe+B&&+G9!A|OyS7Q(jk7FobsUhvc<@`(#~aD zDXvJoBB$=*=NFK2%F@2rtJSwTPT9T_ma#VyihZHbBRZ^;Y$+ zyi2U3wgcLv7UOdVlXK9OUk8&LIkW~{Co;^n%!=tHTR3I+-cBwrW2Xy4$f<6uaC9cnlhN^ z*F*T(j}^a0+dl1i7W-`>S1CPShGb`=*(sLD#G_-G8;X<_8QRC{n!IBYcKNbsGo~ze ze_I!*QC}Q<`zt-g9Y5qPU-JhhEG5Cw{Fs&`4MgL&-_c_2g4HZ7LOM2-zmq{(RH{0nRXe!(Z);i4%El7P{)s7hk%>C3&=p&lInX0)TIOFPB^K z-g&0tx17Gxuz0>=OAN`r?DWdqmTvvo*k67?K*Cc!T(GC7e5KA=ghJd@A(qY0)dY#D z>Kiq=%ar^X#l?I?W$YSAY4K=WmzX?UzJVR?ZtSdeANERR_X#=6=(W>( z5d-ptovSx4;gfy+yB>$T+g0JR z%t)$eA>D85P^zS??(W=&fe2UV9ff-*;^E9qSBQM`jku9Mn7J?F)b3f`l*Z9L8TUCpj`)f~2OkXz3YIs%OS&1gy6!VVaB6QyfkS9( z0xq{++c@`?lO4@XHI)vpE{CgXcU}L5H}=%Wu6o!C55qN;(pj(&j_<1E!!WNNx0Mo3 z{wCaw{jKYJH#}0AEscCFgt@6O6)uJ!hZ+4hrGGDk>)|K*bxprMP}=*-y%2t?|9%oK z>({hW-w#)mKc(EC>d!Te=EHF8+l$xL^tKv5qo$euiUzqEhh)P$qbV$F%1q*nN^a?I z9VgNE8P!_T9|k87$0@C;?4$4_y~;$wKs#p)S-^!mi8z5 z0v*G_|8^$)v4Axb3$WTo1ZPBu^WmPp!G%9pac~l_@|&u@2ms-X@Mc4uZ0Z*i_TLX; z9^?-OpNT_ez`L5j8DSv9-_tM3K^2enm3wmRw`G5-a^cf6`rG<&vW7Y!?3LIa$Z#gS zqgEb9d_Sk0UA4Ow&V}>g*o9kSBUd%Axo}gYxu982>DNtt-wum{!o2=n(AS^ncW6rA zRN473tDM2o@78VKP%k6PUa89tk7F_1P=7NT&y8>=jyE**hDS6|?{eMW(AWlQeOlL= zjq|>vG2PO5?nO9ds14LV2_ps<%$EJEY6NTwh%@^n)Tb#nZ&pA=T3>^0*Ae~3x;x@eLZGEOTb4%eppk|T+_`@fl zM1yyK1;U#<5u$$eBzZwo$;A~)ETSZ2PPF=eaHc?+h$s`VbIb=vY6 z`(WLPJii6C{XkG<%pPm9i(?028(ftb%>Q$1)~_<28kZm*Gy~6~+aW!xe+| z6SWBJNq<yjeP364LfIn_9@7GY;IU(>jD z^dFRWH$nlu1!2xQgf}0ltp{q+xWuH&LBrv=&GEWgXN=)pdigr`xFI+?=9CogY2kvk zfq(?N=oL%{w;1mo^*f_6z!{!u1Zzq1=@hN{Mjwf)-z(i%<`z^Ne&I4wHo&MzCI4&snudE(BhWr!VgSRwrUPSdslg`k-;g}m124%_~hyZ zFa)MX-!^l!z048A*;4K;YF*}|#Dn%f*B>}}csrK?_P6y1>4O?ulsb1;b?=1#UTM>+ zwV*$Pt(~vSjcM_1YXNyVroD4zsWGihP;Mc7HhN@dy~LPS-as2*p2*-1LMQLXxdIue zugICWp|n{+>y}a%^xss>FG{?9JGN#z$H-Er!TtNATX}Oj%HBnlqK$53N+*TZZ)?3w zrxESEwbP@!+e(27!`pY&!o29oq&hXB{sr}5EzO5tNhUDvChfFoCHEu$80ht-k0eb? z`n(-6{kr~s9O-06cx>{uE;p@IEQ~Bix^nl*_TUI$KU7EAT;sZaLjln8nr7qmYaRms zqJB6#r}@MCM|0_L96nUg(p#BR0vmKl*8aA*LU?UTJO{Y43gJ!5zbCxDqkeA2wYw3* z3G!Jncyr|ANtS#dlk$C;j^Qo%iYfXJ<6QC#!->0^AK%7hAIU(@8r6nsJ=A)c1avrd z{P7jnh{N1;Y!@g2!?wog{w)W7L%luCvaNefD*%6Q)6oh9^NBXyN7rHI$+pDk9Ov-i z-L}r?83geru+MdoF(r@JCBsQ{*}V?BS;B-1c@641U|u`6Fl+h;cnBn2|1ex^OPlP( z7GrHQP7C&uPxVTBSw>dQ5nW?PxQ4_Tq{FjAUGB>LD^&eKSH=xLi8x5+lm`^u7N z3cbptCe8xmYNqLaCCbVMKJ>j2#~0?7)Qaf>{W|k1v#viz6KDccT5GIQ^itPi&?mt9 zKa!3&I7>R-XSdGx1UaP8qYi@MvojTk8`ah@=Q|T7qEGvr+Bg%Az0&o3CG*T@ zX)(N-M;gw0%~Ap|qk?Zs&t^6cB6b$i|Aaf7J5Khh{}Rr;m)HF8K17{S`^&womUNdi zMYo#K21_}w-j0{NLEry)hCvT2lb@)k^X}P4cpG16ht%Fh3DWnah=0-<68_ zNq}*ESFN3oGintlBQWb}IB&R~k=k%Q%NwresOxNVxP`XVa9iWs@Z90Lj;6!?d#;f3 z4MQ}TF|ORihEFaEw-6Y6GDgX9h7&HZW;Jq-Dy!BTG+vUJ(x0ce^UtN#ABDrPHnxx0 z>^hh58HYdHV~CC1MvLKXO|ac+9=qJ)0FYpIYck??L;)zAFiUp^N7wdoW9)yCC?}jV z7oig?t|vrP+je*})7Kp_;eGYM-{IA1K^B&}C9;MUJy1HL1b5_J{YEWCbrf4Z50xVX zZC8u&jA}Kfhl79mxtgbuRsD-RXa_f%d3>xTuj`Il;60ICTee0G@u`Eq1!G!>VP2Gi zY_DU6sNMYE~Jh5v=r#}czDZ- zZC8eBF1^+x+(0H!*U@yXu><;(>&x}OTX4jEw1dC-|HiR|BzQH10$}{ zaeT^-#M<3CF)2`Gds)tQv50bazq=^kwCR4dky$B8n=SBt1G{W}N z(PKY~iWmOzOIarTgNBD3MgHc^%zbGWaJ`nT8$%w}tX#Ud{x#e}TWYwi@ojkSa9!8o zhWqziq3tO{!;A@)E^<1jV=kIL1hJuUC`wDtK-2ugTcrU~wjs7NYwoR@K>93Ul=Eo)c4wR#|0{&`?274xS=X{l=jCXY((26wm__07 zMt>!><}XhO{^7_o_H}@LOV2&kjtQY+?i4l|V325S7FXzy4`<6-Bg&i{>7IR~#Ne*Y ziL%YX5)w>6G;SilS(Yx+-@txwW!qyHL)G?RiC1wCJKU`iwx|+QvPzk&E@o5>=YlFdQI2DLHs|K+dReS$6iURss`Pff}=T5s>xm%!WN^!@N+=Np11fdW2y-N^89mHNSV- zb!-mjd^{#e%}-UElhGOaTA3f-UJ{Lz{sAcDzWQeSvU8LFF8fBlJMS8!aYGlWkPX~Y z{v3PNrH^Do^lg}@BP#VTQ!7jyCSSuV-8$c~4a3rDTH-?=!wrt+E6E##olAV$aG>@^ zIA3UeT{R9ER!Tp)(C@WY+oAYw1_%F_FZB3<*G<%2f1UPEORvJSPsA6`Cz2QN`P;fA zQoSs~IvgmMR4xPMzhw-45wLjoj&nAV7irN4x5LNhU<)lZ9Xt3N?3VAAU*!$|e!#$Q1}zXgo0F2~kEDS_-Tl43Mu7x` zAA9%%^kOFrq+=}^l6+rsW#w!8~P)i_tVkx^qxw5r9T$fUCYx&>8Dr{VQO^! z8TEtBwHqOYUSNIJErscR3#Fx2+byQ?XPY_AVn8b>+Zb(gaiWUVNbO7<>Q4UzEURbG zx6Z&DQoq(8+ue9a5?hBQCYY-Sn3&#Bw-r8Xp|K#{5Lb3x4l4low;TAl@XU&n=6cyh z-{|?*f-Y)2?|QAi3yysE6~wYLnNdEEUT1v%*tw(C4HM{(FS3gMa6M`EF&5qie0Zd0)=O=fttHwLE&5 zd%_67?_%ELA0no_nk7p=RI~2k836O)Vcg{}qW#+EivK?YsV`Io(w^99MeH*G^4%6Y zM;UlhcMksZ^Ao8PL^h-x+iF=ks{0zl`mNc>o~NydrC+rm8#NBRF$95`Z-&4$j`yH9 zwVQOKTCk{)qcW8+WgdWbe50w+ax7vX2B%LA?b;l@K3@J8=>6b7qJ$m20o1Yb6y&~? zBzIC7u5y|cz1eVfMF_wy ztvQfQJ*`nOyl(BGR{N$}IJ=-0IQ?Yx%RE1`PIMjyN8Da|%gf_(wzRI?Ss(A1F&w9r zV%!hERPO}Zd=%c(f1Ja^UCT+XJ*ip*>a-UaFw#dVyQ*?1%$%^YJ?8h6UY=!pPwLu_ z_1`7!vokg#z1@i#&Y^JcsP?jY;KXx1vTjztw(U5sN1!L1^C;(b#-9xjj3eB7##Zcv zwYh}t3IlWkPHhu6&NzK{S^N60+KK5HNOZOqM1I2hu|{XT$as32GMIvp`p6M~${D1k z$R2=^u?bxMyZQo?{T!g-4rAvO?xG-%aTDGKGTe0lbVv4b1vfPFVSG0K9kos$;33c` zdt^RfT6njtXLxF7@W4Sv05q%>-0--K%bfmrw$u}JK)D=vcI>=C0iS`7$skdtP%BJZ zNoHN2JE$2ghxmbr!>Md1T&Q6_9@-&|&ChWXu|)hdvuJ4cw6zP>ZEAFEWrD5X7YskV zR>C}7aOx~$qzEZ3joS{hUn@(6cdaKje75u-4*x0j)3$ErvJCmS$rfLMfbc zM=s{)y4KdusX|9ZxmSD*!vrVOplh&)%|yek%yq*FbDKZXIwY5ZE>x)EreF77iyl6- z+0AGSoE(9Irt}M)W(Dxd6;nWb$JA{1{XW}+Oj@s^^d)&5Z zx@hi!nste;=B12FW#6{3fa?LOE}f>L*>nAIm36ze<8~u_uebS9a1Ayahsul{!Kt#p zUh9|o;~UjWH`YX#tjD;v$Bs(d-6r4idW~zV>-&_C?wW7{DPd=az(zs47}>aT&pNVk zZFM8NSW+k(gve}eFkoJL`m-Ck)T;23(dt~muMD63drz@q;Q0_HIY)9{hrG$S-L6D< zwV=z6_rS$Ujph&$<8`fYvCny3;RceXRh61q zxHx=*z2%#Br$vm!bw1_TYxoAIGF(GGW_buF z^7E-@IxOj6FCAzrVWRlDPA}U^)V0boT}@GO#$wg&AXwL}OLeu+kLLAt4bCVJjp?ZM zyB;Ud!Jrqm0FVJ&tq!5BouQr%tJn4LR>?COj@i+E4V}?7x>ir-nChm@j&kcZN0skd zjA0ILxs6^qusE0MYM-Dt_*I9Aua)Bpr;T4@VG~HW79pKwMCO9t4hOW1riW{EJ)f!_ zHuGv7POuT}1_Jx?>M=g<596jSKdMrf?^^n5 zXeCC_#367SuGO`B35%HRUh}{03TAHaf_H;9`|IZY1M~3YL>=qBy6n8*h6Ot#Y()Pz zO#v!0-&*+gt)GQYrI-+Na3&fH48o%9KM6n7X;bz%f2cgFqHv&mf@b6*^w#5zn?F=5 zKM${k|1SKj=VBP;dA9a#$CMsy6sSk!{M|SMf7p%sy=L4$*I{M|9u+s7#Vug&sF?^Q zn60zwwW!#I6RUy_MuLMmBWt}VXXJRa3ol@Pv=5`;3dh1_bqZ0N<53|8S6#%=Iz`}a zgBs&%4fQgowcJqe7V|r*mv;Q)Y7O*qo;YGdXjl?g_pE3>?V%u%_kuHvw#TEkFwlFa zZuHw6J}27|<=MIh>zz+?8jXbHOmbt{#_x>QnP92f;M~J?7^YCWxWWXwDpQ**&21XMhJnG-@jlqtC z$4=s$kqLkig9Jy~wBtrD*~qwi*`np_GGE#$S45HEqL6xoMpf{Mx~xUXSvx2l#cGT> z(T{uahT3w)rl>WOd-Cy?CE1YsNaHt&V`>o_akhrGDuULpb1Uskyj9!U<03FycW~hF zRaM)~%?XO8*SR!shAYLnY2Az|lOXR1`$l0dku2fYFwEP`1jrFb*+9zpRX@`J6jUBba`kmP-8AEOb34&YXHAVYdEm zF|W==cXX$aY5R7gh;VSKh4`ouTN{3Mr=VInX}P@9F1TFOHI`hW%Y~WY?9j;Tkp@Ai zG=b{ecbZc)R@U9Y-5hR>p2JWy?NBSle58-m^Z8u!;W|mpNE+uT-dN9LM&;H^j(F!i zeO(unXxlGzeNWq?Tu;f>p!D&c{%yCX_Xbmgu4779_Uc3yR|Z^b+9oB;u!VqjWfH9( zqth1H5BK9#9~=>#7ERtbw6q(U(`75z2#4yIy4DxxfVPJ}t9v#6O+W^=$=51n($cIY ztOwti_RD&mH%lV_dNllxGAh>w&~{Ddw6F%~7F~1H+CEF$GvXuZ%Hw0oXK$Mgp&{-8^^U^pnlcL>c)I3OaCP{*bDHpGo!@c%lU(7< zV+mYV!iC9q@xO~oxBrnEZxu*K3sWo2VxvcydwZVUkgVt>o zs72a`8p9R+p$AevRGpv15%PC#?WYljAFB3@e*HAIc2)I&maPJ_cWBtycpGS1EnZA@ zc?C!_Jw7Q(vLb$Cx&#=*n?WC_Ebj%`2(M@?z#KRNc~#J($a?-%tzXhNC8^2y z4UX^Y`?}hsH0c-gH*=#6u*k-LReim$RPfK%1^nSnqw6t;JI{_ym{v4eKOZNFMq3o< zx~t+==%HwztLoK57Qz>!c|a}O+H%G*X|uIDm<54V@=?6Ws`6^oyr`br0@6iAy;$e0 zTh_hSl>b~~IO_qN=Bb#}>LA-q!~D z)YKZqh7YSZ%%pRzKMLXDpH_40tNlL@zYc$@d3+J)R?n)0O0Jm|Z0||^ypa_R+f74& zhLbMvQBYA9Sz?5Gc$q_I;UuaqugoB1LC#Lmd86+{k!YD1N=4{@Ev5nTgmYZ@=L)i` zr0bo#U?+}28ws=ZKCCOy{q{>WY%ePODBA8a4j)@PehV0H6z~k1y`JPsKW`o^s4fiY zno8W3(EXLJal9D9Cr7V;KN2jjG5M<}9`lB3;%d0NwM)pmX@Dw((oxOeJZ6ONPt~+h z?^cbzajUM?-XTBQ9Ujh&GWnaHw`zng0Pp?bGhfWQ~}D>+H{gjHS+j6AN9l@iCPCN_DxR!?- z34zZ*nRme!->PyL*BI&jhs%e#9EW1{!bD4XtxGkWZcEfr1mOo?Y3!&%wq?u~8Jm4; zks|a!=Ic0!*$MzBkXqs%Z$mHnWen$-4W7JFmoi=yWN5LjoJ#>4pmgMwVlhwGD`|Yr zU1l1gqTfn+h9ktBFh1hEH68SxRlQX`ysa8W()p+WfpDBH5zJEXROdxb=5M%)%__?E z6JQ&d;ne4+Fl=W2t_b|s56ijijl6EzA_(i!2E~%YL9@^*9F&!!F1Q4hZCCEFx+STA zA6pN=eMMzax{WX1kt@T;XM6^o1zPO1ma}zhV0CXJ`ZdPn@9l+;7qx!i4H3Rbjq;_c zvLv|nrDm|NnOFo>_<;ptgm0TC6xmfV25uqn2m#x_W_QP4i3NGtU&3EyZ+OCzCgV}K z2XVsrSxHdoVFab^i+G?*MnfL5WWg9D2*AD+pv%Xr@CuM(dF*tpXgcImiykJGMr~?2 zlF*K~%#kvSO<*xSB#Sv%pxCdqgTZZjUnuX_QWU54?~T|#{g@r`MF=akLItem;utbC zOf5tmwGsI~D(!kZ!+l`As*m44Pam0NfFMvIj=()`%=m~i+MjBX6852pf$B5P?;LUu2@ z!PQ`SYydkDiKyrg<4lg;&w7Lnk0TS25&umU`|@Cvyase1`#R*>;%{uv+IsM z$zNECvL5vGASXepZqz_SXQI06YU)vEfFH5!$(5+^s^f(4F|4Q3J0)EkY>SdhN>G%D#zkf;|^gi;{3p zM|n!|REE#DQ5zVKS$>KF2<7tUQuuFaOzeQ$JW75>jv{}Whk5byu!{B^ zpY4j7uQy&y{a(frQ*l~6nGr1DlF*gRpDzw8k5JCXQ<%eQtPhVcdBysAG)dEXI$&4B z=8(16uoWyJ57%%kZOx`T!W%qe2x1fJtgs(GcHA^2iZWnZGA6piE?unCyM1V6oNeZI z7J2v}swP>9Y80o}vwXmKin~4PgS|VXIM@jH#GtC_HN7@5QA+T^5+~q3JaJ~&1?9Q= zWSH!b==#^AV?P!b)!m!-@$zw}JklCD{TrE2?J@A*NCg8b(BaoA@wL{Pmj#gd%mQT! zi2p{MEVaAw{j_U+BV|p+6D@tuJ%Q;+L-q9V`uOJ}DTXYl_r>j^S}oWO(neR_fZJIrd^t{B?YzIli)}5g6ZVc;1BR86MG{%XKX! ziRLBDEX(enroDIb>}wAARB{mK-i+o9FO}gfd4pcbcXrR1BMK=yAII!bjENuXQ0Q=- z4DAL^S4P#a@tLObsJqytoA+r}*<6BogvF}snCM|6Inug+2rhsf{v37fM4Q$ahVS+b z=gK_CwfWRq0q4{8^&feS%?h#|oAx@9tkVVU6@vRdiZI=}poZi%>%l7H3`c6#y@unf zN-G>E7wa*OhHbY#S896c*BF8EukC4Ees^F{)E`hl%YX{c$Qnc167%^>{k@~nqX%Gh zV{g=>HitpG)nP5c`HLP)^rKgcD&|+`4i0ozKY`;Ope;?OaDl61+3zcU)vZV?^?v_ zl>oyRU&+7>);l#ZQ|Y0+H=$XbbJbaMl{QYEPLwiM z?$npq)c9!JiW3FMOt`af?KNP4bsKN)nlPv@MqELr8xAk%7x|VXCGHly`DR70h z&Xm%LTJY5pf4OA*rNjo~QZ;no#mGh=!Fd{H@7vz}NlW0h0WUWxDzwzc?QqG6uHJ=Q}#9vwcEv3>! zzpZ|c9AkBF8kin+ou(br9NZ2c9{FH9inNBxoimu_*~%fX3M-Mvo!wVqn1+vn^^jlg zGWcn*Fp4D|&c((I9ue@9^(fb#?bJ4na~Mw}R<%^*-i#6lV^G4mnbe9ThIe!@#XQV@;8h+g`c{`_1)ML$y@Q+WC3 z@o%n3<$Wdn{gOD&r;I9Vj&3R5P|Hv!c3ajQ40FwPFe(pvmj0%s`}^9@uwNgRY1CKsXIg)*=@k&$u{mn6((2ung!xvBhHNn@E)`59@1xfJsvP>K2r zDoHRLI!<^am+{u6*}R)mEjaADO3%mkZ>zT%wLl=$qW*+)xokV$Y1O(d_|M5t9p1|2 zuEnz{MH?@3sy)1XK|5E+US3k`;q1>;EAKqEm+EnPJ-nnpC;d8)QkulvADq#74PlO6 zk~yOQz(ZSmg)zi&oaS$<^U6 zBeI)EDGe{Oo{DbzCrSsIn^!7o+oX2ciMY{M^%(?BOg#G4Lj7AxD@W~1VPGJONB z+k8&tW;d|Mzrt=(t54_AS&!4gZV#R_{2=TN{0?&#qdIt%5vtR>HGL)>FU<+DDU?ennY{JzzN*!4r(vQso$ z`a&0EbhHPw%2A;QqVX^SG(q4^X)H~%TJ|(6w5}t~?@e?`{C;*;5}p?AvI|H6>r4!3h~>qoVb1m~T|!`E*siSEtYDOTw&48PHnkkqA3TvQ z^b&GR{O{W*X9NEMl$wA^sg+<~UO;NgT2IjPTLSQH?u`Dn`8D<({60vpC1{>>p@dn91jYKP-$bBoqD2(QhP9+vQ^JC;=GQSv?C^%CEUd=g`HfTC@9;r{jEJ zndVlaeU0g*U+d2oa_9A9SlX@ra2&^kanI-g7i9ac`0!d83>Dt4 zrNEj-)^|E_+}q~v4lCoAh~v&ds_0bK{E;Xal>ly(bH%M*^?d!-bsnZp5$sTJA%xS$ z_wwd~Zxy=Y3UDeR_dqAn8F_9Pm=sH3KzphSXY z7AI?Z3sRdFaBMF}H$XV}SLm=P94HGYJ}ibaQ5Fc%Zb}8irqfBK&8rlw#zL@7)3)K~ z7*Jz$s4eD~JEMW3mzm{29imx%+NR#r{ma|1=KH`l7T5Fvrl~-vIHr1-T2fEYTYaFB zK9s#{AcS>q#d(;5cI@EWIzSB0oL#Tk_@J7*o^7iRDrV3oYd17SR)E!@D}M2f!Gtrt z1_qP?P@^OF;ICe62#}GfP#{tEfIQz|{^|EW7>9{tX^AEoGT|>@Y$T&s=7{}I)KV%N z_uUciOSKNzz+D4LcY+V&xCjNeJOqu%*|#fx*XU)_plu*wb5#YChoo%hKzs4y6O7;=;pTk;uqdT66B-xTe__R!gJ zyTJO8%$(i{CoanVA=JSCaO9W`8bOD(>Yn@o~;e!EZg!%-Pa=g5EL4Xu39_VEYaV% z7RlCzZ6~Dh(P2NQ-f&VA%(XB5z^npuNg$ESad1`5(MDCbYWkaL`_D2rw)spkd#f~Eb8D8VK znYYu8KsR*?20(u#K5v(3 zY)wQrYr}1=ud=kkzYJ4Dsqe{8r$0Qyaen$0Xp43jTPjt&Q)>f`;4ipfllL zY191*z;Lo|%Qz>O1`X##zv^I}xRKqA+pwh5ei|4ez4ryLc0NEK8jYi9=IVKI93%4L zNSZOCt)~@hY9Z&)WAHY#BSAX*b{J=_OH3~FOvl=ZD<3^q&H6eY;PgFu7*E@lZ8^0} zMtz)cx6Rm=Y1KF}a)2psEkbL^=x?;yUAJ^Ej<@lnHLKFds9*KNQzwhy(n?UYydq^+bk5|q<#&CPlRr@@#C9Jm`28uKGD*x z={HCLAyVS5z9Bu7^v{&bC9M3>a@ zAK|l6?U^fbR7-ZHPSe&@-4^i=v+8qNkt8@kuIu+bjcRe^_`>D7g(KE_`?erso<4V} zvzF%dV+#iFV|e{%VM0;H+z4k|1lrd4!4D&Dp#YZdRd6ml@>nawOx6|eqZ8#`gWIih z0k(qh%I=4~&O{yBI2%_!GTSRPd`but|7=kjzS;}wi<#cg=Bd?lC(O8h!bxW}o2t!5 zf(gxKvA{kjAm+Yw(1gaV zb2Y&IW$A|8^9AzTLGswmJsY>B~j|2R6*)QjjeKszw2&r zRxHEY`eX(`J8^=g;jtShAlj34F)D5MtIiY{glY}Npd{`lS2~XMFbBsoO#_@@-^#|% zm+y9=*T8v@F05r+Cf=#oL>m$%$`y3;;`eo&AQC>`8bO>X5}(@#6pi}Z;rTiaItG?; zdycz4TH6ys|FSc2Sz>NU#{phznzNbm(s2~$mbo07CBW1H z1BdXudzNxp2t;+e@&I-1FyR1$2`?#7R{l1?z`|lf_-Je~4aG9pobXX8VSO-)$fkZ#hmP6~FzVZkSk{b` z3k$mZSd5iDVZR8S&`g5r7NWXWmJCY}3T&Valq8_iklLf9Y~KfD1?}=;ma1=Nu(qFs zmnxUMt$tvxEICIOQMLSTvCMF462V)=I!9&pRqC7i9L}0>K<(nf3WKQm<&C(+aCBE9 z(B2dYU)`_H3+4`1g$%DKMgD(=U63Fa<{X3)Q3k zV!;Z?A@uT={w#KPZ~87DaWb>1=UL^KGafsN=9-#uy&p242I@e<@7T-?jc5s2n%^Dj z|8H7sKX<#o*d__ZIKz{Fo`3J(mzZe>SmLD~D z&I2vy=Yii0#2pLfmO%B$%GJ%7kDS7Rk_XO2^5Nic@IODxkg~5N3k-xS-VlT#HkaM> z^<53`KjE%97rOxD++A!l@FhczpmGq1WDAL$!I1-eZ2pwZ5Xed@nA$4-z8a`(;6E)> z8#QK>N=t63h-Tmnfk7(M!T)pEw9F&srz4oscR4u%%(vAhg9eA?w;8mvjK5x#xtu(hZMnUR5ChoPET zD0FG;DGz=e@;P!FBVLJU_{ zl%auK(_Ab*R+?86!)*r_?ch**G-ysb$$}h5*gv-<#l5xAXrFZ(=De=szDKqsJ^x2hdb_qik(Y5q{Avp+_57!%4}1m^+Lrbg#EBYR>4S;o#qxNn{bcu5jR+GxRVr zarG5Ix#z`&tu;hC-Ib!!2^^qc$O9&mGZ?M3WxZH1miY`?12qF#V0@zl?`^de10WiY z@eP3mQZDZ|yrbFliO`7ASpXN0mxd#UaSRS97rdy%sOviSH3Mcj)Mq%2@?gp{yFGTC z#{7oyU8C1AeL;-ku#PTuHnX?eAG&ndZG()uWL-k9<_$dH&NyJdzIw)%eZ4{c_Qagv z{ew$FAKgh9|GlgosXJhD~`4tcB2=@P^$#uqkcvUtWwWg!=*Y!l8sx!V0*yHY35bi;>QW{=#rZqFu?jEV^*;LT_R5}bnZNhbE2(QEY~=Oj4&fC~ zmkqv{ie#ri_S+MNW4kJFbU?&mtv+YTZMgdKMCEG{nJrYOV!Zk$i*`k|$1e8yE~*(^ z!Ea+T(!Cy+SH#mi0?|kFDYb85EoLy5hxfv{DJ?1vQ-4asXVC!bw5Pi?Y4efPprw~< z^M5G_^B~KJ{MU0jWC3Cay;JWC=V^X7ZPWTmFL_%dfavz5ti>BACTO9YALs!~fz7cS z)IQx~3LN)Vc;o@m3OHNs&=hyQnL?*KITR;=egH`!q1YU#Luq_maOAI3ya@*;aK6j6 zCU@Sm)aOmPC`q2FUseVt5I!t%c2g|@17qVux9Anb|2i8OhOwU{U5dvaY;}4BH*G=Z z=u|Gl!P(M^pH!Z`e~nl`?M2_>Z|fx-Ur*&t8w<j)i5_{9vThDW7-7Me@^vc@! z(e4%fGS&%2F|rt!p&RIV&SWh!tcON9(1sZxCNj+z2ZM#qk;+;0*-WfNmdEsguyp}x zrEI2>)N?RnYs*X8Rt^xX>ts>v{KNW6+ajM#$97B|=UsBzYhl8%Z#Y@)b`tM-ZAUr2 zK@-lEU%!YV0kPogpO^qC4NfjBfa3Fdpp@jXSkx7(5T@## z{A}Eq_;UPcx4t-F#7h9^Me^~KsN_YFe1HYJ)6vGgcfKrWOYA$bDDDKYjv)qAWwax@ z0=;LXPr%&0HYHK+TEK_jGFg+;v|vk)FUdyJP7P$Dhk510%DjC;qVj}fsk^aE-bXn2 z_c!!u>I2nKJt&N`5?!2a!J%`Kj&&IiGdP?Y-L!MXl6zFpWU;B->dLi@>H#bh!Ky)9 zcR5?T{>|lSYK>O%_eYt7%PU(L+IEcexwsqEq&0ujKZY;=!k=szIO_?2GQ*WPF67i# z`eRWOx{>GLe<=^7y6xN|WeMi&#r5u)9(&J@dl|)9u)I?_+&aq!-VJ$8qUHVYSx5M6 zxZE-DD;`rm4m*u`RhSvC#@Y^KJlmgTF6n({G(`pA`g#7g8QJoO z4{O>33DMq54q?j=5_29CQ4sa~$8%Z_qv;%UV_}$#mY(v6N=h6x78g_QtnkCdh($w1 zDMh~?ns<4Anx3tPe8+>s14uiA_mwI{#f%5#FU&8QM zE7U>$^~eN=P*!zVapTSw{uAEJZWPAAju+H!FIu7!5?TT+x^=>-Li%NlFj-d+=k;Bd z_gAqq+^|c<}`K>GEt}{VIcyE0_eLwM}gu{1pT5Zz6+V3@dARwb3$~qnLDuulr;H zE$%{i2>gfzV`6oS;&s0=PFANI09rng`*$fto32{*xZH&~<(i`aE(cW*Vs1trm(iPs zn+&o$_hMUZaA8I(kk8Bvp}dqHg=FLBim*3!RQfrmZ28z+}Afu6ln5q?S{{_OS2)fuzC$N??;PbXtb1TTE9ls zxo2Am@_6zE*6a*=+$g*)vrFactfy0+HDW3#UmR7l&e;~UrDEZRPyw)`a=Mqn)J41_ zK0sQeJyV?AtkuN7no5ht^vy1-)hkzsYmhl%xgFOo07OoU77}Y}Ryg?E8cS$0PY$Ys zj&K&aKfv|Oa_w{1&aDa zN-^{@676^24iIEv6(HT=@U>C!JW8LuKo}1GQ#%!#LgusJIMbNcAkfK7(%D3^t>*lO z*07{7yA64e84MF=o|p2Kw3t4y9Yu(qDb19Tt(>Ms6K4Yx%7ypkJrsB?k!XyRQ|xH% zv>T(N_l(|cF6LUZSpdp%7Cthw1x+^(YxFpPBg9AL5_3xw2_VDjYY1>x9Zn zx;uNjRt?$_WkrM$vBufd#mNCY=*#Zyf^^(`ZsB13?AXEIV6|e4*5Mq6M)*~1pVt8e z)wWHQ=PwLQ*ukI_C7HM}{>&YQI88hB7Aua>$MSaxt6En;Pu6POyRDI#8syNibu5;pU5A5Urau z)p+~d{zaO`*O1>EFA36ww~4tPfgJqR^Q}v*7-1cvC}FW??X9+4ur2#)VJWtx7nfI+ zw1K>k&hPwqe5ZaR$B<5z0Ji$Tt^M!>DAgV<@36oA-xYP#91FTX`kO`7sB9xGe!! zBgcH~fK^D>0lIq>wVjps(eR7!9uVO&&MMN=IS(`3_09NPaW=$uj_EXr55uEK&eA^OmcaoEeeyz)j19N zXvQg1Y(GM)?T9eJ1e_)M^*-#%kGf>5=-Ezy8SJ|i3HEDC@%-(m#Rh6F1M7B}6{7}D z5EuI#pg-gWDi8qL+BH4{&1m9w*RHeQdTTaZx~f&SZDD%g*$j6x_^RizSsUTqYw8nY zgL?G7pf>E@M8bb>D9v~A!uj0(jX2g)@vTZKl%q7-%W<0NZ95TYPUr)Wfg3V8R5|XP zoyvXYnr<(Ldo~O9?(WAq07)YtSHrUc?>X*!a7JVibnH$se|Yd;FK9UUdr;K<2=lPQ z#S$|xHUVQl@0hGOXd<)}j+*2Wl;^RE8n ze8BEhF>Yb|%Jl$!>PQtRI+NUstqo{+?B4y@BD+q`FC8THnCUf-%gY$vmE6$y%@5|) z>|x5J1t`E2&q!ApQfS*&a!3Q$F1Rz_P<^;8!qZyM#FV+ha2-?tw#9Z6xFJ)h*aIL? z4c?RJvkR|j!>%Vlf6S$RqEfBC#eG(6a&umw*4Wr+4%7Fw2xyUaH8=R`RSB$H>K)F+ zW;Yxh+=kb##W1lPRRz1(CdcKWHfG~otQKu~`-^IeHp5wZG9Qx}{s?gdI?>3S8_{V?O6xFKV6b6~VKOQ8*2uwg3C_=0c0jfkpER^kUIXTxUNXVzstwTeA&b zW3t4xn@QEN7`VKngJx8+kzc7d^LH82l?=m>#P%o*NiEm5IR5LjW)7vfd|=Qf8%jgF z)jP8Mva&8&NH^XCi_GSVd4Z8TNE{o6tBNLrP@3Btswj_90%tOF3~E4PUs@hQ&~?2P z&BviR5ssxd3WuO$<_x&%#sx6(x^9*7&6={pI4F;;%v76$rexDfmRossM_Ig2B6>qP zwK10VJ$`56buZ#pc93WHstHga)m|`A3RQd+@EF$E+%8bAE03VMtNeN1t@Z9|T5i|v zZ&N*-+%nusLoSaFS3Rp>VPp72lHv9H`3iQ2_2)`%+wVJCA#nWYy<>ugQ(3;l;p(x3 z<7Muyc-DWOj^H$r2(KEo@JF+L-8M6nM-ec=d^l-4qZmfwVNZf7D1C;5Vsgx!uW$zo zf_U-CjmPm(?hXbSUeKvf;()snGDzIt26r`?EPgc6o}hJY1!05@7GgkB#s|mKQ3xp55$(Mn46oj6W*{YN&ORgBXop!ENoD{$qXR#7 z#7;5EVZs~?I(G2a^ZGf?eFg7ybZ$FynjMW1(4x!D%t>4p=C!NV?BG9q7aD}Y&BIy{ zN-(F)IR8%ch>z#gZ$FgM{fikS#<01*2Gb&1O*%XOW7*ypl3{_ibL`#QT186S6DFZ1 z*AcpvkLq-;|51EH^sH9g%&XYeh4F3GezI`f78@Oj|H6rH(l7fag@;jG!QzXsMvK;8$#pXvLEc4{`_xazk-}<_Eul#GI z3KUFHEtNOpSvC2aU&xfuapnf%JG{cS8k{Fwn2K!IgpsMShLiBlT9a43<;5P?YIz5I))Xl8B!+l65YD^aME^3#|SPRvUl-PV7$ z(I^gl@a?p^bUV<`Be;f!euizz{TFz)Tq#1NnP;IqjO4XE*CI$+LD(njzp3B$gr1*3 zkZPmQ7Dlio%rZL^`?})=Pl|^f6FoqMruE5WHvy)xz(F)X$nN+gGVv!cky|rr!Y( z=GpoXfs1oIAXc{^p7q9LK`R7%0{8G?Ru~*ES-9kW_=QIilua~zGAj{I&DKJ=cUNWe z)7s!b);%3hQ1QSF*01%E0s}+?AyD+ZB|-})`y)*&_(jQ==ne84j*7D#B~D9o!-CLZ;&S;Pj&~7@C@QV4%u&7GDZNl9*qs;o)*dEPUvZ6s` zw=z~$eRr7;2B4I2g>5;O8q{WjAchZ;dMv0h2Ja1xC`@_V_!8mEFgh4X%Q8S47(hO$ znRNVZnLsH-rTn0NCi6U#8=4g)actI@&6d8IU)`4zcdqCDir)E~ z%Zw>Im--9XrbLV8g!k);M)(DiiQ8s;grnwqWQhLdQ6PHMUY`TP6Eng9m=tf`L5jeb zb3YxST&%YQxHp$uhiBvF!n|ZTFFEs!33tyCxD&q0?0;TuW;JF;tL|q}GieQD8(545 zJhaMAx+1%;>NfKOHLf|s0G-t$bjsdftZdmJSimZXlo(s~NpP_n>27`gEj3%9Zj z_qtVW8S3OYPxt`G+E%Me`i!7y#E;GFkkJUcylv+FY_stm(V^QgRL5#&h@z#L&kn0Z z<8Z>f5qaf+Ryg?Q-^HLIA4rAcb^sDBg$00AvLDO|s|GdbgR2LGLNfl<=mBMu^k{2h zf|w2v$P5NKWiroIRg-D?GHDw$6u@Bq?X5H$yG;>f_tVJc>@dWDAj%CuX9S=wZXY({ z%x~*ZVo8T}4Tc91GF%{4?(-l@&H0nd&=M+wMcr8Y8oJI_*gEt_?nqtEAn4sEgq|}? zgyVzm6?%{c)C+(4{D=)ZF*U*Pg!vo89)^Q!%$Rs{5+d`Mb{jD8jL3}EcAA_`86yX7 zZqe95E3|x5UD)9@Vgs_a+$~1R!ioopvvYG=wT8!uNg7@&*E3uKmJq0|AM0b(FuIkn zGA9@_qQf!7@S>Hh=|M(w z25?(|a&h{8G30Ny=NW41e-mM-BR&s16LT8V$Q($%@d>zNS0ZGHc}( zzfvU*@wyim=3|_(XIn8+I%CZ~JocC4Rg_X_!F9ks6MQIT{Xj}KMxZjvFlPKwMu!Zm|ZnQx&A}tP&9_ zg`h0z9I?XqV0h-R5-P}^@|n;t;v3x`axn-WW%Say&I5srAY+)IPQj02v&0853h=%?^KDCgtRW?6Q z8Mp0v9H49sD%=`Jjjt}Jdu+Nz_!dQ1A`vk{#svrsRn1h2`zimGXLwi0k=am-4f{I3bH7_7PXxA#tnWnYSn8{P}#x%FeS|1jEg&p zm$4+7CTsw?R5rhF9S0Toza=aV%$8G_r0D8VimqP&K6jgSyXjow2G`>$@PIk3qZ zLq}ktN+sDP(cu!!nMh{x2G-0rpLsDqg9>TIG2i=eUh0OMS!G~zpG}#zssn>SxF*?b zxjZ`-nDXiNvzcZL&+g5!HDlQ5=B$>fzD~|4VXP%IQ+RKVmvT|6-#vGNmTg$8wN%PL zAC0+gON6O=12_-q58HZkO0QuTKD{0ByIx>NpVG_X3slZaZnNpy&0WT`yL+3bR_@D% z%hPuL5Fk(Y-B6T0Pq>7Oj4OK>+};_YS?oO3m>NAthfUwa&a;u9;#3J;JVeZ^dz#?j zZ)-65qW5=Fh5?PPW?Fh?S1gL@f&e?CueS}(n@a{7U@*SB;?IVNxioJymTwwzpW>{R z7jW~!An$zo5~Ll5dr%>iMPKv+nxmq^C>e$ACfJu*L^+=4Jcjbzd$Fz= ztuRabrY+o`{QHqy3}rgdHLu7=(Y|EniW-`Iv6gU$L5ShtpDo1oBo4qCj8QEz4$#|c zC`^=z`|&l@ZcJKeI@ff-_(B09um!+TlHiM6raZ=(_o#)9Dvub5UtV zMed57(HJz1Pg}aky%=)!WAn3A)x!J=o7>l2#BDePpgTMnMGI+wN@)PSjMN zpLzU$*?S)tx#}y=_jb4KD%*6~RgD7<-OvtrjRzad7zPLs(%21nu`$>tzy>Buumfz& z#00Z38}p{By4r4LCQ_nJG(DUlK>qnAjD zG?6w>Gt&Eh&bg<4_ui`hW0*WW=`FOYZvF1>&-tC-`Tsk=dwIp?0TG@*7!`vn;W33F z(mayf=6UUqJQ+Q?px2Z2Sq&ESf19zc7JGO*ycOt7%f#eaoWUjK0pi8rjSmz27UoNc z!8k;ddR~eE9Qb_cKXX{bHq0OjAs0{=)k1>TOB1@hZyYGn8+>+22Ezp1y3kU>O63ql(!9nHv`PAD#8K&}x_@JU4_B6A!ITHBeX_bD! zCFG?uEktsqc1(F#fgjlOCsU@>y#J^qu`88N%ld&EMuFe~*;g+7gRqH?=}t((IW34BOK#&KlO*+i2m5;r|6V#{cj7H-IVs3f%G}4JhG)0J=h*{AIzl6%#UNULK?F3wPP50zg2M(=SyH4eAjob!m#3n~ zXg-3cDxzP5k#ISnH55vEgg?~6I|dT8dHeSNamUaGDOiiog`zD-abkjr;fRTI&cdVA z!7Lt?rjNUgWQRTXzueN94SB$%>3zdI9*ki^(cVT<&a9W>S#_L&^;&x4}O8i+f2~ zN$l4`U_qkKP&b+0L?06NE?xPFRu*umF2A&_F@r(w6NB-3Z(ik{T~!nnK^BXPNS#I* zHqmpDu*DM?yTvnPT7-mh4TX#flt2u7^?NYeB{+^6pk*=1X%VbP7hmim>@K&;i*Thz z#~>&gTuDNdWd}JChb`yE-xL|o{KoCzIQ9^uC4UT0m|;~3AERdv+$$UaML2;he+1Wj z!~fG_s<7hSh}t8}Vo@V~AQ;DN=p?tbvwPo7&xh3`gtymvhXE_S?%SvPMF%TwZaZ55 zlW#38V^X$%=ZRMcsi1xYs6TiaQ;V1kc65j{cP`jZj7RkkvnvB3ht;l_{xfYyBvQZ6 z7@~tWINsz7u^2o|k0?u+au`k^E0&HW@k4kX*>Zb1jxAv2qvA)lmU$YrPJr^Me)=`c zldZ=PIjRKeYb@(vDdOY7^Zs&oKkc3EUYb~|^=*vyZ|~D|FzneUW|F?k;AsJYB+P#o z$?$F2Qcg+$s;SZfG!4B*zg4dgF<5O zu~U6*L*{vkK=E|}MaFi^9izc_C&Ri%SQOJ~f;zE+5gh*LFlShv3p_0FoO%T!Il9*s zp<_vkQVjkGm_hER#L#(G)4h8HUpT~vG=4cLexJeggcN!?JanHy~ZkYRn_n?6^m!YFy>d?bws6Zqt z^$=fuqqaQf?&q?6hZJ@fX!Y_sWjsYi$(;z?;#d-Mw#;g)W;-W^^7quE8t+DQE&?=-ueKp5|nfb9HOkwX%-<5Wg= z9VJPAcq-hZ<`bo{Q$(uY?h1G^?Fq~pq#m>#7()*xVx8dMh~?8d#p>O@G8}9_RO&a4 zoT8ts!=obcYR#%K<=A)q>=Ify-o0F_FsT@Y*u2_2JY2*CF3Q_suvZvr%rfC9WO*@X z%@Y~3TZ(=$tP7MW401%c!mK|cx}{GrcUY^J#_p z{I~$|vz3W_oDncD0wo@vb}!3K{%}t~E?_+>q#^!D2J{y-6x&A)JUfDJFb)ntkrb%! zf{0NQQY6|gDSJ}s4Z!(3gexRlMWfepJry&`u2>rNMd-69i_GgV1`GRwQyT-9K7(l; zx3CzNI?EO!z1$|Ecd5RXsg!)O)QB^}BDi#=llpiUV=nT-sKuGMeCVet7BV}~wJnFN zO3DawFy#hq;IFLllbA@f;iC-SM|PLg@hPe~xJRr{=*!iDJIwql?w`dvGBS}4B7xAf zKL7?Z5zHEs9j^9AzqCN5{+Su)&~*~XE9i3uib=FyrCit;9zg*+_x&f0#W_`XCSd5# z9qBWUTl8pdG=DjOg7#)AIGL``!`$&DaGwI!e8#2&IipvRu~<6JK9nMBhigxPV=tYK zyG#x(&MBtshGM(2yh4u`(~d&c`{}ZCX<3d#`dc0odJ`LG_9pv)vy65GB!+Rw_iVgq zvS#-d=KQ82xf(6a1hp3- zxmEaN?ucUE7MkYvlnx)AkPP}%9vhd}d`05lVjop10{6uyg%|7IZ7UX*mDRju<-I1n zK?fK}dNkdEmA5a>FK7@|QlP*)SKeEKW|6*b9^Tg=4pL8rc`X9TVCxmkYTvm-vdEmS z9!5n~N=fq(#qM57i{cy>Yg49GJb}_Uw+tI+={AI7;3NFfbD^W^*n>QrUAr=9D)U|e zk1}?-RcRLO@4A4%%Bq?ss7<%GT>SH!S`oD12^q<1i@=2oVg#-G5||nMLj1;~`X5(M z$#4OsNi1_O#E{oP)Vg~|D~AOkjQIjf=XPNGA41k4iK`C{DT0dWhW3M(Jx0u+xJqte za2L5qnOk8oWpBxy(2QY=dA*alv>gTkBf8lOLI53Wund>1{DmSKQy?yo1}fb)ClDM@Pfek@k@hzoH$m%!`r0v(JHL$2S1C_H=+s4!~haokOw* zNV>RNw!sluE(h&9er2;j@RV$7^eIG#HQ~!X7$pQpj#UWIA7pOsUo(0^(&4y9=5A0o zN7Kki0CFFXxYyI_4{_##DTP$B-AD3TA(2;L?QfY?KVbUP`F_J5UBhWWZF#bn+-I2j zv&HUjuJ(XcjeTBCO|ABPP$LxE5(S3};BI70wyo@Mx?}(@_jH0{vVFI!wqpbgUn!iC z=T{U5PidD1%kQLlQ?U49%?hc4w}G^TMzSqsJN!05gEwEb+{?ZQ01~M50c>5Kn9$ z?9=Qa_FxeoBbzNp7fHas-NXr}8xBdB+%ME4UiO)onGq54j;|RJB?+s%mupsACM)SB zwVPG1N7U{v_2T&={hn?_Ou6&r%A0LeSExq>{jIt_Y_m#X;0SDI2WK=xS|Kt+^}8T- zSBez~Wev$8I_SM9vj!G~;i z*;OID!G1FM)2u?&pqJ%rA1FRxv3jJ{Pm6?=7OdpL1|(G$#*ITsK(K6xM%;;|?jpd#lRmm_WvK4Pq90E858&Ih}^03v==o1KEo>6$ExWNT|*170h5K=}2;>hhC zEQDfo!|S1aFex21&S(jV{AQ94JYix#q*9#1V4r^E+L01AM7ifH)hBELL?NnOj{$FW zG>=O9;kHy8u`PtP|I1)FvHbKIWCkH&x18OXi6P3$6lq(e#3B_%i{jJ?_ARzCZ%aV2{Mya%Bm*2hL))2WLY>hx)^bh2;;D9K@X_gBGzI|Ul_jgkmj3q3fL_2Os}+^Q#>uOIN=I+ zv&*ek!hEdtkQJC+ZUt7eh}B)e_lst^D=dX8nq2+l4Ri0!9VKO0it6PHQw)q}|p3BE*WU?>@a@y%R zR^O=!eL(Ln>Q>mdJv8j7%!1T+oY0I>c#SRG?@zd4Oq4kMQ{=wNG+Q;KKKpr=I>{O%iW=+Q520%ME!;kpMId&2bfr?r}r%j<8IRB&$1Cernl zDzjsxSCri@j{@Pe@if-E6jksSGw+dGl3n0+BVNPH*Y47p5tr9-C<-bGY~U=FT~sg- zMh$YnDc0gc_d#jHdvW-S{C^JpZl&Lyxd97wcjaqUJhMIWK($ty16tgp5^jBZHnm$2 zPy<=gmXEbon4@E6j{4Uh~~;1 z3;3zLBPrVAi4uT%N}KkxoSf)?5H}wYWPXmLFxM>y1Z{G9qjjN%0!=^v-7 zv;(??ZOcM`m9XSq)jg~L+pQLSglmq-F6Ns6;vV%r>~LCkBcr0l3F+ax64nDMaF5;! zs0osk^*|Dc zP!z|BrQ85?=7r=_4EtDrLLbTd1ObC!j4UDc5$uF5>^RR%QRKvA2m2#A5A+N<5Oj61 zhpN)pFN9T(6J__p{DBjXX`WQiD^(j9O5oB1IDt`Ky;T+bA&!B99r6MxSt=nT5uIJ&n#-$J{ska{?3h-7yKAV+6w`pnw%G{)X~T-Dus^UOAnLOBVz7CfP$ zLeF}F2W_g$9x*AjEDM3|AT~gZDv*c1ENb1X{omdT7-hGnsN8*8VdA@5Nv9_xZg~!X zHVHJbLI@v>;_Q-O+*rG^2+X#k++93lVBu!7ZmuR`!#aCt>0XA5x@gUa$%Gl?iR?*g z@^ly?=ommAYD=eN*|Lr8Z72)FtokM!H}IinPl=<()0zo&T}1@7>9p)sa1Qi}!h}p7 z?aKq^60?mNWLttXqQv<#Uc{&by#5Az)NsWN$+`&$p*^h8T=iJe-_`KIC-pDfi=s>8 zij8n{HJD?`==-6Qvc8 zz0)|%l+GM$M(s|r58T&d2R|)x@w6|{Ksnol)SPxRinyu8i2eH9PH&_KLad@<@x;q5q zY;QtkT+ArjoMwQCay?+1x7RIp zXE^-*)w?KdLb~!xmU?zw*|v56(YNSt&+d^jo3(#DeBo~W+ar7((UyI-J#gsaq!Cse0@{VPxh8+fjr-}4IH(?FbS13Oa@7foF0b%Y^R{QmEMp@!#*ClpbTpz%O z$d&>_T!I}IF7%N5pB=PS$}K|5`TH0-Wc>m451YbZAQe678G5`x!EKkN`e2*!1B7=j ziKT(Ohrsr!YbLW4F@+4t6hXD^*^w-*A?-HoyP%MQmoRW^`V7iZL=m?!X}0TdCwd6*pAYtnXbVGj#JdW?8sc6&lWjki3^Swp(DD+xDJ%?>6S-ekcQnr!@XQrd*WzicC3-pJql|vzE zt1xXe(q&Sq74u*a2Gzz;gyA(7O#8YYXu&fJXzY8jK`496sb(X0| zBkDEoanNhox_TpY)WyRr;wSR?%JiFUPIV4zzUU&>N1ns>bO*5ngm5_bzyWx7FJ`Hl zmBW!Yl;H~zn?_oU&-Cn|GT>#=6D(cTB$0to7EPgv&<1NJ{Ew^EDaFUlC(?aOO#~j|iIJVEs<3P(3 z&j6k*S`uR~LrP25tq{@$;Dq>O86Vk=z)ShNfVCfIUIxxZ>s4UX(Px4WuqEz%2tF4a zctK9V#AIAQxF6{TWO9eo)-_>)Y-^fX>hr0R_K@Dvwi!=5;uty6b+%94AKfQ7W+g5N z@emPop_cm0HXwr2=-DOZSvbsv``4D8b+&mADNCG8`QovhvJ;MBP}~*)dL5KfH&*k$X3TMk_a2)87VM#f=X?tV%KEo-J18sTG2~&bq=W%ITwL7 zo(gl9Xb_7g+i+MRn*;hE>QJagcGW=(+ss-S&(HO<7k7(tI9c$3AY=pdh=Nb|Su4(C za8iTgUYtcxFPo@K@(-`7?U#yTc|a`hs~{n0pVhcaUkG0^Xi2|k|I24HV-eYWdoMrQ#N*wo)k(TYM*|o$FT#N;Q{>uM&`I*Wq0XKn#}T0 zlr(vPH2e_{q{vUkQs+g z6B!o!&K@p9Qq|ks4dXo)Zz+Ppcl8Z(@Ar``d*Tm0LU?nw%pX1X(TaqWg_gfJR@(2XB0dgkJ>wB6q1m32ZYXHW zEz8ySq_ePK%M2bgWp>%6^n~TPM4e6hMBBbih6K+O;>Xrz*=NhE6K}mtg7;i7hb0h) zaG@)3ncUGLHyPD^tUPvk{Z{7gF2z;Z1Mj{6;wmL7&kirubF9u%unpmp*_HHJgr}Hj z<8383HuG+*51O_5K~V+CR@mI1kT=IphHvk&Dk#Z#Lb~HRe5ezWUP+~f{2bB4Tvpb; zyymVdM{dCGCIW~hi2d*MQ5}m6h=|hVO7@;IUXc3LI&fyWXZFo7Cy?sI&oDYXEF>Rg zJIS9_OcZ;K{V29$m##_90;+*RIP1a1iZq*ZL!Cf}mv5zU; z{15$qRY#TimsJZL=)NAoGBCo*m)CS99FtY_$a^2H$V&y@E=2>%qugek@kG91Bk#gI z@{rNxy2bftJBL&MFq#v6w$C1sy7HalGBcHhaoTJd7SqHfaw5T)35N6VHeq5$cvPQQ zk^Xp-Pm5)ei7!C(5-}VX91>p6wO{r89X>ccxGdB9JI^$HC<8(zMdZA#bs3N?TNDv=+w0d@2lt%UCrXEi(?m0ya;M~Kq1KYe*% z9hz}+?U4FoJ+t*ZqLdJk#-4HE79o!~b4$i+B(x^ZO~$9Y+pOcrwLI$`Dt|(~g5RQR zQlwgc{fP6#$U|W8gxaCbLzxGEJf)t>6c_5I4DB<0&U8)zkGz66Q<6u~EU321Ch#AD z7y8K!%uS>~z~#lhvOTOw3ND1=!sK+`_4V|}Z4gS@rt;X+@l&NE1FtuPB7*l<(0afHmWbM)3@M%1gGuwHW-626M5m<`fBFac8Ahk}Sx3H62W&>y70Y=zR zu9Z!IJ{A|H!o0=kk1Q?tAllSoai;r-X6%P0AaAUx#H3mKKOYwAk?`p$k}N>T18B_o z+$juh0HrRUT$;pMgG@&yp#c`sC&hGFcaL8c^9i|MMU56_yyzlk8_L_bJVQR>Fxfc4 zI-)@6TO{F(Y2DkU4J>H67OhJVFH0Y5>psrq7PeK0TQ+D92aVIQyB2QLqz zWwfoLiB@R=PMeRA!e!oWx<60m7)$V>9Mb6=cIM~!_+SoaEYXL=oy_jCY~)jas(VF@ z_>8Ix6D=N8ZLd*XOh$iDN2+%y#=bMVLEk%bI3CnU4u{6Ol<|N%7Mgb6!ZEHo`KYNR#zS*p=4{^ys12%G4-D*hN4oCWQoX1k^9SoS#UK4ubfFc^e?W=T%AiE`8 zFgK7f0N^R#UGxLDI35u_UmNdV zPS8E?y^kw32DA^XvIEV-L7vs~?nwkm>Vg z``lrlWQjj0Sw1oYj|T;i*Pb9O+vr8=b6eaqKC;yYW$hWmR5rfFq=3IrAX~ddkXjtN zw#DY1tw%=WcWe2*)nFuBzeO|P`EH7^skZg1_IbaOlnFAIaA*g#&Lf&P8_n)1KuYRi zGocSKjK{zX-8tpGiQ$nE5`f2xv1vaR818v?JF*6k16QKxZ!wnlepC<+f7lf|0ViE+ zxO4e2k@DovDwHt0eC?niv?P+7)pxxa%;YcGN-KM}pb6dRGO&ozJ9HPi`*-?BfBOyY z{6VNXiBP1GrF*(nEyMfFbnJNPmV=LCJ)#ziJdm~W##7#b%x3x#{eOovH#r#9&}H>4 zsTgZ<$Q{?}RyjSltNkIBadu3ze#!1ou zo64C<)AD7c$&@r;&n&Iwzc*Z-KOzfXNB1v?-#b-)o#FsqKGHAWq4M4R^6ZkRALX>W zzJGtDe?R(*dU?Ows_nVYxO}I6vbCR;pFvcDD<0{gtM#ANOXr{M&+AWgoo$$wkHH)X z**qjS*0B)5Up@Y2Gka0R9O5fQt9F=64`I1WD>tK0oY7f*5=_2dE5Wl-Nv~jq53BSx zTi*k^@+=x^9JV{oD?0RW1rIA)+5g$L71opf83w{}LIeRGQDuPij5Au$4u1o2d zL77HqS)?})QSkHYZtY>wyS{hb8#|?e(PUXW3YbKgF~xBSNAZYekmSGx8_;p_@mt`}E#p}H zD#g0xO+73qU^I{My2G{-XxXZ+bw8A~at#J99TV`@O_E31>JKXB1fQv7D<$wm@y*}9 zD-3t>m?qU7lO=FNsu^}W6y){-Bn*U*>Okuaw8RcQ?!9g1H*3HdbL=u61!Ut~!W|gn z=o0sfSbp^7Yb=hR6|`M;Zr(?t z)B#E{ZV5S4q_JgNUKd!Y_DT5?Beu`F$f*itezWtI_LvatsKn%4A%5a991wC6{0@Yh zwh^WXQS7R|Jf1|#c67~hi*Nd9b|tlztCLMp;|Wt*uK0r?6R9sQ3|0bbW=pboAB+#4 z2$z(`-o_mlt}gr+5fWB!X`yO!8M{nk`#}ZE`Mlgd^=f8aOSg|*VORc%sDDtVCZ7`B zV}EK_`W*YLUHRwfEW4K=`c*Qc*Y2p~qV z2w+ZXxdo%8m;#CH2^AkV9G*FkIx9Xt%~9v)0DQ9#Ulind+6~`q0kU0yk90&wx>w!< z?@;jek)ZA;W3six`;H6ltjP{8tb4c3K~I61IHF%fAkg#Ze8nMD|D=^=69`6T&USbn zmzwZ`QXZ7ga<$lA6x)+c^29B@}tkoD_EL;jmIHMrrAqW!RP(rwQFpaJaxyT)Y>n3bddi%x|{HN zhcJ5Fd|Vz9OsE9iQBI&5?Byf24t=?J2~wNGKqOQgR`Q>p?TYvCWETwf@F#*dTWz14 zecyoxFCi=L6CJn|$nH6$aXil+Iqca+GlCE~?mL8@bT(WH4USrVebwOokRp8@anUCR zB-mZKM9aqhqokC>9zKFnr3O1)8s%&`cuLb77|Cmu)*`RS^NIBv~-9!JGL?gKX*lUjphINpXM;J1BppkGPv+>d8Ydcj2i?i7j-fHxd;-kk! zkK_}3m=JblQ(xnJa!~j#{+!FDuCnsd;R*gd-C(;^$sj^T+{Se$q0ZbacdUxh&d(L)98d{)5tOavnR{ z8j6hG2u>3sF0Lg~$G0%ud?plKJdP7Wl}NcK*DO{eHlWiMA^l=F$0q0w^$|g6mn{y> z5#gIrKVy89pmDJt8{GcxKu1TCnv7b^zrSB7+^=zf0($iOzF7i=iYD7%U5fbq37{v` zt*;*;p2$05-yJ{^wuC2KfW!EBDXc7O=)1xQ0}!1ua$&|$4-gT`1x@d**va9_`v%Ov z+owwKpP!dlx@pSY_ONvdr#o?c+<+NOVE_moh#GhWXJnX$=7Vsd{^hnT2-RofY?952 zl=sOPB75`!akBD0*WCaOt zePb>gCpq)B7^m}V4-^y!|4{Z}iFg7rUe#M+Po-+<&zePr7>kwmK1tpj#wXdDcaql|B*K>Feq^>%&+4=-|_H4CwY-_s} z=X>?w0*Y`CsSGjt9Yq_Dy=Io55iY=o@8w5059OSa;7kj(|J!Lvxl4d00#7 zF_!8g;y~~e7RvJ@W0x*f`*P_4<=Jf}HVsNyR9@Zekp(f>wZ+!M7C0?sq1Dd)))yjR z1rTmssy2*kFkV}%wPHxFxI>oF3gNhP@w$B|cBeWkhT+=Vjqxy!co`k0>e3*%XM>vS_8RN9B6*ikocQ zg=#KZ_g$I|{*PJ@!YeI~(67`-qq9@jbGECqr>~ICdn$4a&CP zE9`(pTtP%svieb5=^6XH!pLhP3{jho^J*Zf>Y!v(tYCUh zKdSl&P#2J_LU%q9*A^57Y~bY*h2|K<(_ zO=jh>eoW%Q&ou7WHIF$X-sUG5+1^>n*4tw7%?Fj-%Er}$T4tW!#WuvPa#f4J_6ms* zR)N%ZUM3VBHijYi=dLxEasy8&&%XV6toyQu9A=U1w0<3 zhH)T679N6i;a`q69M0d}4%Hvm;VkP5e_bo*%!R{#Mm5@lPpUuvS zJc*x>O2=ogJ~)o`D2`3idDL+;O{(@r$C)$T~DBP2=31@;D=F zu5Rz|v$>`xeI%Q}q)*S(!R*XxXuHoS z;ztkI5RV87V9M0C@JosGGQ#v)1tNa9RT$HQZ}sHRtsBse8?-40t-**#z;IC>kx5*( zYAh~v!AFJ3;;t;oTbO=I7bsURdJ2!L^Vp$DgZdUd${jPKd@iCG%0l52L`{KMj3TU3 zkl`L7y=e1fPdU@Bcw!8Xb-yfowouZOgKx_>gVT8>Hb&CPARgM0esRVUScLlK?fNYG zBH08U(@C*ciXLRmC<_B8TW!8^El1nIGQ7nnVzUWE1b@FQkH|{#vdBj9lXKMK8OEe{ zY8eh1jl_0axNq!6K~;`2kcNZnX!T_qc0cSZmIo&uD->iz{MEBP;^E|xW~pVkE~e`( z%g(ktdxPVt-7%-|!J{gSL`FanqVmo$Ipq<*<(LYVV|fg>_%({&_3BRQFzBkSa>AN| zgn3~mSr)wMIPsmV)jP{~v1py#k6CII>0aM~H@ga?GWYZ{Eb65vN>u9ipHN>e5BMp?xy;YG-#dJ^MDKujpT_Yh=rMzS z5HEMzoQf+eb@j2~y)qLB5BJ&U6RTf_YF1c6QSlnXV!Q`D(muPHt8_5Lr75cmt9z`D zI30bk#m~w@o~(`-eUaA1TE*7IUe)@ll=uOS!3e&^kFN4mvZRw#{}PxDHb*rlx3|ws z`^q`f#hJOr@R(b$XS6$@xsfM9B#(Is>y>$tenUvZvq<5N;3`B6y%G~UseVxOBUhuj zpknxxM4{XD$p#R=%Ao^~5@m|nms=pF!LmmetMRhD)q0}VdB8-k8ZR0RS85{>{=HRj zLw}J60u=vcj3m7~(jk#s^e(7Z?YEQNQGF&U7$^jT>1R1b}gj$pfW~!^VJT(>dfMz+c z{zVx8Eyl@?gT~J%>@(y6e1XQxt}eqtND~=Po?ICpu}(;`BKH+r6d~*z4)@K9Qrs*+ zcOo5pmkPOpZsxfjuA`Chz72m=2?6LzN=Qb9;#|i&RY^iV!W{jASz~OXGdl3A% zTqC1d{irx4Nb7PAV8qUSCxP5RMueI*#(l%b2v}HMdPGaG^ON?PkmZpO%&g(2z=8U0 z|L4UzraMpVX3E})n=79X0?7G7&<1%iwRmJC`4Mb22XKMjl>_y^4+m;_jJm7mmJCvW zNsvs;I}MnIo3HE!A!8Ps2#*vfYEUKs7c)tJ?nLy%c&rN(sW*3ov^OC_ik4yxCRRa zqI2o*J!3nu&c&3^Si#HXgWf8ydAm*RzrLHPB^jVdMQglxCn6aDguB> z0R%-PAb=9df&agzN?B$sMaMLMN=pw0e78BMHqmpjeaJ239W@}F;>p1>*95~0u)~}a zWE*MlIVrT^wR}9@8_5Xim1R)ce&Wd%(d&q0wfDJKvnWf%AYbN}q%Pczvkb~ySYZ=@ zt@H*^!KwtN>a$z|s>7;_{TDA_PmpEpzx31#(z5q!rErm$)U=WZu2+h{wK@{RVKbUA zVK?#+K&U={SX0UY4|+&X^~R7PcK3){__Ddkx>3JI7dwkdc-LpT`@_^M_eKu=pHqHR|!FQ36F3erPS`=7j1`cgk(=_uMnqAZv_3 zE%p58MNbmuOD0K*tg>d|#ASHBS1KH{x~gUbkt>{z6K%FZbz^7pitE2I-764gDE{Bzx#ce?;Fr#(#85 zMLveEe3!jnb*cJ*Z;EP)yePz=-zm!D?4!^_)MfOtjfzfU776Qv65CZNurpVTn9m3c z;%SQ#MJ&q2vCA5)uvo8t1nV&QR!%#6^&O}6-P}nyE3XpA+2B!Msp|S>mm*J#envz# z5_M$H7BRpqLIW4|?w}#O>r4cVTrtN3{0lvS zb48?f(sx?D6u|(Wdu;8F_mx?8f%`{~8a&}&iK;h+r^i^Ik{1GhWqZh&bI-_6%M@FK zmFfW%W~>>|}TPN1?B;q-*zzmDKb z7?wCwxUht$oTU&f<%TY3+zd%fN*%=Ym8#D%;51ZGC6^Bw536U3s}#avVUHplRXZNC z%C_zi@^GuMFn|C93o+!OFKiGchLv8p8!9f?s>;Za5Qb?I(AjPjP?UM-HJH`UYO$Q< zgTu?WDfa0?jfe8anFhx;1~22nguX7g1in55n3zKf;$rwnn6&@qh!&G-9^d!v)M-T! z(I(vCrPml~pHyUyX?hIfDd{|X`RYNz6iNStS|OK;QVsxo>S59q!E-$q{R_Bl{whZZ z!Cz2QwgCdJY-Tt?gbc*$PD|qGD@*fi&+s0~Q5Huaaw8pRh3LSIpw-i`iOKL@PA1|GJAx~e69Sh6DK6Y>dcVbx=o^NqBw-aDu|vw{ansHYE1xXpoP@}Pv^ z>eOP1J;aUrM^U&yLimNELLj-IMKHr-h}kf%5GN^c??wbBoEwP{3-?)2C#YegmBlhj z0TQ8)WTv6)Q@<|Y0@~=i3N@%AX^P z)x+RRZxQZbDcj)fb}B@Iq#4QkF_+*8R7k=bSYoru=Z;{9g&g8Xv?k2nNesq8?5D(0 z55+}ru4ozo9kMmMilCw^9G7c>IewL&1_@@ftIG@=reT;2K1Rx35Q*ImHa}s6=&%k7 z0XNYWrw|^dlHERIl#_NM6E(Q`&&;cRd!G=yJ1g3$-Eb)Xg?S_R^pqo~DRw{+YMJ(5 zF%Ep=%94L4ye`rb*=dj0(R(%q9;$Oedh`t|bVNN{j~5(Lf9MblZdNlNd-IHX441Oh zVsp_{FWuRO7J?7LZ7UmHVPa%gFI{iQjFxFJWWKwTPJ!}Ro8p5sUC-bs9u>T38Ero8 zOKs8}-`GMHU^B3RhP&rliITzI)zhO0Gq2_6`F-_08ia%xMypS#FC-B7BP!uxNhlyn z(xVBHGorkEgJOm~{IY10C0@lTTB>LDdgn8mAOCL?&bBG1=0JYs4+iIzklPeS*e0Al zkzWD#HbJyaxGerZa?b~Hsrv!L6>|?mIJswjGJOz}%pg|C*Fm_QJuGf=OyaujQ-AK{ z(MxblSP-`vPaF|nAi2^}?5xIvT=e?$_5RI6X|g>l%l#hAVdBV*KW-+wfWtM!l~_06 zbA_!(;Nyun8^=?cu&-UryC%OwmEY@AVtm5voTEnYw4M@hN2S-Z4dv48(SOZ^cy>*B z8r9$|vze8lb%`Dxd9OV@C~E~0O(GgR#gmTg!6%o_=r=ZAxu)+I`#GxYU?_PfD397; zeADs{Be8g%a+$${Ty7J7We{@W+jMuh%= z*~LlNUl6E#M?H&uWi_E96k3R$Z0oGi+A{s?EF>cI!~h&K)|y9v5MKi~@;3Eudz`ay zX{vo^Q>ZPBJ(SqM-NM^Rd{vLgj>T`5cYA4ib4eKkg*ti%8b10F%@PwKB4utQWSb%) z<<#INPS%XlzM6Y9Hg^Wy6~y2v{iAQ+Wb@b^Mv4nJY7mq0M`Pb9YdoSTjCWKXOPqqs zl&1%-h{8C1v7$s3-H>!;;yw{GLDeIAS zI{EaKBfrSTrn8Y%(<3AG)%s{Qxop_wW-dopPmhi?yx`ax6|_3X)MB)@snz+yNb9jx z)7b=FOsb&$eHE;o&g|Aiwt6~ib-tRHAI%#at?TZ0)yw&G*6i+Fzp2%o9&L4QYISzS zy;X6sQ5W>u+0j(9AFT3ft1MjPiISh|;(E-!qPhS{m=u5vF znxO`s$e8IbMAVBbrZi-OL(D{ zW6t_zx;a42zxW?HPP%Wky05jmueZ7{gYxdrZJD}1H~jC{+BDX&CiDL^((1ld=d$~? zk%pm9WfPfS3BnP(+4&MTM*u`u8*MqC9c|dpR*@~ zS-$fqy^Di*d#4SI_Ah*_X6J8pA$a@(cx;|P zxUg4kHHVykzal!+M4&@R;M*gcn(gn!Psp|KQ_cH7YZ4o+-qUr67ZQNf^Tt|NMi+K$ zfhTmA+Bri+pSnrulq%=$kC92u zVg8Gw6QdJjTz$vDcR2-U{VUP`sP1i?7&*^yt-5dOzSz6>!x8A3rJa94Rn!*~6PLs7 z0Fets#N+X&S7g23x{2D4G9K}Y&%HMU7;rl6|gUTN`V&Kc~OZb=j!CnsZal zXEaEo0iUX%F}kLqt|uF-vJtU(ZNxgr=uqp@YJXKj!;tO2J->EdtNk@`uZC8q-)IN` zsUh9^s@8Iym>ZDl>jWL&Q)6|_cHO$>`~wmNs;`2&`fr`BYgUcA#uE$zy0MY#5zS3d zK}C&LyW@lZq}l$NskF&DO5#{^{+KFEHgqYNkw~iTO0O=QHR{=z`e@FN7|MQ8udN;( z9i3{_HPxwx#?Qv;cDq&+?F-?x+L-Q6F?7AYCL0r0quYPP8yfT; zsaB!RNLDp#*(w@H{;o2ZxhskOdx%T|w!U7_IUR~UwNedw8=1V&xVvjh-|9Z&zn=B4 zj(^Sj*K_{$Isf{Ce?8$}Px{y6{`DoTLv!xi^_n#0KB4dY+L~7T_pLK;^4EDlC9Tdw zYqF6^Va}F}fppz~YV_?09a*h~Tn)&Vi)R1*>UH^Nv(v2CR3JkXb{vu zxU8poebUyYZqh`$5>*R6q}b3?Catchjkns*izr&1=hXUh#(b^zJNEb1sQnbiDR^tW z2)82=rmkQUzo}do$iMbGu;#xAg7#bet9JmF)-P?~BCq*otNms)=fax5xyGv6!p+^V zRus^hf2J`tDYj{}xCrtRY54OQVgQHK6$t z0Qz_LrB?T)J}k_0Q?v7B=>p0H&HS@5D{BONy6C=yxT7K>BX6Mflbk)jCYeDGeWY1O zdC|qS_0qgjzsH3Ked?Zi1Yw{7IJ6@9AnkYH%I<68tWkJJJlSYWY1vkrw3EriLTJwF zL}=Zpf$1uiXVeIw`?huRgUd8<_iYx7_48c zjnjcTJ5M`VKCP<@n8`O9bs49Cp>>wkq5j5eH6Z9{ncixQjjkD+5PfVyTmQkjqbki;FOx2(g zqgCMV?8w`6b^*TXL(pzbtCB9DwCD8)Lfg-8gp;3FRTaIUzcJBTpV$};!g|29p9 z{I2~xI}IwkBkRSd9ZB(T3TcL190PcsAM=Lq?rL2(=eE|hE?q4KKU?z>LM9MdrtU1N zr-ffI|3CEYtc)tvmWKwVk^cI8aI|%Fyf)_Z)^+PKaboMS!tb@4n)6!oqpjn4m&fV< zc)$2mUVMt;Q|qF3yT_CTLAz(@>7_gExYOP$lpSrg+d10XacSm`mds2OR?tKV?QD74 zFaXL~CV=kb)$~Jm^B=YNW{ujdqXxro0P%Dm^3yrwrxR$;2WZcyvR9+*RqN#Qe0IJD zt~*~t3-X0JZneLd8odyWUa&haYz!P5X^1*>-zLR{P3ncz*u)H|dnuJIM28D9>!q@- z+n?HJq1NZ4*5|LSt(g?{87mYJqf0SEtNl~QPx|TNQ4(cja^vU*E!}rarg&xdRtjdQ zY~?<#`+aPv^od~g_CoaBlj6biOt0j2FQ&xg9tTq*)EfiYkgh8|7nWTOVADc-tuGd> zZcNn1z(Hv$+V`^(%;H9E758%>u`MP?CF3Twq&XYHXX3}sH*?->{}SG0tzWm#@7U+d z+-?7=)%jto^L-J9?8GmbF8qFLPDMYYNOxp&G&|q3x?gX#`J+B;P9!>dF(~B4RQ7U|y)07!S^agU z)%g)7Y3C=cGe34uao#PU&gYOpo$qZ3k`@PlQGW=I6RqO{OVaT~i?N|_zO4l2J8_{@ z$Z0P)9T(!yb~~>PPg48zCiQkSYUC~2u%~ei7gTFMf1yOk$<`_Vd9roVFHW@(OH>6Z z)a0Arl=J(P50KZ-zYyYDNo2a$YCnImNp&%76r_6yd0YP%*VV?F=eIgP6RNPQ<~Nx< zIP+ufp4~Mr8PtJe^7xEc3@2>Wh*{_es8^(4CK%{fbn}n;)$07Zb>=wIz4N5$8By1- z*5>>-`a`_K>R~;-Db|%*42FHHiJsrm>Q0T;)%DZ*1D)M1_&qZ2FJ^+E(Xxs`|TvZ6GsXYvE^qvhS?N=V;Dg+Enhhk^l35-?*`Mi7+Le5yk>nLgG7)GGPq!wmWX0P5a!$ zXXn@YwAD35GT-seS2tGa^zc}-cAmVSNtt8vL^SUP^RJJ|Cy_;KX6|+wva1~`4R&5_ zjeut!vIgr+>UX->Qd>JURzO64>1O2=E1esv?KefCS`l%D8J(=o@41$yku_@+^p2c1 zyE-F^8WT*SMOoi=?^otlF;9=m%zu{!GK7Go?#({A8UNbHmwNxIOT}Mkg|#T(Gqe3y zHbm!}H0ylRmFh1w-sGqh?HGQcJkpWo`4Zf%_HX)>+3Z``zoGbOV{H)FZ(@qSF{AVO z90yiSnpoYOE)})kSHri(4sm1CYxbI|d7@Z!e6s{u`*ktT0R?c1b>TG%-&Ye2w_lbC zSh#z%aiNOqt@ewp_Coo_B-Hj2b224UyxIOd(Wj8TH}w`W~<%F&j-jXgO^rx@${NZ=$R9D@s`uIMRY7nzC-m_pmCB zO{meRxT)E_hr41k`AE7pAIZzM3MBAFzs>GL5;FZ!qnU1**6u!F@gG5_t3o|)(iD}x zvD%4=r@#0x{(jG0_xbNn<&KfdoiH=y8n+a??qEkoNKI@u);hb_|4_z*z)ht0 zzmrm4m1+rGtJVKbwKlRUoy+LAbD1fQABueyjTaIdA-6jFr^==rZmjwgx0*8}eRk%2 z6|K)C%5?=6&U3>@(~uXF^Fn7wp|t(`;1Dk6pBHibek~p7Qf76b`Tl6WU$(*IXtOhI z#6UpC;Iz_K_ly2LfBz*8th-hPFx9nrTY2C9LtV+_lAo$iC(O?NR!2h`%XIdyGjg)B zZMF5-Wr}NPO4e^>^`u0#dOPyYT$=q}(-Qne|3l+_WQ=~2$JuFPQRzU`A`jc%e_5p(CJRCaxo*#%%-pKh|N zWes)-P0h0p@>680j?iE?$-rA9!AN9X_*VGB!iqB6&eKoaN#1i;}`6QXH4(kg7}}etmQY-?r}p4jFY=Ag#an@On)t zdRj{lxL6G=+q2lt2ENAcURc^oRE*MY%GGlG{B%^?66|>7dvIm~{mLzYUtKBvm3j*p zgcto8aAl64uB~!}6{b_TZ0))^WA8~An$*`1vL`GAIZ9%P7!${q;ZWG9y!-|$lmUg4V+hSjct6ebqp={zbC&Vbu03Y9p0GB(ME4PNe!viBUX{nB>sIHjR_C{N;pK0s8||5BTVbp<|BQ5AeZ$ynV{9zL3mg-w zYPHpM$$kBjwtOw;?6a>2GoF3jkgl(6Y*HR1Vh}*f`nF5v-F^kO{*jhRx4z9SnJii#MJgOu%3;tQv6Wv4 zXS$G*QZU1uQ@Q1~390Qu{MW{g+JxW3@3O$S5o>e?V6Uix3KalR*A9fD1zy=Ue9x>E z!o+*?&j<}?Ho}rX(f)e|H~--~t+V_gNzQ)9O5SLl<69lTQP6eg>ps6Gebt zVPi#6HVd?2kv6+Op+oMNzw?vai?UKF5{%Y-^cdXm2k6!W`ezeB;-mdTUAY(*SmKuU zE3T)0$fX5^tP0bxqI?&DW>CkdCd+qS-{x8EY}noj3?z@RKBi@opl^tXo7y-*DQL&h zzagDYJ*Svv=e%vT3170aZ_BWXOVOCIrV3?ZaHoH(RpVYm+wFFP1zT5JqaveK5g^~t zZoRGwBsnDA-<0suDi+kB?#pNi+h85^<>^7B9~D~S9*C|^*Qp^=v_Pc_PDa5=7ZS2S zu7?C(-ryDczjOH8FRsmdXcLMx9d?`|zsl7D;t0ByJa3-4W@MDkioaJ$OTVIIg3jfm zYwEOixvAp$`?HT=+XjvnJhO3uG*Nkf4r%5OhtLVDv^+HBrj_PwImXXni^>BGj z@=<8pkHz{CfLoFVsh+xdWM5$>Z9GB+BG6@)#Ty~{BiH%Od@i0vek`P?B`qU&$qgYwf#6pZkOE@OrrMZDUq6Kf8I5YR;v4EUPRnh zzoN~XSJvV(*Pdp&sWOdTZFQrxCj&_Z{mQzqv3is+mR(pQX|udNfnC5p|XmvCv{K`#Y`f*VQCOdOj}RFwLz^+L!F&J8D!zmw#P!$@d%TKy`hf z+)~K1Tzt^>mus6fD(N`}my?-OZVT|CLWkIXA;VsbQWFIbEtBns+9QnLC-ii|%;^o> zDB$&CF2lGqyT_ESZkloA1o4Vuj_TY#PXis>dpSpWSN)&b<;ZWKa$z|@L*xUaN$MBr zp)eyRXjAH!_vd6Q8IxNO?@Z|To}K&OF?|EWrKKUZxq1t zp9C|Z{y?(1wRDCY&Vds@Z#vS zS@tCiioJSuhf^02ft6r<*tNWOltdCkqa=2 znhYc%deEd`9jU6HG7}IW7O%Np$Wwv-aZ|8}NG3)kOEs=yrRwQCM};jg^_+RQy3kZ& z@EIjG--(gUHeK>bZCKsmraWlHePx@Pr)Ty^1F{6??N?-M9M2s;Y@fWP(pm%)NaP#B zIi5)9wN@KL()f=HqbuATHKy?BL>{emr^ck@t2fs+`cAQpYHk>6M)vqm`?|b!+>9#u zN0k3OmG6?yFVsWP7fb-rx%BsO>ZCT*DKxSRfPAN+$ zXJz?ocbiGarjrcq`gs{foM7UP@z+0s^MBMB2zyPjPhEL9*$9cavQbxOzd1qtG#7ur zx%m4VHHo$j`hV^0Ms22TtktxAW7ulAC>acK1 zMX}memM8gYBEkWt^Bfz1N>}D*Uq3X=+0XJB^wWHP=}psr+S#?IHb0=g`m^(OKyW`c}+fqk1vAkhla8 zm5#6|n4M z%xibTm4p?kFO8*pxq9eYN>=wYYqN0SWNlq*L2;y)S_{(x%>P6TU75rkh_usDj>VKJ z)OC+G-Is8r4H8vx9=c(I**51kwtA=NLapcSfVq38?DI6A8d9Hgcc?$x?o+|q={25< zQ5Vx|lSLi+Ek<=$M%_WRz0>szP>U$0-Y=(Gy%U1x1Y_+|vJu~NGTZtq;wD&~FnRBE zv^rlX(}J*L$--)C`qYX^QS)1xIln{Bm}yzZY4`NCH6%Ps_e=dXdp~!a_TG%H1AR)xZh zxYVz*nDux6RO==mP+ttEEjGrJMXJ3xIVp2W**JEgf~8i=w#f3GGQQ;TwQkb>#>JV` zzC}H9EP;dYxo-knzYxv6)eu6?tRe&Wt;QxZWF#06x>iA&RoW$AzQ z5SLp{za)+_Dzw`w2} zA+9|+Dt@uYxe6?#0zZgSEOSy5p8VX4cB=eB`&o7|caM;FzBc(Af@_~ZJfCS;;b={n zL6n-%$;-AYls~Ujo+p;oRu)5iLKeQFx092`;cvI*ekwgNqA81?ZZk&3kPW4dYyEs~-;V zoF_aXE$xRyUB5R>Q1ysp>3wlj>+t~S>;08UjxUN7t-LkImI$CN>|o4=9r@4R7x~%y zqMuUe9FrDQS`yLHQG$W3xnugn^qf1^XwI=Tt%Y4elo>q>yEMvZDrj~|RMjV9vil%X zru_;{I=B(+McR2SHlMnP2)lT>70v+ejc+%Jl5G!>DC;gYQbL@suzBtIB?rAkr4Xuu zlW;pu3}VMdK@Mo^!g3ZRWqS2Q>zMp(7CSW1I%lp5{@2?8ts{8M_8MmUBQgGKqnn3G zkp5nK_qB2OzQ2p`C!S?5|C)FV(7bHlB1y?*2QU9-68U9_&hExMd}8U#`pp;C$v?+!z43l& zR;jh_39YI6HmU002t{zy{=H=zv^m_u{ao%D+UZP&lRoXIAd-cz<*@DSAIrv(5BcTo zwe?;@M*_&=l2Z2L0lL?klQfYHp~+kJ<@XjmFrb0VB+U%mq!%{#j!=QS1Qh8a|H|5u^9A;ri{ zhusW_*Ib!*v^jcBUh#U}aP+CBF1%_V7^_M#JH!YL7|Jdnz0NiLq;gLA-sH4ocWz2u z#5OXV#aPB`uNzOjF4m6BS+HcFz#Fe8_IyQ6prS4p*48fQ&9@Bfro}|5#f8~eoqYX zTXaPaFR0vb~3vc$qo9$P33IQTs zeNr4c+WL$08qL4Fd_B9_&|SSgDaS(C9H))Gt?8Mk-RYeBk#0)HJWDQj=a?4q0shsM zOS6g#1%#S&N91Q{Q4Cc_lu1e1{>iNrM*9Zb-WC{DcUcO+xcUlW4FU%u0P5WhR;+N73k_7#02?4)m z^o5fgA?iI1DX_S|B{xt6M~aXo328@Gag8|;@Nj*tPCx5f#=Qb|3T_Hw1qB)xkZ^L0 zDHvx9;by4S6-=Il$Q0sJ=goyva{rnO%4nbamyuD$9{3{ZiVJN`>>3#v(fJ~Zk@siZ$k1f`wT)ucI6&5wGaQOweX`R6U$tk?8#1u*pcjoDpl;YAxNitHQ2M1f2u zhO-$vvPtr{GT~D>_DW^SzoqzO&CH!Li_C%9)a*%zF|z;Gr2rOCg))m9}$O zi8)1<=bupqp!cEB6qwfXF9Yi5M>X-eEdfhaQu2@#@ z&1Mg?6vL=z7Mj+&_hu|kFP&VmUIF7F))R)##6nzlnE6fQO0z#`7$I)8#HfyaU4()0pgR@0p zd05Zj6|4WOE?HOKrZ~5cM;-qw08Q*s?tOjq0#S+AD??-;7y%SoabjvghGk6Cd9DN{ zxoG3#Cg6LgFQ{qTf&U79Fe;X!1wMDzHWE$|+x1RFJe1W`CH+}^EKr2wsy2N-?Vad5 zFh0NDFEuKSF93V}g$jmMLkpxf=U&k6KoKG}(_lEq1u(T77DzQR(h^&I)s{Ff#;h&W z*QJD=f5sXiAMdSQJXP2K&Qxw1j7vUkpK`h~HlLF6*HZ`dtb}hQ$a4@EKHpjp#_Ai@ z#$*~gQTHHf-Ea^VKA)Q&vOeavORuV@#-!8$7vp-&#oTtCO=1v(5G>N2V^dV63yu`B zsdHbgsi>cTOOQmH0)^&Q&my8!-RaNh$}jaPNX^DVP;+=^?vzN+;)?}BHwPNQ+Iga~ zx^t&Q|7SWQbr*Ir15yE zhJzJ-sWrT@@RH7@=#$RAAfcd3AwvXU`@||SCbsDSpoyjhZHBxg*~2+IwKHnTJFpuT ztR-COXwWlGZ1qjy`IxHqfm|*J80j17XG3g7erRa_RmMcKw>2+!G^mbC3|(m2!fJGg zJwa_d+U2cmlXFs;fuw-Zk`Er$P#hWhKwjtGfxn+M=V&}qpUvJr;m3-ao{R2jpb|!DZLNNa?jhRdF(wqh~0b9N?x+hmoLWz{*M0gDb9VzSI^3tb8q;~mUgP59QXMzPOR6{ zIXV*U>&NM5!O}h#-qbPDx{#qplcWE>cD}ZY$RkBPredOzd6nh%;$jGgC(Q5g3)EO(r~r;^n7pp8{WR4WjUk9RlDM@i z!ieWdsKoUs=??uLYLR>Y)XTf?lBicKk8!)FZF4>ERgp8N4VR?tE$2S%jIh*!PY%3|Iyb-fxEzL@3ddF^l&)qmSq!}vO8-J zL5bhm2iBzfzo7DB0lzCP8s~PHAhX8WQ+}Y~s@9LV; zTXYp+sNT-JesAa2+PE8Ex~)tu<5HUJY^a$!mI~=zO*>S1Z>P5U?Z(_!TD@!6Q3bx0 z3M5>lP>~7RzcuIkTDi!!f!4cLb=9!B@XNK$g?N4FUpN+K)iVcYRgz=4KVaVS8Ue@t zoO*GoLh7D66C}Os4L)%6Z7rF06A&Y0_T@F>h6YE_=#B^{ucI!#j~j5sG-{z65iOPd z&!jIs=7Y41X4t-RQl_T6L5&9^#~H|S2qD?j*mi28t5lr&bWpU8I`F1{`J!L1YY{-P zEBzE}^t)KC7@KFX>Z{+(QrehX-dLb|GhHb3)$0C>^Hh!+I@FyHMN&mqCp}*2&x9ET z6#`JKiLZ>Z-~`Fl9cZ@eMUKW4ueF}54@(cyM)Ad2 zB5hEt3>P)(<1mr2u&vuRbst_>>SOg{sq&$KQPrMTn|Ems+7plynF4XG=R|4pl5$pa zw6>m;)5C)30=Y_R!t1vE-hI9QyYc>waR^)9k}pOs82_eq(h+V|+)V~;xK z42d52=@V^tlm|ZAd~Q+@{fm^k(&+kEYOWi^Zl9ZO_U=`l0G||2D>2?!T3NiSrPQ95 z;D1`N5q3%7bW#e=d=9b@Tg@HN;LYAFg}tA6O0z}I?Y7Pd^=6xAzNA}#J9l85?6L#m zYCW%Y?tpJP+)NK=zG9$U7C>BPKQE7;mm?v}53mXCC{JUDn?i1j3ow(FnyYJgvpBIx zJd;t_#Xq%Om)^9fwfWpG>&{G55Jg20u}jaN5+c!7zTD1rxvm7ZE3(d`*p1>%MLXGs%raehRD&IQ)-I#o|wyxQe+5pq>8ES8_vVO(? zhq||cv8%fBJx^Vi%h!c{UH8}qLsz*k!~sLwPC*PYX_MGsyG^$ZZg7Z6I|+s|u{$~h-9nAi8Kz6^PfbURPbA`;PnM0%iyo*^2eAreTu5iJqPX(b~f(GrnBLs~=+q#(hY zWO{!8wa&ih+*`NGxBQV#+qcfypKGtZ_S$Q&z4piP1li6d;NWc~kuSM>nuR#+tm8~IMvGtYV~V1c z3VznRwUHrZ_?^CLT7G%k7GjEc0kz(%61mWhz%t`%MzQEzJYb z#$F)i^~L%@P9|W9DAs?iE5doPAI08A@7jz0+P`g{_FF2W`ivNrS7=b2ZMzQJDa>RT z(j{_C*SA5^Jy;af{_IYu{x+`cA*~lS+E~}tT@7wk-^4}-@;oH{sx}(ezac7$0#65p z#dV#_xJO2I><sHWt7UnqF$a!=uiw#t=0mL|lJ39`uLs)dujbKP2Xw zEXSkWc7R|z?ao@5Dp&jV0Qq%jD6X@?nO0!$86IER6L<=!KSZrrX+`o(&A}y)2_i~c zC|s(|XmRyDY_r)N_Hpg`CF*e++t}iiDAu)I*6h-WLkupP5Y%=t&nS*qMDg&!%v0_VC>^>MOOMqgT{Nkycnd`+Y0W*mI`sSb($~McA1nbD=|!I?bZZ z_hNT8ij*JsHK%@F3NhU4lOpceKAm_#e;%F7(J;!L@0%f>wKUc5iFd2}{U`ZT-EScW zX!;@5EL8EaW>D^4++qpM`waLfAZ{pM^YbA>WIu`dP^L zB#hW)voU$!n7nUF-j^nC+Y3dy%M<@6legA#m49{ezBYMZpS(BwyZU{9m*3IOgZVTp z5{peY{*Fg?BS%e6oW?=(vQo1Uz!tceDb7Fk*e(S=CXt&zf4*uly3>EE#pq7jy#9EX zwsIy5Jd%QJ({~|dXLk~TRsQ&jsfplwPWmwT8~2Xxc7|6_;M~#O4%>vD!As23qr2IY zPCd*dZt2ZTPK{u^+OzD2Lo(3a=yto}Q7-VyGivc|gwa)iUzzg*u*gMK^7?wyZB$ZRec(3gpM<5dSS@@2;f7{n1vV=tPn zW_E&17o}+%oj2Crcz1%o(CCM$hkw_E*#2DD2vp_~`5Kdr6!cB)NsUm{?1x3&REyfjre+Zec&5(Pu!W@TwYvZa=Nr^rnA zs$6akw24n9TFORl^WmaN&f?k|njnL9`yh@GbQ9|@N|e+vu3W0!nvIdv(qrEq@SC4< zu{T~tQujDTqPkp)DkLR{R4>}ElE7kNSo#U*nAskMPi#jHQeMq#fv!!mf2hPs+SQFf z626!OUYoQkRlAmaN$B-D)o0nYZed+#FTyY$-I~~Ou4W;1^3izm5$6$|`mm|!DV=Td z#Sx8H%*&O38A8tvl1`qK2}7fp)D&L&^hm^8)Gj|q?_EYGKbhax$e?8Jjg@#t|**b!m^#sZF_tVyjj1MTQh;?$>@CypL%Xq!o}b@I`p z7i(6l_S9@N2_v=foj=u0Mu%ZaJ9RW-4*1cPT5)&T64#S$atSc{ru9AqMSxF`mr&V= zvp{;}NhY$-q)jFu!M(!1WW$V1HV2O@H$fqITyn8;lRaeawQN2whHSMr`MPCmnc zz~*{CA0O9sv6O8KGMCLmbkfd8KPAfb=(+>=%tWw4nvVY|pb_IEl7d(vXwGDf(v(;q z!eW%Ldv7~RZd*H*yo+P1i@UBc{VIdk)FLiMzBQvE418fdTcfEt^PjcDb~8dZzG>9G z;Xq`Ip&EWJBvy||<}*zs;HwO1ws50DoviIjlvI2y1qhWVU$89pRfmw@6$3%CPblU6 zlxGHB%r53Mv2Jr!VnI7)E=fih9rbwfCBL(S=;Z5o0Svczu43a#15So=**Z7k#ZcD5 zwDjc5Fc$Cn59y~AmgD|vdB2QTjPR`ZPDAxEq|+0+fr=w*$sx4N@iR1T(Ni}m&F>ii zS)C@*B?teaGJcu>;gqtzqX#$(V%<`A$s)TfTv+|arrTqY(p_fd7|bMz4ltiYd0QCe2!e+St2sTC323ppR0BHt6NmsACzSDZ zlK7TXtGm#DgCL`sh(V`TP5^MBU&YQ|;Ge@E(kZVf=7z>vP)c`4gPs9}GTIboZa$8~ z4oasI72v`T+AkY`aE7`eqikfOFIeH!NSkCvUo!3xR*ceMjKip?&pj3=-)yi-a=wsz zazIKc^m#f{(FoGrIHO_!F3hwp3HfT5=X9~M`i3fC+`#t?^;Qp}UDSNZy)y73``$9X zMFO4i3$Nr;cy=Rq;$9SGl7Ug?i(|Pa5X6C_#9){8s{l-hCoDFqDS$p|;*9F9SaQgn zs*Cv2rhZ8fm$$dXBhk5hrjbVoC8T8~2oOoe7Pz7jn{U(T%F}isLRxa5BKtzpWXh!W z4N%$clSUfp150O-&e@f3iRGrXgoI^96Ae2j_OVx1*O&MeCKpA?EV{^NvgYw&6^1p+ z!6LAn0}m)goKDg8nTxc)x!j2aDg~QH#r%1B^Ln^>ZOWRaxBmYWUGZp zioZUsD71P02>jG`+@s_-kEFqh{wK=frSUJhH4wl7Hx(ePuUDc-OhWQr9%U}SVZxp0BUqg?_iclIbbGF12$@TU1DaUUycl3I&bZ? zhsZ5Zef3QuhkYzzts5QKx92L{J4$1G2!*_D?$Bs5R>yVN9=m56ANN)ZcaW-S{(Zc!?#^^NNaMdq1r?rN{lfm z>$h=$Z|AY;ihHs!+C0RqVLv0#R$REDhAUu7vVz8=q~bHCGK!*qVVm^2%23P95&Nzt zT-6VCQ6Ke|y|?;dE}3z=PbWyLAL_ym177_QpC+BD(ai;bPYXhKJdqn_huh;?{ zri*uEOyE08_O(}rLN{dS!>TBU_21f<5ASg~Pngb)&~nFojw`Y(YB!SMWM$NxT*SRFdsmsZu;$o1(hZHD%X1AI z-G&7NBND5JET%C*os;)_Ab-fjlQW&*iqV8akqr;#6R^uf>*Gn9N6!^BH{Ylhb=D&7 z;O?*D(S^kmgQ%s&vOaWrke}O~NIk#`3pd$nl}et4oHIp(@INNW_QhBN>}xS6HpJCS z;l!ovPi0bE`%pG0sT$xupl@=502phPTdTq7;{^0Vg*lwz)JWDxTm7D3-bG#<)zR z5R<`$6U>z#)5Np}?PN#|BfbbE9t;R9$U!1%-g3QFdw2r!m=!;I8@$mb>p z1(4G=(PVOEChtn^1Cm_SNU!3Fkvxr_Usg(v>Y4;rjCNNeFKxT^i33>ABUZ%ft2xWA zFIJPo=GWt^b>ZIVP4E?5Bpw{SiC$_vE*81kZhB|7$!+jG7GR!v!I_Oy9e1dqtVWlZGHCy4~Y71yYXw=FkCMS!AUB&_XmCyTjm>| zH8JhI0Wc?BzTqpRFbdc3`GA0;xSXA#Hwth--@6`21xDF zT{dmG=+2^awyruWDsk#9>wF@KYy8ChK#<-r@_UfbT)FQ`)1T*LS}|X8&P*z?62Ahr z>w{xZtyEb%A0g*j9jo-T*APgsu4LEWx|2Jcb!f5a`#Z$G&fIhaNo6HQg37{-|;4NqatKmn<;)Y|?L?E?c$mrx>Nkx6UlX zSMZ)kguV>ZJ}^>$O<5$8SX2 zvUgtBc7&UHHPjaRFXID^PF=3c!+J!)*10%*3%0OZe{X3n<#OG~`1PD~1kTvYOCxO9 z{cs+a1gDq$VzdikBqv$SZP6v}#^uQG`1KsMp!f9KaisCzBohnL38Ua$8qon7K9z*V zxS|+!H{d$dVyU}71o<7qmtqKst9)p5M;z7<%>6Vv=$yr70^rEpe+MjAg&V!uV0zGfE=XR>O^1!{T< z-82kyYds}#IzVL-U7Deksc$D{-hRfDnZSy1<{AsB}lVS)|_HKwqP+wp|B)k&YC1#tnW84 zpzl?Mohz0{OIQg}a3U8NvQ_f)~eBXx3pI9ORrYA}k|sIQ zAPZarq<%q}q_HoYf zGa+sXW6emDBy>)-NnFZXUF23p!LOjtK;-akP%vVsE3hnfaRyPPaxWq<1iv(_K-0%eyX;2CFbGjY9e5f-W|n zfC<9}8$UgY{Hl=!Wzv`Lo;M)NSkv}u1{5ZO{#hU#_WPc1is7lv+y;}kK(a$kh8>lu zKmGVjuZj~+BvNNdoW+T{F4BPwmDGE(ZY?QR{{>uaKgtB>NX%$8!FA=3S=X4@l@{*M zloZjzkKIc(wlbqBm%pP>jt3E1dy9yhx$srdx+2*tT|eqQi$vkR0S@Y$IIs%>IM^PC zH1(r66JnWzA)6EV3PF0Lw+9?G!P+#3ya_xfU>$ zCT0*=P{VpT08#YExT(t?Xc759kHWF&%HypmS0QOBxj7xiC+Pghm*qn~!-9g44-Ay& zv={<7kAYYfrp#p`M$E%V=Rx+W^Avgku;4DtAWZ~D)hK+@L z?KKp6E0*k;k~#G?S7lIOqnH$f!6ul4*P#`YHm-61=kbIk6ret4xrKMqz&kijl_`pi zGV4OUY{Dic*nv@5NY)#fMV^2iS=NUv>sey4>R3uuiGg-FIrmYJQBw5fq%VM2F$lx6YePf(yx* z@Iw7$quuH!Ijbf_E!#5PtOR_1e4tB&Q6>nJRHgb@Q%2ec=CJf3F=?BU?EHjy)RUM7 z5fTPc@U_+E9J~HlTm)W~m#CNxseYP)u#nkm3`<$BjR)PUp}47R+gQuNWpq)vBa^)~ z;m|en7Fm&gh@&=~Fa=5mNzwG^RD-xwLWcYHaitm@HJ@LDN#$@V6H4-i07%5S;xl|% zFHRoNIUG!$4T0?!DVyw;#1fljqeB%{@Z^ENn72eIG?&j6UCF*pIs#HN8CC!!HZmfT zL0b|V<0#j)`#6e2qlOy28PDO27Xf0oz5FB@p~=Kqh(tn#{&HL@N`=d@xsO9TS5Pn5 zW|!QB*=r|hY?CIFOAYL96j26Q{k|`KDlr6Wp6QM43GrrjMd8z$VW^1`ht(<1*c9a! zWJT~p$;#>C1Q4*zIc#?_6@&HLbSn+%Y*AKQ9TIblvTHR@tE5GuSlfT;yR2%r_OcuhGw5luX$9cjfa9>4nvrqRV?d^0AZ zX!_GgIv-T?sLKAq@)KLN3VC9y%|1_TWibc*G?RponDh%QS1n_<#{%Ut0%iL+QMRWJ z8^AN_cyX9g-0}7%hq{5adGaX;l)wv+jDHh$6wMR+(hu8X#!R=w4mgC79C=)l# z$F{qoVas50{h^EvZn?p>0rIp$){vn~=bJ-TMWkw2WNbT{n{luyC~GE)4+(Q}nzKr`o>TVbf)lC~DUsaj~_28Tn?*>b5g&#W`CK@QJ)b4)*?r;opKeb*FiL(0nSo?q9QA%*SZSNlr~W8A$BK zDm4FOR4Q}-86Rra-KIIe@fY2*{4zgvBrR8ypL!DDfN&({kyFW=Z=lOu!dXY)O+LvF zp`d#y`OyRc2S|pzRjoG$q8Qab^5+yPVmNaTT9N3*jTp};xZXCxXnXhLE z`*7$4w%}l0-9dy7!Iy!x?k^c&okx>@PZ4@ZQ7JU3tp1h;ej0gUd#;g8o-Xtr_D!XD z3Lii*5{gO9<*7q|DcUv9P*3wEdwG25KFleN8J%enf(WX(@&>)v(}k|3Gve$kNDY!~ z*@DX+4&5z*<0J|63;mC)zfzO|uR416&@0^+`lXH(sHsglBS42h{CC{B@!F`HF9`8}-cSC=7hnB{pTGY< zuc`n2qJQ}9!e74o+rND8zl{ICbG~_?w(ar1S^mHM@&EI8KmXaAul&p3{qqfrFV8)C z(V_Jpm%sbhum0k%`u@xRHSe!(zxv(l3V-vjbKiUW-OFEo`oF*X!O-q)3;y<%|K;(O zU%q$M-|t;D@IU_Vn?}C;;Ocii_)lN?Ul+alUvIjy|3rMt-eskOFaPb@?O*!mzb&kd z)!Rz4yw32wHtJ2i zIq13Vz9?FGS9GW0Fa)&i(H`J_-JlHYb}N-U`R%Pk=W) zv@5fTriWEhvOA+cn-;4pLW1dGEZI!`RKq*KC{SkE7mZ+|$Ze5O4H2cS1pNs_+D_n| z{NHHNX@V8E8K~_&QRYHOh}4cM>3%14a*#fAH<4}6j5z4-PU(;tqixwND2 zht|@S41n%8?>tpw^nR6fybewr1o*`^KFiff}>;Dn$P3f=L;0Ojd~w6%Bha65L#2U zhcz>d5ZgZQ4x{_NX=)H+ua5Rj-&~=2rfW_wcn1ukCJr*wbG3$E9aSz{AAKI89wdFq zg#RI9MM1wQx+1z3!8pjfWbARD$y;Yi#fl~Gk5)(PaDP7fT(mIijn>2B8n^zE9QP4l zqR&0Z{{z6ii?CMsKFX*B$KnBF!7FTN8es_gZ1gGq9|o4Xi=_Wya5@MBwT_R%?jUJ3 zB4`*pfPdIZ{1oAb>11L2{FDt|gVCqKJ7E2(7Q8MLrOz8AL)v^71+%l zyeRk8sQcge*Zu$LF;Bsq5RAGP@Ywc0Aw8~zGHV&P2YGLSPPg#Bmgj0huP5XNTpMwH z#$vC>eKSJnM*Dv)Vb@u{haA{O1kfNEHD(Nw@zXq&Xf@Ak$@XbnH{(}kKpDC}4wNBV4Z~hfvr|ya8KhaBsAr zn+a6Lo55mZ1DLQ~XW&(UKyBpj7O=WD$t!IlsisQ#3=vz1RzZlu7^@FyZD z2tT)aM@}0I!a7 zEc)#1lHW#uyMw<65fv+D${KXC8PRdoPYSHmXz4DiW`=nL<=_AVzEq@rGb0cby1{0M zJIN;nGE?c%LcUh)x1btjDT4hW%O9=D15Nsylih4`J5Y69 zb7U(6?PZwQW5tfZtr{%8hWwQ*zNR_j)XE%gv|LNIW=i^L2Gv<4zk#9hx@JVa0B#zh zW-6uBoF!F#168I_w!LoL(!jU347eiLVQeZXC2r7=no@LXhW6#OP(&6HHHGXV!!|x^ zP?Q?)y}YG*;#iIUx9~n<)5n&!+h%xr0}J0fNG$8i0U#EdNp;1U#Z(J$=cuoNt|oP% zBOXS#xh`6^4V3O9;sDCdu+>F49a?K=Q%#b>(!{qvnYX z>0NEPVmcI8GI~l)y;?Jj?x=h4h?ya~x^mt3{HsDZ(9|`jtGjD%S5Mcxu6)=0uHLST zx)yXTY-zC2ad#RO?t{dxIt6yi|J~#I_rd1@*~h2rCEZJU@TcQBxVQr#>MrO})Fajd z4KV6nqQ_&O<*{MmoM`B)(S`rtS7IKR{jd4eUw03IN#8BB-Y|dC4o4Vq`Zm+JYPn#z zAcZD?N+Yg46cw7ArK{Ba+kgA-f4xLB3*$tPWPMwWa3c-Laz!g=Yyr4zuLAsMJdZ`a zvZd~)w8K#$b&A24i2TAq7L~x51u=sZUNPd{C>FNEfJr%Z*{$SN7a1bmVN!(=azQq5 znLLLL8_jZuC_wY=gV7p^0A&*ks1P3t@1(l-w&}~*sx&(mIq&E1z82okZ!7Fj|X%U%;<1 zy+tNU?UW@;rr_qmB~ZMjuVgc1iw-;xi~Qb5GBZf4StDA1gJNW^QeCq7M0YnQ{S~Ol z#Jyr_&{VyERu*`Tc6R_-HQY}K9Pve?_;%VV)ZntIL4khP2(|n96Jl-&~1+H91TM8J3P=E%mCGre+NMcqbM4v#4LyRj#zFro6eKx#6b5x*a@a zvUHX{057TU97H>D-raO7kq;R8_qH&wI_x3q9L)eHH5U_QW*=gOo4;Z^i#v{toirT^eMrBL7viSoZ&AYapbI_ERy~ z(3v7XJ%F8^0r2umZ7?W7WocyMlHFz=-w_qmnI&U1vL1-;-%1N_#uoln#MtfV0kY74 z6@qNUEwjF$YmU^(oMif{+;gq~c7ss!K%W)oha;rDs-xwxY_k2-U&~{v^a^L^=K2Q# z{Y@+tYxv6tM;sh$&?BXgTqn~)CsdeSd&q*}MW+Rw0n4LKX8F4OpU;2cBI0MPy*4%wb3|9u*(ENvpdWl1UP|Xas}pUv{KEMZ7qcPR zIbnT)sJQMwBo)sV>#uaiif7m5u9x6d-!q4=DDCL1z~)Kl?hMy9PaY0O-QSAlm01Sj zv8iuyxqE}AM;~hCXK7bgxf_3(nOqbt^Q{gK&>0SZlq8<-*0@-UP{B^8?F$~v!cvYM zlx%b2`i!!G=1?*Q|AMh-b@U|$+SSpw7*oF-wT5Ux<3>8+YT~Ym;^t@tRo+|4vYZy= zv<|Q3`dut{Z6M1^{xGyK|J0IQcEZ)p?ND|y%xhWvb5jsG6Kb<7}Q$NnPv3Qtk%DyT6V zOz#Az9aggN(O!p{F?GCFCHS?L{P{Dsgx6I24YoAe(qZm4%qy2=Teh=yZRVLXGg+tf zX>Ehn+IEKBxl$~pj!m{Tqm=2ur^Wr*dF)eq}aq?!^L za&5ACgbXG!%L$jm(E<@>mQOUO6`G9#EezNk zNeyNH&`N~Lmz`D?5sWm=!`gJoE)F%>0zpzM?`2af7OW0^YU`{)WI?tumNoZ+yMQXr z+ACX~>|XMC+xN;cd@nHvA}Z{&%tJH*3(T!0G*`LQ8r{05<$mpHyzm=GrZojO^U4BI zIM}$LtJ}armrkuP*q+pa2if@+3^P}TASdd6sH0|f>6IpnwJf2?ubDUyTPJ4cumfkR zan3s11B_pR!+TR_;fsc`3KLAM^y;aH36#Z(9xH2(dc{a|an_S!wBQyvQp*i8tmnUo zM+U0+c5=vhh)IkrNqeLIseG0~iKj;91G}<0HB2Pk(9X(0>n4NgHo@N3E@{@TuZfrX zkp_zg(Tz5Py!Y;5aCgj0l&{@4*GJ1|j{eg5Evs!BDJGn0%9VFJJEb3OHi}%kId4;p!Oi9+AZNa-{+e$NGk!_#dvjx1<*iD-` z&)i6>W|Mf<@@h7~vsG@(5nHI1R(0-Wbko|Y#tdnw8n0B@`)#1p4%RIuXoApRd8UjZ zVcQlwQ|9SP%~t0x+qK|E8={4}jMf3nOxzdnEZLYmRnC`Wz-R{BNtSQ^?y$=e<(_uM zrVOLrA>v5ElC@u|$n40(TuowEtkE7=AkKjcjY+oJyM>izAsPvfqMd2uvxcy2_1YoS z31@J$WP0GCy8C8I6!`FLG00Z+_}K%Q2}Mmtr0i;Jkd`Yk7bHTeaBZ6jL?A_p8GI+e z?h-I(rF15ka^u<7b9sBP0lRzKN1x9oYTNfa;WUZab|mSHo?F^y4i)dTS!S)Trv=<; zvm0MVT#0?sw`llucL)pJHJvBD|7@FIYK`Vt(_@kCP37u^ET^+}yQ6ceblQfqR&J+9 z!6#T>Lz1TLxMp_A+m6(o^@rBBY==!#dybvI_H18PXKi}d>?qV}yKXp_+G#1ZFN>D~ z+A4*ewv7N}sn0I*5!ghAkuVTz2==`_BB#&NWb%~U52sj54A%FPqmyEXWc-rlL`AqY zrL&B)LFmw*SOKy$X-xE)lGjVRa#mFgD4c7YRklNGISHRqmfHOv3`cZG0gt^1X;rAKGr_q8_l4(2H` z$7r&xJw?~r2pJBkq%1O16Q&%TPSST@$b!oC3juw$lrKN}`+!BZCw%ilAav&8xm^AC zDK}g72OQ0?)><;XURrWky>-RUx4?&e4`SGG@!_J|vW%_)JKFBJUUmGN2fL1yWAge|Q*NrS;LF0bXv|bRDN~?CnW72vi z(05Xhc8~>A!ic$p(%TN`wp*e<;=dI7{opP0n=C2PBvWj(1J2K$O8F`=l~(-Mtxm)E zbzE?mkoG!xXNtuaC_`uVG(FcI7_GCnBJ2lDOHA{#_s-}+BMAi)zJ!s2FoYe!@A?lBpNw6dlBZF{FIMO+Q^R8`t__Q<5g`=Rx0p;t%uo)5q? z)$8i$<}(!`eX<=P)9T-Fb|8j2$)+QVVXutFFmb-y3uX3`0G%1PGd7Jto=qWb7o=zE z3Z0DDy1#5?rwM0mN$V7FmbKS(J~b2aDQ!?WuvBtpn|+Y1dm# zwexlM{qVk>lSq$Ebaqk;Zt5%X3pdvwDO|-a#pclD%E&Rk*Hv>Vm_s@n0#VruqP+ z&al@Gj+UP}pENiZOtPJ=T`!rvTs>c{btcSaJ+7V|V(A4jzrzA`=h4;CIc!*H)<|dS zD1PZl`O)*qkkfa{l$vL1-rprgPVO^dbYA6_?(onSH{F<_6=?0#Zyvif2>RVbv)0FE z;`Gi6)+WXwu0>jVex-G1h3gFI_J5Cp{W!<$SF&fK_jJNpI*;#t)p4(&d!(Ai`Q`t! z#Uk4$cAUM4kU3HZ7G*q=smrTdZo4AgnaZdgS%Rh;haLo;8+d}wr+v4>#A)0?$^3*}(cJv(?CSAh{Vm|E33-D4Q{~rTa7yspd{(YzGOw+)W=GiX$ zAHPmhhvxE=|9bvYpvfPdP4vxqX$$;5W0>&zYrmf~JPQv04_cF{eBJga z*!dFO?RA>-1%0LgH7kxDXvcN4Ln2&tpo3ysSea?O`qsG@7Y5ySrUwZFUqp~1qNRk? zZq;_KFuR)0RCKHHCoTB+>gqvc7Xa?HI}y8 z-0Wbtl6rci?chu2de(G+|8jQtol6ToFuS5U)BdI>&{xjBxPO4}rc*aVfwNxE3K`pV zZmp#c!TK@}ht2m|H(WMd#HMz_rdcZwOXE7t zf+pz^F!jaT={fAn%0epd5dUgQN&D#RqiiofDmg{GN)Vhuwc0q;} z;@0@qtpZvCJ`)yg7cv5+bSap=h!seiR`SeEb$!%!R6ReS!(xaZnQ?AyYn2SeZRCbD zzxYPnn%#~Pmfb`9cT%(e)UHomn4;R%^g3UPY#vnZqgFCIl$ZqjCD&R0Zad)2R8<$> zGi@x(9`nhfayXjxK5%seU4<(XfG!is-mNfwF&A=8K2=<%D__S6X1@qAy<7?W*V?IN zI!f2jv%1`jnElQ+k9S6?8L#!wl|Fm0i|LjseOE?O>j6RzzzE->`iG*eGqGwIKT38r z(#(Lk`Bs{c-!@&c51h#ABngr#knz;+-K{Qn+4R%EyRw$VFfwaSUb1mo!;tEu&0(`q zHtx`cWKN3xkRkw{4Tx3*xMWzk=n&%Bfs=S?|D8Z*$Zr{RrX8(^Q(KQa(-zGqku?@wawm9y0e#QvR@-J2%A zKXrD7_3Wjeh||^palVRfqI@fUGd0<^*QGtqM9BCg36F>_KrL)@-U z--&byqh;HZ?d`Lj`E>BEb~Qa)U|Ai*D5vm(3)z-%vp9}R*{G{Qlrq+2kUo_Cve7I>>`Y~wUcA6Cu`w4yR z!10wq-CU@d?)2(LmPFUIYK+-wV3^(brQCd|#rGJy_lzguwAVblOxcM%2>f;1OlY<4 zZB9@4`Ow^a$UqaDZ8L%M>S$)Csj;>%_&o%nxL8ksgxb{Y zVY`~6v-J zGs*{uY_B<&&3)b(^dY72+3x#nZk#2&<^?V`lzOI}8(&g_A!}^EgIS}P&$qN!!KKd# zE`jMxp$nb8$2Tx6&vvwQb`efIUE$JM5;ENe(R_Jtxt^_?bQ(Y96IkvRD4~r>ngF!k z>)UGCX)Y~2ZKD~hnz!}DWjd2ZWAQK0?Pux4!Gyg9TWJ6tH_~Tqv(`2LV3=EEZ?XN( zXD)_IAp&Vqa?4<+t)iM5xlX4w99^)z2mhIY-gBV|c;G@8kR9B1&s^Ak?%|eFb9St- z??M94)`Dr*x$@I(=MEx^(co-ZZ~bgDWJ~+X%!F<>$WGU7SJLOawRJ_S4(>@W7{Nwx z|M>wgqtlSd7w_Dy#cY_l7?~h+H~dlfv3(ud&hnapW_8=_=&kk7`>3!ml<`Iu(p&Lq z#Bsxt#(-H{d4v3x+R#Y>*+%WZohArd=7fVV()cF@dt0j8ZUSu$VLC5ZQ3TcA`Tj7G2iK{xOV^0OsLu4QVAdwW(N=Mw+ACVy|?3Nac=FrIP!wl_eo4 zeKXwG*F3gl^D1R_XSm-@s41O9rzRF_z+eOxUlWy2?o9Mp33|;SqTX*N zw;FAX*3GtixG8EdvWwI^-P!Y}?Mj)=pr&K${^hi`7TuY;(Cmr{Bs)42NKMPtfX#cr zoF}HGr~m=3cvT|_U1Q+??{G{Y2Xy8N}G6EtSchoPb!?A*B?vZm{ICBC?JE1gn8 z!TX`s`r2+7>8u^j1iIZRhd(_#(Ct;^&Ie$hueiw7_#-`Cb{x$Y?xmi7cgun>bJFSPEwd$E zTFES!mU&zA;GU9M1CM%1SW`}$lM8G#M!Drlln>AQUUkP*7=6wpC zRPVZW?KU%5`*gv%m6}$s!|ggLM!|0EJ12amB<-s0(*N|$nquJ7b+6BKz-Pqr%($h6 z-8}QYkWO0cu68YU?qF{_cMxecOVJrV#MOMuY3PN1%RpOEGE+9EiYgfFwrgz}91F@07I)XlqlX3fR30e;81QerB;$^Oy{hDF*6&1GxQPPaPFdXmv8 zzRkt7tS~fd2dyC6anek6KrxnHc&=bpwFeXE*j%9pT1_9*?+0kFgLNXWQmOE*-)(VO zqskfYK-2z(?0id>gX#7JNEr^B0?s?&u*KleOvIXLpTMnX$$M;HLuU$3+CKm3cVA?- zjm}~lh+558zNc;jIS1RbmIa1bKvjQDS$ulxoXaf$vn?x2v6*%;T-n){pc?{{2bStA zTlr)=E#&-;FIi#K8CIqbyOGP~sH_~)3uL`1LoXI>5OJ=Cxx9=EGYKc)}>x8qjI`Tz3t4* zd^0jtX5ahBm~MdyUv?9#1dAto&sB`WVOReMNt@O7MYAge#4CQW! z*J4aKov22*pFfG}2k2soYiIJCvh7k^2eg)?tm=aSpsEvW_--v6Y{g1ygSNnHIY`EN zExQXpy*0O(qK!;Vk}{tI$Ak|kHLg0p#-3pcP?biaq&lQ zV4s_kHo*K`^cNJmI{Ff#e>K~izZ!jcO2{BFH&W_q;;v!s(97SAaC6ty;1RG1bvzrm zr3U1yqg@;DgsRRKMMrCO^tlA!RaEIK(N%{2y3~19qkvUy5?)13KcB(q%H{#}7-W}5 z`*m7Qdx(9@%dv=~j~*P38?;1+jo~3#OY|;sA7tojAKkabw3!32gO+mlMTI*UaI_Ic zyMYcx#QV7moy^d96pP8FJETkZ7rVyh`%E;>de+!qzTrfJ*s*AtQu>Z~Y3^y-zFSRY z&?w+X$d_qbsTT8OMbNTd*m!lZHjzuk5DsbZvW>u%n&PXHX~Y^0{sN)}Sj{qg-Vr|N z(^~z(nUhbg(v>r32>VXX0Cy@;S8U~8kj?bduQE-(-8%9%+}r6}w{TGDR#O$2_1+G* z?Bp_F8L2kITvH`%yRe`^9FDq|Mp4v#u^yM`5k*~k*bhk zWFvPYkJ?MycJ@ZgS`$cwO5a-kMOy0+soLku-$DiNV2DT@Yoq>K02t0pj1Z?Sr7B4L zm%AqF@e53O>AtHgn^SKjr}p2AjhyxT=7`Gwz9v_$-+Aot$lil%?%aFdkwg1Oj;-0T z_t3%phY#<6@PWgPz%*>*$jG7n_Z}J9yQ*~X@O=*+I{a%k^O59~cMa%j(iRizzA?me*ozCYW0Z0Cbt-}}H#_kQLxd#=Cl`Wvpj@zZPf z4z9bg{OzutU-;|UVY21Gp0Ax(B<2d@;XEz=`$3eYT|0AqcYb~UFy!5T|Ni^-j6mbA z@?&ed%H^3zwe`WnBRdW~II{OXWwE5=_)@3X1^Eg z^ao&f@tsg@&w>5lGO}%X@X*0MBO`kcb>*(v(Y18WH9K;1dg8wBp5l1-oSx#bo}Q(} zhq?$GnA_bGkLP)mzb{w6T<_@dF&TE@7#$*4rHF3>f1CK*%HM8cD%Z`{ zgpR+a_-E%U*FSZ|l_j83K22EV13fx@s|Nq?GqAe=y=Tht8zWPYT)VzjRvmlRl=QQ zsfx{Nr}cP?NBxu@<`Rj@6|3F$uBFAXwO!)0+UiSG>_6o^#9Agq7AF>vqPjaFLO!kz zCC<3|lz6aqPb13sy!w#RS9pvXF8fra+O=JA?RxJdlvu3Yq?|VzyZ@vsUT@XLQT|w& zS1NL&T=&SeSuV9pb(lweICfIxjj=)AQ`BjkV)cM%T6v|bpm+HvU54S4WE&+quD`&e zW~J5s9E_GI%TeJkI>yzBTo2v1SS>5S@JTTUAe66aS#AV3BVUX&f>7wn{q{I&Xg?>obdztN@_H)zvzcZ5I6+nO~BN+Qn64 z6mzLc6W$#Z@tTrUe}U^|bHQlU#~Q9DNL;Hl@T={?KlYmVf!2>FcEl4qMO}#?I`GLP zC~)q?4o7QZXQ+EzgVl=FU-PJS3-)*QcwCQu`c?@?^*4%y@rt#`r}>wViQJ~{!o)jB_3_a19^@s&*(4;K*d}matRnjBWdWvm5OtGMPtwC0Undj z&*@o|&-Khxz0$4ZjF1EfZeeiIv~HCCXuRd<+m1cVq4ZDR<6w# zjW3lfp#{+<{XKS1eBv3y7ZO%Lta#!zJzmn|RXxOdCnOTeKNLErmDp60R}}W&6#Is? z$alI--K;E4B!@IjTB)+CpfaC>b)*7T4ZtX4U&V$@8~ZAQf;uXd%(y`MP{y^+2&6C@ zGNg%B*5k2Ez^trQlSw!h$MSRH1E@=RkQ+Z>lJn=%V?wZ^Q~{I=(SF?2kqW4rhE*9< zokaTzWRELq&dN?bp4MYn1*%Ttr>RqM{LSvg(c-Sfxy5scmG*!(#G`(c$3(v#E7VvM zn-Weep7@9{i}2c7L8`5U9BSE#_0|c0or^xCvO1M>z9Z8qPr9vKF zz@zp99%W%!rbopUD+Ngv*Ot*j6T`UbKh;CMq*(iHm&&OPGeI%O-3qPG_0V4m>FTfY zHnsS!DJzOA*5`wDvHC9>)yO?zDo*`Uc~u>8u*Ri$!WoK)iKo=|Bq0_VIPsJq*IrYa z7nG%bHJPs$CL%-a1wHTGCus{WfKf>yJJ1Xe*a1oaZrMx{8Vm8g@aEP-q?e^TDb z36-awQa#mhy&hbRfdkPA7ZxYQpY?xKbp404>UK%t`a3pQpNLeu`Y%awqFc#+L57D{ z%Jo}?L5$*wbxKn?q9#B8^Q+VCPn<4HA@#ZGKej=`Q%E|(veJ5R4-d2+7ag}G7Jz}&+8C^s;7 zU~UMVZ*dp(M7dl6+d^qhS3aN1m%4ck%+1X=2WfNj%vDI<^ON^Qq{t!Qo|YXVisDjl zgrNDJ0!lqmS0Nr>V6XCX6i^tLlb;vO(JQ~O)I)5!g2AFt$n})Ex{Bpr%q>Ou7e;Wl z$K(bI)P#hC3rh35pcpjc-=b1)>LDqxy9xu;Y>qPG${SK2$GZ&T#{#eU9^eVVy{or0 zC$0duGPmE#uFPLxA;rpkg)N}6*iGUM@uqmIvTd+z8|2(An3e5h%aNqFG`CAA;k58u z374du2R-A;UW1OrbPT>{uiDyq5hx(2myj95iuaiU*q}e`x+I!Q$A4-{_yVil^MuFc z*Pu~cCe4!tsM@~}+NSA6=|W%bqNtnRbviD;Q7H5(ue%pUi~&EzBdmocIZ2U*3ZS16WX&+sIHx>?t*VbJgWCTuD`aG6YXFRqc3M>SL+%g*;U)KN9k*da&v9 z^tZVDD4hy-Ap*6Nu|SIqmH}_37Ef3$o=^<|_84&uWaKd%pJ>8SfKnu$N}Us`VD+>( z;<(lIG1?!TB`A(u|RD`DIn#;!f!W3BHk(T+JhWg_B5Xm0%Mg?-m+dID!0jC>EELQWP6X=rDQr~g}p$oMxT_&K%Q#mikA(_%g&51kqA`* zQPE&Y1uf8!W7P~0#oo{0vHHOXIIZd|6|De+qkGOt5g766ojm*`yiz^MJE zxj(e5l@H-6xJ9YEa($3l`9G#^Z)8Bdp&Zo#%TXOj)4XP_|7L*~ZT&_*g7NzDeF?L@ zVS-tMT~fvy#yf9`Ok*!I99!mf#tK`?9%TGOnQs-!}(R@O_JY%3_~1_oL>1 z%G?tkK96dQ;8amZ6*PhrkIOI@Mde|dxO~b|zTh52C7kj?-o_tGW5t~$n3gbtdQ*0( zVfqs`V&w)R^Nb0!8K5LR229p(jK8#|GvDNgT*e+rG=nQS5|44$DsTJeQH6}77`H0h z)Et#{IIYk;haE=7tZz14@{^2a1t4okFzdhB{46A3uJDI?{& zGwwd|Uu8v#(W-{C{IS)&B;>0nojNDw8Qo=`$~NFou4tFOB-s=tX3j(gsFPi2)i*7)oGt}IF3 zeU9J~eU?Fe;P15(galhNR@OUztk)RF zT(7X8gi3D4u)#uMS!qt{F%C`?s+7$J#Rf8t`D-v`naZHCDKi6U!z@o(it@*#pa?Ni z`C~e9!=3aH5D*nS9%U}|BndPG44|Xuc!qRKNSFGOgkD}*Fr?#IXo5dcaQ`5@DQWx` zUS4HX66o@tLM~IyHHoPVw&s=0V>&Uq%d6CdOI*-sVVeA6#{QvZ6|@g9ed?U5*iiEN z12HRo&-GO^My^YW^=4P%$~tdfA+r`t3D6+HOIiq3P=MY7Mf=gqEryp(WGWvi9X>Tj zxo)ht&S;YaJz+uXHImE5iKxis7NNG9hrvd?;uF_ZFsAglRc7#%rgVVj5_h|WD#Mho zYkaJ1Vth2Ijtnl@F?;ZE=gj%fKX7Ou##zkB|-xr2?VKi)wivKyl5TdMF_N*)M*X8W*3`KY_27X|Hcx= z9s8{HhO9?=fQCO~u%tI9p%{7?HD0tz4dGC}akYK1`eS3O-9BRMHZ7+5-wf_O8X@T; zV=v1)_A;BtsJNT4wzcBQ;Py!d%SJrrYi!wVQe9rkq-u>vzw0XuSdW^foZO}KFB+z@ zZ%W=zX?8y~Jft(&eaJLx;kbILDD#5SH$p`4HW1pjLv@qX=E}afy2*tr?_#7;Oqg3w zhFLD}%gvX5@{*OZJX+pWtoBRDGotxg?cZKRGCm6Tv`(0 zGKiURWrCz}y#VB~Sl92pbp@M*5Mx0h$X zx?nfY{(*j1#~2!ITJdd+l6}@cs}#M;x>={K zDT6gL#|(ohLU(SC9KA?WrNf!T&6yv~wKQ|)^hC5>G8?I)6U^x^z#sIrR6LEn?7FK7 zwXv5kaiybKDA4&bWA8R~^Xf`uS9cUGn#05`w`h)LK8xlonlpdCbX&0~)U=tl#2%#U zEml_{>9M6>+AA;b`OzG`2IkIP041ucAb=8+3QsPNOtC!JhcOU#N4%`1q{Q=5ma=AiEgS$Wt~=}#@_JaC4GrnyIf=lR-)z6!qC2&n7j|N z-rDBNkrys`UoV9LI5(c7kI!Zqbna494+A zwz1TIs$})kxE00Hp_9IToB>K1n|GYf-+QtO*{#QXx(8q-QgnZo3>RFTlkzj?8vrBcF|D7z$UQ<=anY& zRBM_3-Dtau@Zp>_g-^Ju-a5xEXxOVXEKl7%b!!85k@ZX9>20~|n=Gll;@Yiwd@Nt( z^VTR&4WM2qF%D*V1v-0hv%AbDJxLT^qY*Y}#81*QrDRl3F3C1bn4Q6s@k%+Rx&WPKJiQ50@oT7 z)rVPx^g18)*KrH4k*M1OYCbcpz2MPxfAx9Xh5)2oF~+SAvlb-=K0Y9Y7oHY;a53tb zN3#LRYyzFvk4vp#uU#rts~X%u(%DJUkkaC+>C|MbPKar0OJEu^%d;+MfqgbZa*ttP zDZg2Eml>jZDnsvQ8r`+(PVLF4o-!F8UeCDi zCB!SRPbF&AGcM?>uhYSeYZYbmQUMAQq?eK)Q#SBII@9BGtgE1-zix9GF}6Gm*I+9+ zwq&4pW-#!1uw;xPC`l=KLBiZ6OeoXIriL>}3cD;Xb!Wm8>6J!b7R|F2vOq4fBt$m* zFH_3e+AB&uQ$fU|yYeZR%S&_HCP`BmK{SQ0=b0uWvQEQB`j=bki->76TO0RB`2;cJ z4e%mQK<(l_&DLw*$Q3kLDgm;%`tf2LLfspJFO}|{F}LjOBtEIvsf!|UHmpYp$>?clnL?pr=fU*la_p){WgS%%V5|H~Cfi;jv(`ET z5k$i&ZSb0t=GBybuNer})T{1MB7kd2fF}|_-L!zFWbYg*ojY>Uu@ps7(yf4}RGS!t?3xf!oIvbW8w7G2{bxCO++qzpr`*Ig+ zB$X&g!Q;%C4K*ISC!o)Evwq+LAt2F+G4Qq@p|%ahr;q)F1twPP)h;C7D@qF)Z^>xG zUhPKq{Ij#44I_+#9*S;9i)l8*UUJNeEc@C* zY#L#^xv~YdreAH3PyH#;CA7yx9gYl1XoV$?uEnUUT~Z7xnxxF_Hzz*#fvcqPQ+5t3S3k%75O{ERXVq z#F0%0$yABHfw?5pdwI0TlHo|wVMb9AHl-x!SXbe)!LB(W$dVD3BrXgx&u z9qUEQYbl4<0BtGd^%Y#j(nTf&w42C73ffP^KZTG$Tb<+;R3%tohQ&stx-onBB=mXb zluQ%XSHO-c{0x^_W7XMy#Lv|3+D^k&n|_QF?q-9WbJtpJl@l*wd{iLx79pSuGxNU;9-Tb5X2C)J$_xL`jWRR`OBY z;?i8&iWKxGCJdDiasx;%Ha#utPJW?qe3Bc}`z*gFv>*Tev)biRc#+>Xd}WO@|XtO!P4hlpm)W zLA}!Cx%_yezzOtab@QKeVGDpr42eab7TEErUT7IXAr zwoVy(AriB3VyOtQTZklBmIbszCfV)XtVL0hI)?SIY0B>O85?5msM@IdC?(r)VX`0D zjk0IXf&4(8hE!YjE$owiW5Jd&#~?|`m4kv}b7*&J8l+w&4zCaU;Foa9)lQAmagDhY zvq*IcbHYiLFxzd!6%kQ9BKzn5OY5|DrkNN8fe?951r~LJdzn)bG zsJjw6YQie6y~>dn#fI?OtLh(htbYRkDn08pVTLnrf+Vh8p9_PH@-~JcdRQ>mNGBu8 z03G+DSI9by`O$`PF%>OHCs4deiu0;td96bpnP@P2g}cr-G3FIuN7)G_FE#Z(fti`n3?XR}e6M0s*1SjC>U>#FU%>6sb~N zea~9By6WO!Dz2~dDsWOrS`nx8y(!XQX?CAfxJFW9UqOvL<-TGCu`9Ex=e{brtBhrHF>luihNMU>Avq}6?o8~;v zDId_|oS{FBx>bcXsLLGf`4uJVW-2XHi|28|Rd&KPoA+`hvPltDcM^y$nbf{P^VI}{ zYzeO+>1=djMq7uE$tU^j8Z#ZX{FY%>e-m|1P&7y76jxl^2v^{^G-4s9&{v#zPk*`j z%jABSzxVr`?Y(n~^TpTngW9X|FadH;p5fAW4|9OaX=f^6TrXM4qb!NO3bO|!>1>S+ z{y4Rhn(nqeUtn$6(!luf=vEa|U&&ZpU(ZRfD@w>d#%Ih+qJiR=1wF!(6TY>R1uRroY&3v%iuEjelgrIAp%VcG-C61=2iTG+qSxT!CUDhM)#J&4u8D}#)VAlls-86!1hSlxGSU>vEl<~%j|^kHg_#+b8tmH?EqQQd~) zv!(8{MPmb|RU--%6Gc0#Ns>^4u0Lw(ZUKUmc_3NU@{Z7WdSqb@(@SN3$R_j+2f(T3 z@~HLALRvR#0Ci2(fuK2@y<$xdn}e7=!S^z1n8AWACYmedk+m?sHQnyUp^5r#v$4B? zb4I*OV?rYF>IWbU!CtWfBF7L_uWE?1WyoW(^166*M-m&?50J^lzp{%pNidM%{82iQ z24k}oWRsJ(sfT<7Si&3+1_HX+M~3J++tE*dtUjSBRUJQl#UuzVgP2y|996GGO{Q0} z2&@&EU-82XJrBz+|MA!#M8f{gajHhB(Nv=ZM^Vz8nsoN}7wda9c$fowiIJ;qUK0uB zcb1{Sqk~gj7J)G1V+M%p!@d+Gb<0lsaA?MiM0ugb>0m@APEHFmf0oPEKI%+3kvk)% zQdEbv>MC8IvDMr*K|)?M)>-l{R*$2x*{n-l2;hcSoeiw4jCxLq@Y-4(+oxPkBXbrx zndR3Xu_7O}ITV_u&7alaClfUp#h8IJ9j5VTJV#RxDtPLVqM9ZvSL89dH#tHhVk<39 z9_1J`ZmSf^rI2RIV7S*jZFMI|x^|#dS3sC9eA<;{>hZQRlL^IK6C6;hvw-VPHKD@l zvT-JJGRS347E;~CKprBMHG;$5rMjL@fSm|M!$b)D0j3O2WFyyU2gwN5mQXV`<`Dhb zmBti@quUARvker(UA8MwM~~y_=0{l0%#b;^GK`9?tBL*lE$a}qJu(lJ-$KixB&~0$ zT-1`pXRNG+vczo8kyQ^Gw=3_EVjgW*RUQ93~MosNm0~693t=>#xMN|x! zroBsyu;WW6(7q^wB3t(?&XaFUeArl&v>T z;}f(flB$;mL0^u1Gr{_{^S;cTu$~n>iuDY%%I~8aZeKNwL!8g5sj_7 z=~$zDYWxFeebfeFYf?=P9R;VnGO$KYH4Ib-`%!i?;rXMnp;E=F7E^+KG zq>g!PTBA~hH=g=1rB^DS;Cv=tSQa89<#{!BEt#T78i|h4O%Rfvg5Wq3mHRca73>K781`+laXh#LjA~Gq!91J2}t)p5VRFhp! zYyzU9iH}Z(&XYBr@{PO8?@+9lwNXYm*prY7RyAAc$=O)p0cN8Bz>mFg>Vz7;PZ_>u ziy#*oH-^>3Xic}HuR{(Q$p&nuqk9DM3s}aL)>i)^uZHK#cnp>5#~AI9K6Ws9akR+# z(|5dY6c$G|8BF42WOKkofGj|@Ksow^6oo}P0Y3VK!DKFonLd&Y(1ddGG6?V4Q)gBZo1rk(TwNva_BP9uq+)``)}VzN6;OOFSR_y;Wskbz z6YRp`RemndOK-6;3s!0iUQUxlC;2s^L=uW{lbC3mb2EuNOshsou1li%8r@h#gwXK` z79loD(|^b?GbwMom9w@{E*KGqWP>Dk$F|ZZbO}lM9TOGhcjVzd3b2f8KW@1GDYz;( zHC(LKCFy<=T$PQuB#Z(a$uR?y$h4XO1^FgW!7X4RjlhL)0mKdQ;;|ib{G|=5_^3M^ zf+H`L3oY!owtjeHk$wZAG$%@4n9U@hw2O$reYDG3r1m4RV(mv#+gQ(JDVrkhp*S^E zJgVKQG$jf)P$Zs>EA&#fv3(S+*3PkWh>4OUoFxF3qV$p|us3TtoQL25f5Kqg^MY_x z6fRc<#$L|Td_X-NAh=LP%6=y)fSriqAE9fU& z=UJ}f^?%>B_C7;ZbteJ*@BjRdfv!4r&faUUz4n^-I_DT`00m76IarmNq;z+^RI(Ji zUJ8-Hei2$=(~RHXm=k6JGj|pXcA;EwUmQMXL45f&YnnrUY8F`DIY>rl3rqggLt4?Uc9m~*gyJc~o192k54Fh6zt52~O}X!?Gb2_GUr7vt{z z&G+;dQFM0Q2Vt+vB4KWIDp@SX&bm~cLNVh^9m{}g-MGLn>~!%qkZwHgL(VVJ^GnS6 zCH8!ep6@Z|dr&>?9Lm+F#Ngj_=LPype*zfiM0vkHfdlk*XU*7s6wU+doi9LX&U8GI z0$l*`04|B%hd&+9QFYLpv7c<_*1t@6?1Yq?XP?~Z5nYe2}$49FfuS8H`wCHp!KZ}St9Ai%)K4a$( zs2c*ZNY;U|eW-G0y5xm(r~OG#))O;BL2 zUx_7>1MDu=Va4%4B3(BeyV&xt^N-{tPl{IA=|Rjy*~k&xQW2g_#GFOg$mJb!!p!{+ zIT++S@~G>fgfS!Thg0sZA3sJsaX#Az8Xn58$o(xaJ?i(+dfQ>nL5Bc4YzN(af*7=! zKzioP>0rW{(~ogpz>9|*f~(VxG@pp&rr}9QJjF)*IAkU;hGxYnU^9K%5&O?%#CLrW z&l&-a&Vd{k4 zlM!DzG~%nr3RvPFX)QH2 z9^)AndaSL4KX!q0zfB&)s-r&q0FfrN1%FV#iFV$(0ZnQDz)B~=oqXjZvt~&=6n&5t zFHSi+kV_9t^*b)SrCzhKHC z)BD5y0ue-=h}PzlQxGQ8#-fn!up(g0x(4E_YP9}Bw8iTuGhF>A)F;5>7`jz`q( zx&ep|I~Pdqg^54h@`b^n6?yX}<#z$XBK`zuiD9w#!B*CJH>F9mSf(mZAFd_-pk#o} zt%~&ZcP=)k<=B*|>FyQ+0zpS`FwOKhINhba<#bnY+T3R-rxX58#?Hm4Dx416iiN`B z$xrFS$AImG*T5@!?4REC)!;M|+Csj_W4(@+Ua<9{XL`xrsdg^KO$H}ai7i0g9TtRB!aDPthYXbP#Xo_Ei%3N< z-HP=9j4oK2YcxJY8`GN2C0OFkhX1Y)IMG8Oq`@C@0{cnuw{uizL#Em}s{6ICb;%$z zUiDV<#i#%z2J2kg%TqxA8lTO+NH(*-_-FR`MEkX zQMRt=}YuG&2 zSzKMi|2{`tz3o_816?m$n8M}2Xc&S8ItO7CR30Ayn1@S8$vkLL#I?u*qusT4;C}=V zSa+?~u-}67HQ3L5h?xY~$7_<@PQUgs>2}S+8P_Z%AA=cwj{k`^Hu8j2e{6V!$#o8C zeVsF%ljoz_bdG1z5t90Fa z1o!Ktg4x8|K4Gt3&5MW@fg6KHBtj3SkU+3hPK2aVvSL!>a?B+Y;k}BFDoZY|94()wyWox^o60)~v6U`25@Ma|M?lK)#mT@W-C5^q z?c6OCzJ4XY;Qg`e)wF@i#3rF_PmY9-em#oT^Z-5J0`bmPW_WNQxWoUNu{$Zg=nXJt zlGUKjM4t^X&=`f59Fh@OP4VrJsDO7XB;}!f1RDw`2zP!}AmYmRbb& z1z^qi#Xk{q+$k`rDyE2Ij~-3|IQghR)obyl2 zxauL4{F-(j^H1X(m-q$^a&O4YW$KdVA}0ABxI;{i(^wh0GJ$sBEL$LF&!W%%^PK(g zH~qkQ@Qw(*gK>J`RyXaCq+l^T4CQ?|%;t?+6aBB`iF~ z!5`-)1xsUaq?wB{Db)W_JP~;?lVI|Ye16Qwr{*7x2XNmS9Nx+HJ1@g0!yb;W#C?6x zBR#$+$A8d%`jDQW`QyBZr}G#{Gp>5% zz-d@rU6{Y(A|CA`!?4szhG9+x#ZLlsfsf42Rk)oMj{9;)yH@Ok0apeRZ0cSRalSOK&H;SiHNV3Bajxt zVW8j9jvQf5NAIuazULn83b3CG;5h-(NJ32`sd#(vG>3nOvdLAi;nLx5O5$;md~!Ot z*OSLrciRDQ$EV-`^2v(g22W|wBVEpiikKz8`{nl)@;S~=Y*F*GSI*plPu}Y&~ z8ax)9{dZ9)W|?(!mymIz2;uLXVTb^Op=@yNpiGEtfcquT2pMH?Day@Bq66eJ!M?a_ z0iU>Qf#-$rSAT?OkQC*aK{5(be(v<}3BOa$Y!hTTX*{l;=R&U5D}`!Qy9#i&c>z23_=Km+&)pmo#eatjsc7E62xBYP7t80F zN6T24vhY7H((5F)58;y)S2z|XL8+CTxrk>_=Rvr_dnk|axkoTY1p~X@#D-Vz=I5>_ zr4xzA%}Wj`8i*(%4;5Q)RfgB*>AqlRzn;oTt1euFP#bRXFePAEQa$V_vcX?Q0U-aqE@q4D^) z^HSH@nO|MVRm#=!a4o*9UMS|{8%hPd;HX*)y=-eqB9Y1@_%G8XU)}mEk?2UIKqHC6yT>*39mclWfSdQ&dYdRsbnsZZTE&TanH|EAUG4dfR4SLvcC@E3+;BGEkrRug))Ap63KSQ zNxM$`fp-NB!!Y8po?8fvVEpe)_pogE%dc6r0eY$}&(PiC^I&U7}D%6BI+ zDaLB4Btocm#AvDfaJM&<&1XBHsL~#qb!8GAImCSJLtUUzdn!BBl}C_?NGzL5w|j^u zvpGb60EP`Lad zox^D_mq;RlZSTnB+Pm`IhzXNv08DnKa$R03olPc&6RC7JP|tOD3?cYTcMPNRP$I?E z%4WRI49JmfAI_vxT?iMGT|?>iba%Ern?T&#<+UT098RX&hr4sYc{n{Zlmc=fCjJs# zneO&PW_YMG=VjBNZ+9x6>&klxFAqbC>4V;R4>5ClM?RfMW%KRrh^f7<#4vv45$Wdg zUe@bwM~vE)$5c~zZ}w38aJnN0)X;SZQT1?FS66!)mpd~#tR4w9+=+Q+GZ}=)>0Bpf z+nr1fC$M(e>~K2Yp2;Kb9RhLlUM}6)K9t_+U^ZPHAgbpjyE=xu5{Tsy6L(`a$s~gI zY!0zA86er&l}KmP$xJ#sG?YwrgY~)VThE6DJ2m|gW2<)Kt2VA zOyq|$nQW#zm+9)rdC7Dp4F*9fpd*_f>KMYsbh^DeG3*U@feN`yIyaQN4Vae zPI$w^`7T8E>3nwv%bQ3HXWF~6!{}$)$+>$>}j-k4Xaow^wD)kbKMb=eAjR+r{CZcJtz=RDV0zYkzALM@AcxpL~_ zv%K2!Q6z}~Zav@gUM+0#iW7vJh908kS<`oJ-+IUCah=7DL-cLQ7VDxOEuI2!Re7Y4 zgDz6k1;=)%#`UhVdI|`GRA#`YTpBKn)K%-Q_p*6n$yv*FLsgl0hvS^@Is?xVBqk07 z$Gu8zqSqTPAd1CmDnWs3D}sh*I~A?~JWwApEyDOFf$)&)T>R`24&Y9PdZ**8cAb@b z9%8*WQUI4tOi5u7V!(CQ>^rn6h?{bpi(TjZX9aW5^M@=z6jP1R`%8GiJIrHzL#
    ^~{2AGQ8f~w`{{%j+} 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 S8m+V9wzkrxQm&>OpQz}wy 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 diff --git a/fcs/dependencies/README.md b/fcs/dependencies/README.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fcs/paket.dependencies b/fcs/paket.dependencies index bfd298568f6..39535eedd9d 100644 --- a/fcs/paket.dependencies +++ b/fcs/paket.dependencies @@ -1,7 +1,12 @@ -framework: net45 +framework: net45, net46 source https://www.nuget.org/api/v2/ nuget FAKE nuget FSharp.Formatting +nuget Microsoft.Build.Utilities.Core 14.3.0 +nuget Microsoft.Build.Framework 14.3.0 +nuget Microsoft.Build.Engine 14.3.0 +nuget Microsoft.Build 14.3.0 +nuget System.Threading.Tasks.Dataflow 4.5.24.0 \ No newline at end of file diff --git a/fcs/paket.lock b/fcs/paket.lock index 2e454bee770..947bfc412b7 100644 --- a/fcs/paket.lock +++ b/fcs/paket.lock @@ -1,4 +1,4 @@ -RESTRICTION: == net45 +RESTRICTION: || (== net45) (== net46) NUGET remote: https://www.nuget.org/api/v2 FAKE (4.63.2) @@ -8,3 +8,17 @@ NUGET FSharpVSPowerTools.Core (>= 2.3 < 2.4) FSharpVSPowerTools.Core (2.3) FSharp.Compiler.Service (>= 2.0.0.3) + Microsoft.Build (14.3) + Microsoft.Build.Framework (14.3) + Microsoft.Build.Engine (14.3) + Microsoft.Build.Framework (14.3) + Microsoft.Build.Framework (14.3) + System.Collections (>= 4.0.11) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + System.Runtime (>= 4.1) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + System.Runtime.InteropServices (>= 4.1) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + Microsoft.Build.Utilities.Core (14.3) + Microsoft.Build.Framework (14.3) + System.Collections (4.3) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + System.Runtime (4.3) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + System.Runtime.InteropServices (4.3) - restriction: || (&& (== net45) (>= netstandard1.3)) (== net46) + System.Threading.Tasks.Dataflow (4.5.24) diff --git a/netci.groovy b/netci.groovy index 185ea17a197..ddf51e05e7d 100644 --- a/netci.groovy +++ b/netci.groovy @@ -105,7 +105,7 @@ ${buildPath}build.cmd ${buildFlavor} ${build_args}""") Utilities.addArchival(newJob, "tests/TestResults/*.*", "", skipIfNoTestFiles, false) if (configuration == "Release_fcs") { - Utilities.addArchival(newJob, "Release/fcs/**") + Utilities.addArchival(newJob, "Release/**") } else { Utilities.addArchival(newJob, "${buildFlavor}/**") diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 4fddf734b6a..39ecd5124b4 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -20,6 +20,10 @@ open FSharp.Compiler.Service.Tests.Common #if !NO_PROJECTCRACKER +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 = @@ -90,7 +94,7 @@ let ``Project file parsing example 1 Default configuration relative path`` () = [] let ``Project file parsing VS2013_FSharp_Portable_Library_net45``() = - if not runningOnMono then // 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 + 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, []) @@ -106,7 +110,7 @@ let ``Project file parsing VS2013_FSharp_Portable_Library_net45``() = [] let ``Project file parsing Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78``() = - if not runningOnMono then // 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 + 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/") @@ -141,7 +145,8 @@ let ``Project file parsing -- bad project file``() = ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore failwith "Expected exception" with e -> - Assert.That(e.Message, Contains.Substring "The project file could not be loaded.") + 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``() = @@ -149,7 +154,7 @@ let ``Project file parsing -- non-existent project file``() = try ProjectCracker.GetProjectOptionsFromProjectFileLogged(f, enableLogging=true) |> ignore with e -> - Assert.That(e.Message, Contains.Substring "Could not find file") + Assert.That(e.Message, Contains.Substring "DoesNotExist.fsproj") [] let ``Project file parsing -- output file``() = @@ -175,9 +180,20 @@ let ``Project file parsing -- 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.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") + let p,_ = ProjectCracker.GetProjectOptionsFromProjectFileLogged(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj", enableLogging=true) let references = getReferencedFilenames p.OtherOptions checkOption references "FSharp.Core.dll" @@ -190,6 +206,7 @@ let ``Project file parsing -- 2nd level references``() = 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") @@ -207,20 +224,23 @@ let ``Project file parsing -- reference project output file``() = [] 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, Is.StringContaining("ResolveAssemblyReference")) if runningOnMono then - Assert.That(log, Is.StringContaining("Reference System.Core resolved")) - Assert.That(log, Is.StringContaining("Using task ResolveAssemblyReference from Microsoft.Build.Tasks.ResolveAssemblyReference")) - else - Assert.That(log, Is.StringContaining("""Using "ResolveAssemblyReference" task from assembly "Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".""")) + Assert.That(log, Is.StringContaining("System.Core")) + Assert.That(log, Is.StringContaining("Microsoft.Build.Tasks.ResolveAssemblyReference")) + else + Assert.That(log, Is.StringContaining("Microsoft.Build.Tasks.Core")) [] let ``Project file parsing -- FSharpProjectOptions.SourceFiles contains both fs and fsi files``() = @@ -237,6 +257,7 @@ let ``Project file parsing -- FSharpProjectOptions.SourceFiles contains both fs [] 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 @@ -253,6 +274,7 @@ let ``Project file parsing -- project references``() = [] 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) @@ -265,8 +287,7 @@ let ``Project file parsing -- multi language project``() = [] let ``Project file parsing -- PCL profile7 project``() = - if not runningOnMono then // 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 - + 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") @@ -315,8 +336,7 @@ let ``Project file parsing -- PCL profile7 project``() = [] let ``Project file parsing -- PCL profile78 project``() = - if not runningOnMono then // 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 - + 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") @@ -356,7 +376,7 @@ let ``Project file parsing -- PCL profile78 project``() = [] let ``Project file parsing -- PCL profile259 project``() = - if not runningOnMono then // 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 + 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) @@ -468,9 +488,11 @@ let ``Test OtherOptions order for GetProjectOptionsFromScript`` () = projOpts.OtherOptions |> Array.map (fun s -> if s.StartsWith "--" then s else Path.GetFileNameWithoutExtension s) - |> Array.sort - |> shouldEqual (Array.sort expected2) - let otherArgs = [|"--noframework"; "--warn:3"; "System.Numerics"; "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"|] + |> Array.forall (fun s -> Set.contains s expected2) + |> shouldEqual true + + let otherArgs = [|"--noframework"; "--warn:3"; "System.Numerics"; "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 diff --git a/tests/service/data/Test3.fsproj b/tests/service/data/Test3.fsproj new file mode 100644 index 00000000000..31c2d33c565 --- /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.4.1.20\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file From 3a4bd07df1fbec4b2bae665a3566d47cb679010d Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 26 Oct 2017 20:12:46 -0700 Subject: [PATCH 057/150] Dev15.6 (#3832) * Merge dev15.5 to dev15.6 (#3825) * don't update project info if the source file collection is empty (#3792) * install templates VSIX to a unique directory (#3804) * P2p references (#3777) * P2p references * Fix test * test fix * go faster stripes * new project works better * Re-add debug assert for sourcefiles * Parameterise rc location (#3744) * Fix issues * Merge master to dev15.6 (#3826) * Put nupkgs into artifacts (#3806) * Make FCS build work on Jenkins (#3788) --- .../Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index addf142025c..6fa0bbfbc68 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -35,7 +35,7 @@ true true CommonExtensions - Microsoft\FSharp + Microsoft\FSharpTemplates None Debug AnyCPU From 51fe0908074fc5357442a320d061b09a627f4056 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 27 Oct 2017 09:29:26 -0700 Subject: [PATCH 058/150] Work around corecompile.cache bugs (#3833) --- .../FSharp.Build/Microsoft.FSharp.Targets | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets index 919c159d4b5..4274f54af2a 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets @@ -328,6 +328,48 @@ this file. ============================================================ --> + + + + + + + + + + + + + + + + + + + + From cadfd2c3a30c866c0ce5000d50db6e73fcdd0686 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 27 Oct 2017 09:29:45 -0700 Subject: [PATCH 059/150] Add icon for test libraries (#3838) --- .../Resources/FSharpTestLibrary.ico | Bin 0 -> 55748 bytes .../FSharp.ProjectSystem.FSharp/VSPackage.resx | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico b/vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico new file mode 100644 index 0000000000000000000000000000000000000000..671271e7595d5a5b30325db0bdaad7d5469e58dd GIT binary patch literal 55748 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 literal 0 HcmV?d00001 diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx b/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx index 5bb05a0bfe1..70b9cdf465b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx @@ -278,6 +278,9 @@ Resources\FSharpResources.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Resources\FSharpTestLibrary.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\ProjectNode.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From 8f3c59c95f9d4c9bf34fc3a10fc077e1dcbfae31 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 27 Oct 2017 09:29:26 -0700 Subject: [PATCH 060/150] Work around corecompile.cache bugs (#3833) --- .../FSharp.Build/Microsoft.FSharp.Targets | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets index 919c159d4b5..4274f54af2a 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets @@ -328,6 +328,48 @@ this file. ============================================================ --> + + + + + + + + + + + + + + + + + + + + From 0bb0a00f362705bbb219880e964753c75a26158b Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 27 Oct 2017 13:54:52 -0700 Subject: [PATCH 061/150] Update build status for new branch names --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b1cd4283bcd..617c8a4bece 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ For historical reasons this repository is called "visualfsharp" and currently al | | Ubuntu (Build) | Windows (Debug Build) | Windows (Release Tests 1) | Windows (Release Tests 2) | Windows (Release Tests 3) | |:----------:|:----------------:|:----------------:|:------------------:|:-----------------------:|:---------------------:| |**master** |[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/master/release_ubuntu14.04)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/master/job/release_ubuntu14.04/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/master/debug_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/master/job/debug_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/master/release_ci_part1_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/master/job/release_ci_part1_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/master/release_ci_part2_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/master/job/release_ci_part2_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/master/release_ci_part3_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/master/job/release_ci_part3_windows_nt/)| -|**vs2017-rtm** |[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/vs2017-rtm/release_ubuntu14.04)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/vs2017-rtm/job/release_ubuntu14.04/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/vs2017-rtm/debug_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/vs2017-rtm/job/debug_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/vs2017-rtm/release_ci_part1_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/vs2017-rtm/job/release_ci_part1_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/vs2017-rtm/release_ci_part2_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/vs2017-rtm/job/release_ci_part2_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/vs2017-rtm/release_ci_part3_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/vs2017-rtm/job/release_ci_part3_windows_nt/)| +|**dev15.5** |[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.5/release_ubuntu14.04)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.5/job/release_ubuntu14.04/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.5/debug_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.5/job/debug_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.5/release_ci_part1_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.5/job/release_ci_part1_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.5/release_ci_part2_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.5/job/release_ci_part2_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.5/release_ci_part3_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.5/job/release_ci_part3_windows_nt/)| +|**dev15.6** |[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.6/release_ubuntu14.04)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.6/job/release_ubuntu14.04/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.6/debug_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.6/job/debug_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.6/release_ci_part1_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.6/job/release_ci_part1_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.6/release_ci_part2_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.6/job/release_ci_part2_windows_nt/)|[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Microsoft_visualfsharp/dev15.6/release_ci_part3_windows_nt)](https://ci2.dot.net/job/Microsoft_visualfsharp/job/dev15.6/job/release_ci_part3_windows_nt/)| ## Help improve the Quality of the Tools by Using the Nightly Releases of Visual F# Tools From 0a17cb0dde3301fef62f2a3cc056608233d8e31f Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Fri, 27 Oct 2017 13:10:09 -0700 Subject: [PATCH 062/150] Ensure that Item templates are always installed with F# --- .../Source.extension.vsixmanifest | 8 +++ .../VisualFSharpFull/VisualFSharpFull.csproj | 56 +++++++++++++++++++ .../Source.extension.vsixmanifest | 9 +-- .../VisualFSharpTemplates.csproj | 56 ------------------- 4 files changed, 65 insertions(+), 64 deletions(-) diff --git a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest index a2cf49d9d2a..bbc80709606 100644 --- a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest @@ -47,6 +47,14 @@ + + + + + + + + diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 336b5012854..18ad7026378 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -207,6 +207,62 @@ DebugSymbolsProjectOutputGroup%3b True + + {6ba13aa4-c25f-480f-856b-8e8000299a72} + AppConfig + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {12ac2813-e895-4aaa-ae6c-94e21da09f64} + CodeFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {0385564F-07B4-4264-AB8A-17C393E9140C} + ResourceFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {a333b85a-dc23-49b6-9797-b89a7951e92d} + ScriptFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {e3fdd4ac-46b6-4b9f-b672-317d1202cc50} + SignatureFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {d11fc318-8f5d-4c8c-9287-ab40a016d13c} + TextFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + + + {1fb1dd07-06aa-45b4-b5ac-20ff5bee98b6} + XMLFile + ItemTemplates + TemplateProjectOutputGroup%3b + false + True + diff --git a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest index cdf29194040..49e8d0805d7 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest @@ -5,7 +5,7 @@ Visual F# Templates - Deploy Visual F# Tools Templates to Visual Studio + Deploy Visual F# Tools Desktop Project Templates to Visual Studio Microsoft.FSharp.VSIX.Templates https://docs.microsoft.com/en-us/dotnet/articles/fsharp/ @@ -23,13 +23,6 @@ - - - - - - - diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index 6fa0bbfbc68..a40934de4a6 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -92,62 +92,6 @@ - - {6ba13aa4-c25f-480f-856b-8e8000299a72} - AppConfig - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {12ac2813-e895-4aaa-ae6c-94e21da09f64} - CodeFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {0385564F-07B4-4264-AB8A-17C393E9140C} - ResourceFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {a333b85a-dc23-49b6-9797-b89a7951e92d} - ScriptFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {e3fdd4ac-46b6-4b9f-b672-317d1202cc50} - SignatureFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {d11fc318-8f5d-4c8c-9287-ab40a016d13c} - TextFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - - - {1fb1dd07-06aa-45b4-b5ac-20ff5bee98b6} - XMLFile - ItemTemplates - TemplateProjectOutputGroup%3b - false - True - {604f0daa-2d33-48dd-b162-edf0b672803d} ConsoleProject From 542917bed5847b6df68e22c8568920b89720f151 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 27 Oct 2017 16:59:54 -0700 Subject: [PATCH 063/150] Update the name of the preview VSIX branch. --- setup/publish-assets.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/publish-assets.ps1 b/setup/publish-assets.ps1 index 74808732cc3..40e0d166ce2 100644 --- a/setup/publish-assets.ps1 +++ b/setup/publish-assets.ps1 @@ -30,7 +30,7 @@ try { "microbuild" { $requestUrl = "https://dotnet.myget.org/F/fsharp/vsix/upload" } - "microbuild-dev15-rtm" { + "microbuild-dev15.5" { $requestUrl = "https://dotnet.myget.org/F/fsharp-preview/vsix/upload" } default { From 726f56f452e2232ac8563bc9feb2567e822d68a6 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 27 Oct 2017 09:29:45 -0700 Subject: [PATCH 064/150] Add icon for test libraries (#3838) --- .../Resources/FSharpTestLibrary.ico | Bin 0 -> 55748 bytes .../FSharp.ProjectSystem.FSharp/VSPackage.resx | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico b/vsintegration/src/FSharp.ProjectSystem.FSharp/Resources/FSharpTestLibrary.ico new file mode 100644 index 0000000000000000000000000000000000000000..671271e7595d5a5b30325db0bdaad7d5469e58dd GIT binary patch literal 55748 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 literal 0 HcmV?d00001 diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx b/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx index 5bb05a0bfe1..70b9cdf465b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/VSPackage.resx @@ -278,6 +278,9 @@ Resources\FSharpResources.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Resources\FSharpTestLibrary.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\ProjectNode.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From 59103f7680a9142fb0daeec2d9599cccd875d1e1 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 28 Oct 2017 11:07:15 +0300 Subject: [PATCH 065/150] fix a test --- tests/service/EditorTests.fs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 541ae2c5703..5f3645f27b8 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -635,18 +635,17 @@ let _ = su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) |> shouldEqual // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces - [|("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); + [|("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("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))|] + ("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`` () = From 80764759a60602365e5a02ff9cdaf21ed8d7ca5c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 28 Oct 2017 11:49:08 +0300 Subject: [PATCH 066/150] fix FCS netstandard compilation --- src/fsharp/symbols/SymbolPatterns.fs | 10 ++++++++++ src/fsharp/symbols/SymbolPatterns.fsi | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index 855b281643c..aa4be5a32f8 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -89,10 +89,16 @@ module Symbol = if e.IsEnum || e.IsValueType || hasAttribute e.Attributes then Some() else None +#if EXTENSIONTYPING let (|Class|_|) (original: FSharpEntity, abbreviated: FSharpEntity, _) = if abbreviated.IsClass && (not abbreviated.IsStaticInstantiation || original.IsFSharpAbbreviation) then Some() + else None +#else + let (|Class|_|) (original: FSharpEntity, abbreviated: FSharpEntity, _) = + if abbreviated.IsClass && original.IsFSharpAbbreviation then Some() else None +#endif let (|Record|_|) (e: FSharpEntity) = if e.IsFSharpRecord then Some() else None let (|UnionType|_|) (e: FSharpEntity) = if e.IsFSharpUnion then Some() else None @@ -108,17 +114,21 @@ module Symbol = || (e.IsFSharp && e.IsOpaque && not e.IsFSharpModule && not e.IsNamespace) then Some() else None +#if EXTENSIONTYPING let (|ProvidedType|_|) (e: FSharpEntity) = if (e.IsProvided || e.IsProvidedAndErased || e.IsProvidedAndGenerated) && e.CompiledName = e.DisplayName then Some() else None +#endif let (|ByRef|_|) (e: FSharpEntity) = if e.IsByRef then Some() else None let (|Array|_|) (e: FSharpEntity) = if e.IsArrayType then Some() else None let (|FSharpModule|_|) (entity: FSharpEntity) = if entity.IsFSharpModule then Some() else None let (|Namespace|_|) (entity: FSharpEntity) = if entity.IsNamespace then Some() else None +#if EXTENSIONTYPING let (|ProvidedAndErasedType|_|) (entity: FSharpEntity) = if entity.IsProvidedAndErased then Some() else None +#endif let (|Enum|_|) (entity: FSharpEntity) = if entity.IsEnum then Some() else None let (|Tuple|_|) (ty: FSharpType option) = diff --git a/src/fsharp/symbols/SymbolPatterns.fsi b/src/fsharp/symbols/SymbolPatterns.fsi index 54773353b21..e2c00c80ee7 100644 --- a/src/fsharp/symbols/SymbolPatterns.fsi +++ b/src/fsharp/symbols/SymbolPatterns.fsi @@ -31,12 +31,16 @@ module internal Symbol = val (|Interface|_|) : FSharpEntity -> unit option val (|AbstractClass|_|) : FSharpEntity -> unit option val (|FSharpType|_|) : FSharpEntity -> unit option +#if EXTENSIONTYPING val (|ProvidedType|_|) : FSharpEntity -> unit option +#endif val (|ByRef|_|) : FSharpEntity -> unit option val (|Array|_|) : FSharpEntity -> unit option val (|FSharpModule|_|) : FSharpEntity -> unit option val (|Namespace|_|) : FSharpEntity -> unit option +#if EXTENSIONTYPING val (|ProvidedAndErasedType|_|) : FSharpEntity -> unit option +#endif val (|Enum|_|) : FSharpEntity -> unit option val (|Tuple|_|) : FSharpType option -> unit option val (|RefCell|_|) : FSharpType -> unit option From a395c762390ec0d881b6e88fd908c9f6914230d5 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 28 Oct 2017 11:54:27 +0300 Subject: [PATCH 067/150] add NUnit3TestAdapter package to enable running tests from inside Rider --- .../FSharp.Compiler.Service.Tests.netcore.fsproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj index 058a83e551e..71f5341bb71 100644 --- a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj @@ -1,4 +1,4 @@ - + netcoreapp1.0 $(DefineConstants);DOTNETCORE;FX_ATLEAST_45;FX_ATLEAST_PORTABLE;FX_NO_RUNTIMEENVIRONMENT;FX_RESHAPED_REFLECTION;TODO_REWORK_ASSEMBLY_LOAD; @@ -42,6 +42,7 @@ + From 6a978f1702a40c69ba88965500828597ee9c2122 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 28 Oct 2017 15:28:19 +0300 Subject: [PATCH 068/150] fix test --- tests/service/EditorTests.fs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 5f3645f27b8..2e050abe327 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -633,19 +633,19 @@ let _ = |> 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)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("System", (2, 5, 2, 11)); ("System", (2, 5, 2, 11)); - ("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))|] + [|("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`` () = From 1b0fad8f0dd5dbcc187261c31f80c5db3633e957 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 29 Oct 2017 08:47:30 +0300 Subject: [PATCH 069/150] do not filter symbol uses by range length in getSymbolUsesInSolution because it causes loosing symbol occurrences in Inline Rename (#3762) Thank you for this. --- .../src/FSharp.Editor/LanguageService/SymbolHelpers.fs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs index b2ad08f76ad..34e42ff637a 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs @@ -67,16 +67,8 @@ module internal SymbolHelpers = |> Async.Parallel |> Async.map Array.concat - let declarationLength = - symbol.DeclarationLocation - |> Option.map (fun m -> m.EndColumn - m.StartColumn) - return (symbolUses - |> Seq.filter (fun su -> - match declarationLength with - | Some declLength -> su.RangeAlternate.EndColumn - su.RangeAlternate.StartColumn = declLength - | None -> true) |> Seq.collect (fun symbolUse -> solution.GetDocumentIdsWithFilePath(symbolUse.FileName) |> Seq.map (fun id -> id, symbolUse)) |> Seq.groupBy fst From 88610756b32528288f96e5d7109823933c3bbdc4 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sun, 29 Oct 2017 06:56:07 +0100 Subject: [PATCH 070/150] Improve sprintf/printf for short format strings (#3761) * Introduce FinalFast n * Introduce FinalFast n * Special exn for sprintf parser * FinalFastEnd * FinalFastEnd * DoubleStringPrintfEnv * SmallStringPrintfEnv * Remove empty else * Cleanup * Apply same pattern to chained --- src/fsharp/FSharp.Core/printf.fs | 340 +++++++++++++++++++++++++++++-- 1 file changed, 318 insertions(+), 22 deletions(-) diff --git a/src/fsharp/FSharp.Core/printf.fs b/src/fsharp/FSharp.Core/printf.fs index 63ab20f6512..f3d47e1c0ab 100644 --- a/src/fsharp/FSharp.Core/printf.fs +++ b/src/fsharp/FSharp.Core/printf.fs @@ -230,6 +230,43 @@ module internal PrintfImpl = env.Finish() ) ) + + static member FinalFastEnd1<'A> + ( + s0, conv1 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) -> + let env = env() + Utils.Write(env, s0, (conv1 a)) + env.Finish() + ) + ) + + static member FinalFastStart1<'A> + ( + conv1, s1 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) -> + let env = env() + Utils.Write(env, (conv1 a), s1) + env.Finish() + ) + ) + + static member FinalFast1<'A> + ( + conv1 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) -> + let env = env() + env.Write (conv1 a) + env.Finish() + ) + ) + static member Final2<'A, 'B> ( s0, conv1, s1, conv2, s2 @@ -242,6 +279,42 @@ module internal PrintfImpl = ) ) + static member FinalFastEnd2<'A, 'B> + ( + s0, conv1, s1, conv2 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) -> + let env = env() + Utils.Write(env, s0, (conv1 a), s1, (conv2 b)) + env.Finish() + ) + ) + + static member FinalFastStart2<'A, 'B> + ( + conv1, s1, conv2, s2 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) -> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2) + env.Finish() + ) + ) + + static member FinalFast2<'A, 'B> + ( + conv1, s1, conv2 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) -> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b)) + env.Finish() + ) + ) + static member Final3<'A, 'B, 'C> ( s0, conv1, s1, conv2, s2, conv3, s3 @@ -254,6 +327,42 @@ module internal PrintfImpl = ) ) + static member FinalFastEnd3<'A, 'B, 'C> + ( + s0, conv1, s1, conv2, s2, conv3 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) -> + let env = env() + Utils.Write(env, s0, (conv1 a), s1, (conv2 b), s2, (conv3 c)) + env.Finish() + ) + ) + + static member FinalFastStart3<'A, 'B, 'C> + ( + conv1, s1, conv2, s2, conv3, s3 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) -> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3) + env.Finish() + ) + ) + + static member FinalFast3<'A, 'B, 'C> + ( + conv1, s1, conv2, s2, conv3 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) -> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c)) + env.Finish() + ) + ) + static member Final4<'A, 'B, 'C, 'D> ( s0, conv1, s1, conv2, s2, conv3, s3, conv4, s4 @@ -265,6 +374,43 @@ module internal PrintfImpl = env.Finish() ) ) + + static member FinalFastEnd4<'A, 'B, 'C, 'D> + ( + s0, conv1, s1, conv2, s2, conv3, s3, conv4 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D)-> + let env = env() + Utils.Write(env, s0, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d)) + env.Finish() + ) + ) + + static member FinalFastStart4<'A, 'B, 'C, 'D> + ( + conv1, s1, conv2, s2, conv3, s3, conv4, s4 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D)-> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d), s4) + env.Finish() + ) + ) + + static member FinalFast4<'A, 'B, 'C, 'D> + ( + conv1, s1, conv2, s2, conv3, s3, conv4 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D)-> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d)) + env.Finish() + ) + ) + static member Final5<'A, 'B, 'C, 'D, 'E> ( s0, conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5, s5 @@ -276,6 +422,43 @@ module internal PrintfImpl = env.Finish() ) ) + + static member FinalFastEnd5<'A, 'B, 'C, 'D, 'E> + ( + s0, conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D) (e : 'E)-> + let env = env() + Utils.Write(env, s0, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d), s4, (conv5 e)) + env.Finish() + ) + ) + + static member FinalFastStart5<'A, 'B, 'C, 'D, 'E> + ( + conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5, s5 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D) (e : 'E)-> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d), s4, (conv5 e), s5) + env.Finish() + ) + ) + + static member FinalFast5<'A, 'B, 'C, 'D, 'E> + ( + conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5 + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D) (e : 'E)-> + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d), s4, (conv5 e)) + env.Finish() + ) + ) + static member Chained1<'A, 'Tail> ( s0, conv1, @@ -290,6 +473,22 @@ module internal PrintfImpl = next env : 'Tail ) ) + + static member ChainedFastStart1<'A, 'Tail> + ( + conv1, + next + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) -> + let env() = + let env = env() + env.Write(conv1 a) + env + next env : 'Tail + ) + ) + static member Chained2<'A, 'B, 'Tail> ( s0, conv1, s1, conv2, @@ -305,6 +504,21 @@ module internal PrintfImpl = ) ) + static member ChainedFastStart2<'A, 'B, 'Tail> + ( + conv1, s1, conv2, + next + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) -> + let env() = + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b)) + env + next env : 'Tail + ) + ) + static member Chained3<'A, 'B, 'C, 'Tail> ( s0, conv1, s1, conv2, s2, conv3, @@ -320,6 +534,21 @@ module internal PrintfImpl = ) ) + static member ChainedFastStart3<'A, 'B, 'C, 'Tail> + ( + conv1, s1, conv2, s2, conv3, + next + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) -> + let env() = + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c)) + env + next env : 'Tail + ) + ) + static member Chained4<'A, 'B, 'C, 'D, 'Tail> ( s0, conv1, s1, conv2, s2, conv3, s3, conv4, @@ -334,6 +563,22 @@ module internal PrintfImpl = next env : 'Tail ) ) + + static member ChainedFastStart4<'A, 'B, 'C, 'D, 'Tail> + ( + conv1, s1, conv2, s2, conv3, s3, conv4, + next + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D)-> + let env() = + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d)) + env + next env : 'Tail + ) + ) + static member Chained5<'A, 'B, 'C, 'D, 'E, 'Tail> ( s0, conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5, @@ -349,6 +594,21 @@ module internal PrintfImpl = ) ) + static member ChainedFastStart5<'A, 'B, 'C, 'D, 'E, 'Tail> + ( + conv1, s1, conv2, s2, conv3, s3, conv4, s4, conv5, + next + ) = + (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> + (fun (a : 'A) (b : 'B) (c : 'C) (d : 'D) (e : 'E)-> + let env() = + let env = env() + Utils.Write(env, (conv1 a), s1, (conv2 b), s2, (conv3 c), s3, (conv4 d), s4, (conv5 e)) + env + next env : 'Tail + ) + ) + static member TFinal(s1 : string, s2 : string) = (fun (env : unit -> PrintfEnv<'State, 'Residue, 'Result>) -> (fun (f : 'State -> 'Residue) -> @@ -995,11 +1255,11 @@ module internal PrintfImpl = type private PrintfBuilder<'S, 'Re, 'Res>() = let mutable count = 0 + let mutable optimizedArgCount = 0 #if DEBUG let verifyMethodInfoWasTaken (mi : System.Reflection.MemberInfo) = if isNull mi then ignore (System.Diagnostics.Debugger.Launch()) -#else #endif let buildSpecialChained(spec : FormatSpecifier, argTys : Type[], prefix : string, tail : obj, retTy) = @@ -1007,7 +1267,6 @@ module internal PrintfImpl = let mi = typeof>.GetMethod("LittleAChained", NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi = mi.MakeGenericMethod([| argTys.[1]; retTy |]) @@ -1017,7 +1276,6 @@ module internal PrintfImpl = let mi = typeof>.GetMethod("TChained", NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi = mi.MakeGenericMethod([| retTy |]) let args = [| box prefix; tail |] @@ -1032,7 +1290,6 @@ module internal PrintfImpl = typeof>.GetMethod(name, NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let argTypes, args = if spec.TypeChar = '%' then @@ -1050,7 +1307,6 @@ module internal PrintfImpl = let mi = typeof>.GetMethod("LittleAFinal", NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi = mi.MakeGenericMethod(argTys.[1] : Type) let args = [| box prefix; box suffix |] @@ -1059,7 +1315,6 @@ module internal PrintfImpl = let mi = typeof>.GetMethod("TFinal", NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let args = [| box prefix; box suffix |] mi.Invoke(null, args) @@ -1073,7 +1328,6 @@ module internal PrintfImpl = typeof>.GetMethod(name, NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi, args = @@ -1087,23 +1341,46 @@ module internal PrintfImpl = mi.Invoke(null, args) - let buildPlainFinal(args : obj[], argTypes : Type[]) = - let mi = typeof>.GetMethod("Final" + (let x = argTypes.Length in x.ToString()), NonPublicStatics) + let buildPlainFinal(args : obj[], argTypes : Type[]) = + let argsCount = args.Length + let methodName,args = + if argsCount > 0 && args.[0].ToString() = "" then + if argsCount > 1 && args.[argsCount - 1].ToString() = "" then + let args = Array.sub args 1 (argsCount - 2) + optimizedArgCount <- optimizedArgCount + 2 + "FinalFast", args + else + optimizedArgCount <- optimizedArgCount + 1 + "FinalFastStart", args |> Array.skip 1 + elif argsCount > 0 && args.[argsCount - 1].ToString() = "" then + let args = Array.sub args 0 (argsCount - 1) + optimizedArgCount <- optimizedArgCount + 1 + "FinalFastEnd", args + else + "Final",args + + let mi = typeof>.GetMethod(methodName + argTypes.Length.ToString(), NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi = mi.MakeGenericMethod(argTypes) mi.Invoke(null, args) - let buildPlainChained(args : obj[], argTypes : Type[]) = - let mi = typeof>.GetMethod("Chained" + (let x = (argTypes.Length - 1) in x.ToString()), NonPublicStatics) + let buildPlainChained(args : obj[], argTypes : Type[]) = + let argsCount = args.Length + let methodName,args = + if argsCount > 0 && args.[0].ToString() = "" then + optimizedArgCount <- optimizedArgCount + 1 + "ChainedFastStart", args |> Array.skip 1 + else + "Chained", args + + let mi = typeof>.GetMethod(methodName + (argTypes.Length - 1).ToString(), NonPublicStatics) #if DEBUG verifyMethodInfoWasTaken mi -#else #endif let mi = mi.MakeGenericMethod(argTypes) - mi.Invoke(null, args) + mi.Invoke(null, args) let builderStack = PrintfBuilderStack() @@ -1178,8 +1455,6 @@ module internal PrintfImpl = builderStack.PushContinuationWithType(currentCont, funcTy) ContinuationOnStack else - - let hasCont = builderStack.HasContinuationOnStack(numberOfArgs) let expectedNumberOfItemsOnStack = numberOfArgs * 2 @@ -1223,6 +1498,7 @@ module internal PrintfImpl = numberOfArgs + 1 let parseFormatString (s : string) (funcTy : System.Type) : obj = + optimizedArgCount <- 0 let prefixPos, prefix = FormatString.findNextFormatSpecifier s 0 if prefixPos = s.Length then box (fun (env : unit -> PrintfEnv<'S, 'Re, 'Res>) -> @@ -1237,9 +1513,9 @@ module internal PrintfImpl = builderStack.PopValueUnsafe() else buildPlain n prefix - + member __.Build<'T>(s : string) : PrintfFactory<'S, 'Re, 'Res, 'T> * int = - parseFormatString s typeof<'T> :?> _, (2 * count + 1) // second component is used in SprintfEnv as value for internal buffer + parseFormatString s typeof<'T> :?> _, (2 * count + 1) - optimizedArgCount // second component is used in SprintfEnv as value for internal buffer /// Type of element that is stored in cache /// Pair: factory for the printer + number of text blocks that printer will produce (used to preallocate buffers) @@ -1278,7 +1554,18 @@ module internal PrintfImpl = override __.Write(s : string) = buf.[ptr] <- s ptr <- ptr + 1 - override this.WriteT(s) = this.Write s + override __.WriteT(s) = + buf.[ptr] <- s + ptr <- ptr + 1 + + type SmallStringPrintfEnv<'Result>(k) = + inherit PrintfEnv(()) + + let mutable c = null + + override __.Finish() : 'Result = k c + override __.Write(s : string) = if isNull c then c <- s else c <- c + s + override __.WriteT(s) = if isNull c then c <- s else c <- c + s type StringBuilderPrintfEnv<'Result>(k, buf) = inherit PrintfEnv(buf) @@ -1314,12 +1601,21 @@ module Printf = [] let ksprintf continuation (format : StringFormat<'T, 'Result>) : 'T = - doPrintf format (fun n -> - StringPrintfEnv(continuation, n) :> PrintfEnv<_, _, _> + doPrintf format (fun n -> + if n <= 2 then + SmallStringPrintfEnv(continuation) :> PrintfEnv<_, _, _> + else + StringPrintfEnv(continuation, n) :> PrintfEnv<_, _, _> ) [] - let sprintf (format : StringFormat<'T>) = ksprintf id format + let sprintf (format : StringFormat<'T>) = + doPrintf format (fun n -> + if n <= 2 then + SmallStringPrintfEnv(id) :> PrintfEnv<_, _, _> + else + StringPrintfEnv(id, n) :> PrintfEnv<_, _, _> + ) [] let kprintf continuation format = ksprintf continuation format From d2cb41496512974c258d3583c77a4f08821fd888 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sun, 29 Oct 2017 06:56:58 +0100 Subject: [PATCH 071/150] Keep context information over parens and sequence expressions (#3763) * Failing tests for else in parens * ShrinkContext * Show that we still don't report error in last line * Show that longer expressions don't take context * ShrinkContext along Sequence expressions --- src/fsharp/TypeChecker.fs | 34 ++++++++++++++++++- .../Warnings/ElseBranchHasWrongType3.fs | 13 +++++++ .../Warnings/ElseBranchHasWrongType4.fs | 15 ++++++++ .../Warnings/WarnIfMissingElseBranch3.fs | 8 +++++ tests/fsharpqa/Source/Warnings/env.lst | 3 ++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType3.fs create mode 100644 tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType4.fs create mode 100644 tests/fsharpqa/Source/Warnings/WarnIfMissingElseBranch3.fs diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 95c4b119d95..5606e930140 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -699,6 +699,36 @@ let ImplicitlyOpenOwnNamespace tcSink g amap scopem enclosingNamespacePath env = // Helpers for unification //------------------------------------------------------------------------- +/// When the context is matching the oldRange then this function shrinks it to newRange. +/// This can be used to change context over no-op expressions like parens. +let ShrinkContext env oldRange newRange = + match env.eContextInfo with + | ContextInfo.NoContext + | ContextInfo.RecordFields + | ContextInfo.TupleInRecordFields + | ContextInfo.ReturnInComputationExpression + | ContextInfo.YieldInComputationExpression + | ContextInfo.RuntimeTypeTest _ + | ContextInfo.DowncastUsedInsteadOfUpcast _ -> + env + | ContextInfo.CollectionElement (b,m) -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.CollectionElement(b,newRange) } + | ContextInfo.FollowingPatternMatchClause m -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.FollowingPatternMatchClause newRange } + | ContextInfo.PatternMatchGuard m -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.PatternMatchGuard newRange } + | ContextInfo.IfExpression m -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.IfExpression newRange } + | ContextInfo.OmittedElseBranch m -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.OmittedElseBranch newRange } + | ContextInfo.ElseBranchResult m -> + if m <> oldRange then env else + { env with eContextInfo = ContextInfo.ElseBranchResult newRange } /// Optimized unification routine that avoids creating new inference /// variables unnecessarily @@ -5610,6 +5640,7 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = // We invoke CallExprHasTypeSink for every construct which is atomic in the syntax, i.e. where a '.' immediately following the // construct is a dot-lookup for the result of the construct. CallExprHasTypeSink cenv.tcSink (mWholeExprIncludingParentheses, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) + let env = ShrinkContext env mWholeExprIncludingParentheses expr2.Range TcExpr cenv overallTy env tpenv expr2 | SynExpr.DotIndexedGet _ | SynExpr.DotIndexedSet _ @@ -10077,11 +10108,11 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = | SynExpr.Sequential (sp, true, e1, e2, m) when not isCompExpr -> let e1', _ = TcStmtThatCantBeCtorBody cenv env tpenv e1 // tailcall + let env = ShrinkContext env m e2.Range TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr e2 (fun (e2', tpenv) -> cont (Expr.Sequential(e1', e2', NormalSeq, sp, m), tpenv)) | SynExpr.LetOrUse (isRec, isUse, binds, body, m) when not (isUse && isCompExpr) -> - if isRec then // TcLinearExprs processes at most one recursive binding, this is not tailcalling CheckRecursiveBindingIds binds @@ -10094,6 +10125,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = else // 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 TcLinearExprs bodyChecker cenv envinner overallTy tpenv isCompExpr body (fun (x, tpenv) -> cont (fst (mkf (x, overallTy)), tpenv)) | _ -> diff --git a/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType3.fs b/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType3.fs new file mode 100644 index 00000000000..eb8a190fde7 --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType3.fs @@ -0,0 +1,13 @@ +// #Warnings +//All branches of an 'if' expression must have the same type. This expression was expected to have type 'string', but here has type 'int'. + +let f x = x + 4 + +let y = + if true then + "" + else + "" |> ignore + (f 5) + +exit 0 diff --git a/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType4.fs b/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType4.fs new file mode 100644 index 00000000000..09db1e3083f --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/ElseBranchHasWrongType4.fs @@ -0,0 +1,15 @@ +// #Warnings +//All branches of an 'if' expression must have the same type. This expression was expected to have type 'string', but here has type 'int'. + +let f x = x + 4 + +let y = + if true then + "" + else + "" |> ignore + let z = f 4 + let a = 3 * z + (f a) + +exit 0 diff --git a/tests/fsharpqa/Source/Warnings/WarnIfMissingElseBranch3.fs b/tests/fsharpqa/Source/Warnings/WarnIfMissingElseBranch3.fs new file mode 100644 index 00000000000..7e17b46f40e --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/WarnIfMissingElseBranch3.fs @@ -0,0 +1,8 @@ +// #Warnings +//The 'if' expression is missing an 'else' branch. The 'then' branch has type 'string'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type. + +let x = 10 +let y = + if x > 10 then ("test") + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/env.lst b/tests/fsharpqa/Source/Warnings/env.lst index 5d3db7f38e7..8a80eb74d15 100644 --- a/tests/fsharpqa/Source/Warnings/env.lst +++ b/tests/fsharpqa/Source/Warnings/env.lst @@ -1,6 +1,7 @@ SOURCE=WrongNumericLiteral.fs # WrongNumericLiteral.fs SOURCE=WarnIfMissingElseBranch.fs # WarnIfMissingElseBranch.fs SOURCE=WarnIfMissingElseBranch2.fs # WarnIfMissingElseBranch2.fs + SOURCE=WarnIfMissingElseBranch3.fs # WarnIfMissingElseBranch3.fs SOURCE=ReturnInsteadOfReturnBang.fs # ReturnInsteadOfReturnBang.fs SOURCE=YieldInsteadOfYieldBang.fs # YieldInsteadOfYieldBang.fs SOURCE=TupleInAbstractMethod.fs # TupleInAbstractMethod.fs @@ -46,6 +47,8 @@ SOURCE=GuardHasWrongType.fs # GuardHasWrongType.fs SOURCE=ElseBranchHasWrongType.fs # ElseBranchHasWrongType.fs SOURCE=ElseBranchHasWrongType2.fs # ElseBranchHasWrongType2.fs + SOURCE=ElseBranchHasWrongType3.fs # ElseBranchHasWrongType3.fs + SOURCE=ElseBranchHasWrongType4.fs # ElseBranchHasWrongType4.fs SOURCE=NestedElseBranchHasWrongType.fs # NestedElseBranchHasWrongType.fs SOURCE=ElseBranchHasWrongContextType.fs # ElseBranchHasWrongContextType.fs SOURCE=ElseBranchContextDoesntPropagateInAppl.fs # ElseBranchContextDoesntPropagateInAppl.fs From 142232292ee2d4c6694c9f23ad97fbc001e2ee5c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 29 Oct 2017 08:57:40 +0300 Subject: [PATCH 072/150] Fix go to definition to symbols defined in referenced assemblies and have not normalized file paths (#3773) * fix Solution.TryGetDocumentFromPath for relative paths * temp logging * debug * normalize range.filename in TaskPickle * remove debug * Revert "normalize range.filename in TaskPickle" This reverts commit 31967a5833b566ad3cfb6270d685c0eb012d38f5. * normalize full paths in mkRange * remove null check --- src/fsharp/range.fs | 6 +++++- .../src/FSharp.Editor/Common/CodeAnalysisExtensions.fs | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index f627e00157c..aed660be56c 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -170,7 +170,11 @@ type range(code:int64) = override r.Equals(obj) = match obj with :? range as r2 -> code = r2.Code | _ -> false override r.GetHashCode() = hash code -let mkRange f b e = range (fileIndexOfFile f, b, e) +let mkRange f b e = + // remove relative parts from full path + let normalizedFilePath = if Path.IsPathRooted f then try Path.GetFullPath f with _ -> f else f + range (fileIndexOfFile normalizedFilePath, b, e) + let mkFileIndexRange fi b e = range (fi, b, e) (* end representation, start derived ops *) diff --git a/vsintegration/src/FSharp.Editor/Common/CodeAnalysisExtensions.fs b/vsintegration/src/FSharp.Editor/Common/CodeAnalysisExtensions.fs index 4198f17151f..f75bb4020c9 100644 --- a/vsintegration/src/FSharp.Editor/Common/CodeAnalysisExtensions.fs +++ b/vsintegration/src/FSharp.Editor/Common/CodeAnalysisExtensions.fs @@ -3,6 +3,7 @@ module internal Microsoft.VisualStudio.FSharp.Editor.CodeAnalysisExtensions open Microsoft.CodeAnalysis open Microsoft.FSharp.Compiler.Range +open System.IO type Project with @@ -41,7 +42,9 @@ type Solution with /// Try to find the documentId corresponding to the provided filepath within this solution member self.TryGetDocumentFromPath filePath = - self.GetDocumentIdsWithFilePath filePath + // It's crucial to normalize file path here (specificaly, remove relative parts), + // otherwise Roslyn does not find documents. + self.GetDocumentIdsWithFilePath (Path.GetFullPath filePath) |> Seq.tryHead |> Option.map (fun docId -> self.GetDocument docId) From 1e6f253d6ce899a1bb8bbace0d0883f1a207c74f Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 30 Oct 2017 20:25:28 +0300 Subject: [PATCH 073/150] fix completion after double dot in non-auto mode --- .../src/FSharp.Editor/Completion/CompletionProvider.fs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs index b3c7448a0c9..e5dcafd8f5d 100644 --- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs +++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs @@ -34,7 +34,6 @@ type internal FSharpCompletionProvider inherit CompletionProvider() static let userOpName = "CompletionProvider" - static let completionTriggers = [| '.' |] static let declarationItemsCache = ConditionalWeakTable() static let [] NameInCodePropName = "NameInCode" static let [] FullNamePropName = "FullName" @@ -87,13 +86,13 @@ type internal FSharpCompletionProvider let triggerPosition = caretPosition - 1 let c = sourceText.[triggerPosition] - if completionTriggers |> Array.contains c then - true - // do not trigger completion if it's not single dot, i.e. range expression - elif triggerPosition > 0 && sourceText.[triggerPosition - 1] = '.' then + if not Settings.IntelliSense.ShowAfterCharIsTyped && sourceText.[triggerPosition - 1] = '.' then false + elif c = '.' then + true + // Trigger completion if we are on a valid classification type else let documentId, filePath, defines = getInfo() From d7ee51e72a85a08d5957492e8a16df10b057e531 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 30 Oct 2017 22:07:12 +0300 Subject: [PATCH 074/150] fix auto completion after dot --- .../src/FSharp.Editor/Completion/CompletionProvider.fs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs index e5dcafd8f5d..7825ccc1bda 100644 --- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs +++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs @@ -90,14 +90,11 @@ type internal FSharpCompletionProvider if not Settings.IntelliSense.ShowAfterCharIsTyped && sourceText.[triggerPosition - 1] = '.' then false - elif c = '.' then - true - // Trigger completion if we are on a valid classification type else let documentId, filePath, defines = getInfo() CompletionUtils.shouldProvideCompletion(documentId, filePath, defines, sourceText, triggerPosition) && - (Settings.IntelliSense.ShowAfterCharIsTyped && CompletionUtils.isStartingNewWord(sourceText, triggerPosition)) + (c = '.' || (Settings.IntelliSense.ShowAfterCharIsTyped && CompletionUtils.isStartingNewWord(sourceText, triggerPosition))) static member ProvideCompletionsAsyncAux(checker: FSharpChecker, sourceText: SourceText, caretPosition: int, options: FSharpProjectOptions, filePath: string, textVersionHash: int, getAllSymbols: unit -> AssemblySymbol list) = From 1658aa00526b1a5825da88404aba279fc6ec63bb Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 30 Oct 2017 12:22:47 -0700 Subject: [PATCH 075/150] don't run tests if the `PB_SKIPTESTS` variable is set to true --- build.cmd | 12 ++++++++++++ build.sh | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/build.cmd b/build.cmd index 7431a36c19e..103030160a8 100644 --- a/build.cmd +++ b/build.cmd @@ -389,6 +389,17 @@ REM ------------------ Report config ----------------------- REM after this point, ARG variable should not be used, use only BUILD_* or TEST_* +REM if the `PB_SKIPTESTS` variable is set to 'true' then no tests should be built or run, even if explicitly specified +if /i "%PB_SKIPTESTS%" == "true" ( + set TEST_NET40_COMPILERUNIT_SUITE=0 + set TEST_NET40_COREUNIT_SUITE=0 + set TEST_NET40_FSHARP_SUITE=0 + set TEST_NET40_FSHARPQA_SUITE=0 + set TEST_CORECLR_COREUNIT_SUITE=0 + set TEST_CORECLR_FSHARP_SUITE=0 + set TEST_VS_IDEUNIT_SUITE=0 +) + echo Build/Tests configuration: echo. echo BUILD_PROTO=%BUILD_PROTO% @@ -404,6 +415,7 @@ echo BUILD_NUGET=%BUILD_NUGET% echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo. +echo PB_SKIPTESTS=%PB_SKIPTESTS% echo TEST_NET40_COMPILERUNIT_SUITE=%TEST_NET40_COMPILERUNIT_SUITE% echo TEST_NET40_COREUNIT_SUITE=%TEST_NET40_COREUNIT_SUITE% echo TEST_NET40_FSHARP_SUITE=%TEST_NET40_FSHARP_SUITE% diff --git a/build.sh b/build.sh index 561a129c522..214248bcbd2 100755 --- a/build.sh +++ b/build.sh @@ -350,6 +350,18 @@ if [ $_autoselect_tests -eq 1 ]; then fi fi +# If the `PB_SKIPTESTS` variable is set to 'true' then no tests should be built or run, even if explicitly specified +if [ $PB_SKIPTESTS -eq "true" ]; then + export TEST_NET40_COMPILERUNIT_SUITE=0 + export TEST_NET40_COREUNIT_SUITE=0 + export TEST_NET40_FSHARP_SUITE=0 + export TEST_NET40_FSHARPQA_SUITE=0 + export TEST_CORECLR_COREUNIT_SUITE=0 + export TEST_CORECLR_FSHARP_SUITE=0 + export TEST_PORTABLE_COREUNIT_SUITE=0 + export TEST_VS_IDEUNIT_SUITE=0 +fi + # # Report config # @@ -367,6 +379,7 @@ printf "BUILD_SETUP=%s\n" "$BUILD_SETUP" printf "BUILD_CONFIG=%s\n" "$BUILD_CONFIG" printf "BUILD_PUBLICSIGN=%s\n" "$BUILD_PUBLICSIGN" printf "\n" +printf "PB_SKIPTESTS=%s\n" "$PB_SKIPTESTS" printf "TEST_NET40_COMPILERUNIT_SUITE=%s\n" "$TEST_NET40_COMPILERUNIT_SUITE" printf "TEST_NET40_COREUNIT_SUITE=%s\n" "$TEST_NET40_COREUNIT_SUITE" printf "TEST_NET40_FSHARP_SUITE=%s\n" "$TEST_NET40_FSHARP_SUITE" From 637c817ced91795f951db010474b47965874b562 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Tue, 31 Oct 2017 14:00:49 +0800 Subject: [PATCH 076/150] fix test and add lst.[0..x] test cases beside lst.[..x] --- .../Microsoft.FSharp.Collections/ListType.fs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs index b7c9a5bdefb..8559d3b9a2a 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs @@ -245,14 +245,24 @@ type ListType() = Assert.AreEqual(lst.[6..], ([]: int list)) CheckThrowsIndexOutRangException((fun _ -> lst.[7..] |> ignore)) - CheckThrowsIndexOutRangException((fun _ -> lst.[.. -1] |> ignore)) + + Assert.AreEqual(lst.[..-1], ([]: int list)) Assert.AreEqual(lst.[..0], [1]) Assert.AreEqual(lst.[..1], [1;2]) Assert.AreEqual(lst.[..2], [1;2;3]) Assert.AreEqual(lst.[..3], [1;2;3;4]) Assert.AreEqual(lst.[..4], [1;2;3;4;5]) Assert.AreEqual(lst.[..5], [1;2;3;4;5;6]) - CheckThrowsIndexOutRangException((fun _ -> lst.[..6] |> ignore)) + CheckThrowsIndexOutRangException((fun _ -> lst.[..6] |> ignore)) + + Assert.AreEqual(lst.[0..-1], ([]: int list)) + Assert.AreEqual(lst.[0..0], [1]) + Assert.AreEqual(lst.[0..1], [1;2]) + Assert.AreEqual(lst.[0..2], [1;2;3]) + Assert.AreEqual(lst.[0..3], [1;2;3;4]) + Assert.AreEqual(lst.[0..4], [1;2;3;4;5]) + Assert.AreEqual(lst.[0..5], [1;2;3;4;5;6]) + CheckThrowsIndexOutRangException((fun _ -> lst.[0..6] |> ignore)) Assert.AreEqual(lst.[1..-1], ([]: int list)) Assert.AreEqual(lst.[1..0], ([]: int list)) @@ -280,4 +290,4 @@ type ListType() = CheckThrowsIndexOutRangException((fun _ -> empty.[..0] |> ignore)) CheckThrowsIndexOutRangException((fun _ -> empty.[0..0] |> ignore)) CheckThrowsIndexOutRangException((fun _ -> empty.[0..1] |> ignore)) - CheckThrowsIndexOutRangException((fun _ -> empty.[3..5] |> ignore)) \ No newline at end of file + CheckThrowsIndexOutRangException((fun _ -> empty.[3..5] |> ignore)) From c9f698015ce4210069f9fb702ad500ea3cf578ed Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Tue, 31 Oct 2017 14:28:33 +0800 Subject: [PATCH 077/150] change [x..-a] to [x..(-a)] fix build error --- .../Microsoft.FSharp.Collections/ListType.fs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs index 8559d3b9a2a..3c6f1e5555f 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ListType.fs @@ -246,7 +246,7 @@ type ListType() = CheckThrowsIndexOutRangException((fun _ -> lst.[7..] |> ignore)) - Assert.AreEqual(lst.[..-1], ([]: int list)) + Assert.AreEqual(lst.[..(-1)], ([]: int list)) Assert.AreEqual(lst.[..0], [1]) Assert.AreEqual(lst.[..1], [1;2]) Assert.AreEqual(lst.[..2], [1;2;3]) @@ -255,7 +255,7 @@ type ListType() = Assert.AreEqual(lst.[..5], [1;2;3;4;5;6]) CheckThrowsIndexOutRangException((fun _ -> lst.[..6] |> ignore)) - Assert.AreEqual(lst.[0..-1], ([]: int list)) + Assert.AreEqual(lst.[0..(-1)], ([]: int list)) Assert.AreEqual(lst.[0..0], [1]) Assert.AreEqual(lst.[0..1], [1;2]) Assert.AreEqual(lst.[0..2], [1;2;3]) @@ -264,7 +264,7 @@ type ListType() = Assert.AreEqual(lst.[0..5], [1;2;3;4;5;6]) CheckThrowsIndexOutRangException((fun _ -> lst.[0..6] |> ignore)) - Assert.AreEqual(lst.[1..-1], ([]: int list)) + Assert.AreEqual(lst.[1..(-1)], ([]: int list)) Assert.AreEqual(lst.[1..0], ([]: int list)) Assert.AreEqual(lst.[1..1], [2]) Assert.AreEqual(lst.[1..2], [2;3]) @@ -280,8 +280,8 @@ type ListType() = Assert.AreEqual(lst.[3..1], ([]: int list)) Assert.AreEqual(lst.[4..1], ([]: int list)) - Assert.AreEqual(lst.[-3..-4], ([]: int list)) - CheckThrowsIndexOutRangException((fun _ -> lst.[-4..-3] |> ignore)) + Assert.AreEqual(lst.[-3..(-4)], ([]: int list)) + CheckThrowsIndexOutRangException((fun _ -> lst.[-4..(-3)] |> ignore)) let empty : obj list = List.empty Assert.AreEqual(empty.[*], ([]: obj list)) From 3a30dfbe157192737c5c205bb8d60acf5811e7db Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 31 Oct 2017 10:45:08 -0700 Subject: [PATCH 078/150] Allow the templates package to be locally overwritten. --- .../Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest index cdf29194040..6267e36d463 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest @@ -9,7 +9,7 @@ Microsoft.FSharp.VSIX.Templates https://docs.microsoft.com/en-us/dotnet/articles/fsharp/ - + From 4ad577f1d7d29078513452021ec3498bbfff619a Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 31 Oct 2017 21:51:10 -0700 Subject: [PATCH 079/150] Minor cleanup (#3854) --- .../LanguageService/LanguageService.fs | 107 ++++++++--------- .../ProjectSitesAndFiles.fs | 109 ++++++++++-------- 2 files changed, 113 insertions(+), 103 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 8055202d252..4e7757eb588 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -15,17 +15,16 @@ open System.Linq open System.Runtime.CompilerServices open System.Runtime.InteropServices open System.Threading - -open Microsoft.FSharp.Compiler.CompileOps -open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider - open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.Diagnostics open Microsoft.CodeAnalysis.Completion open Microsoft.CodeAnalysis.Options +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.VisualStudio open Microsoft.VisualStudio.Editor +open Microsoft.VisualStudio.FSharp.LanguageService +open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService @@ -34,7 +33,6 @@ open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList open Microsoft.VisualStudio.LanguageServices.ProjectSystem open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop -open Microsoft.VisualStudio.FSharp.LanguageService open Microsoft.VisualStudio.ComponentModelHost // Exposes FSharpChecker as MEF export @@ -89,7 +87,7 @@ type internal FSharpCheckerProvider // It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). // The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. [); Composition.Shared>] -type internal FSharpProjectOptionsManager +type internal FSharpProjectOptionsManager [] ( checkerProvider: FSharpCheckerProvider, @@ -114,33 +112,36 @@ type internal FSharpProjectOptionsManager /// Clear a project from the project table member this.ClearInfoForProject(projectId:ProjectId) = projectOptionsTable.ClearInfoForProject(projectId) + /// Clear a project from the single file project table member this.ClearInfoForSingleFileProject(projectId) = singleFileProjectTable.TryRemove(projectId) |> ignore + /// Update a project in the single file project table member this.AddOrUpdateSingleFileProject(projectId, data) = singleFileProjectTable.[projectId] <- data /// Get the exact options for a single-file script - member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents, workspace: Workspace) = async { - let extraProjectInfo = Some(box workspace) - let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) - if SourceFile.MustBeSingleFileProject(fileName) then - // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. - // This is because we repeatedly recompute the options. - let optionsStamp = None - let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) - // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been - // compiled and #r will refer to files on disk - let referencedProjectFileNames = [| |] - let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable, true) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - else - let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable, true) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - } + member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents) = + async { + let extraProjectInfo = Some(box workspace) + let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) + if SourceFile.MustBeSingleFileProject(fileName) then + // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. + // This is because we repeatedly recompute the options. + let optionsStamp = None + let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) + // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been + // compiled and #r will refer to files on disk + let referencedProjectFileNames = [| |] + let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable, true) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + else + let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable, true) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + } /// Update the info for a project in the project table member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, site, userOpName) = @@ -164,32 +165,34 @@ type internal FSharpProjectOptionsManager | _ -> FSharpParsingOptions.Default CompilerEnvironment.GetCompilationDefinesForEditing(document.Name, parsingOptions) + /// Try and get the Options for a project member this.TryGetOptionsForProject(projectId:ProjectId) = projectOptionsTable.TryGetOptionsForProject(projectId) /// Get the exact options for a document or project - member this.TryGetOptionsForDocumentOrProject(document: Document) = async { - let projectId = document.Project.Id - - // The options for a single-file script project are re-requested each time the file is analyzed. This is because the - // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze - // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. - match singleFileProjectTable.TryGetValue(projectId) with - | true, (loadTime, _, _) -> - try - let fileName = document.FilePath - let! cancellationToken = Async.CancellationToken - let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask - // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been - // compiled and #r will refer to files on disk. - let tryGetOrCreateProjectId _ = None - let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString(), document.Project.Solution.Workspace) - this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) - return Some (parsingOptions, None, projectOptions) - with ex -> - Assert.Exception(ex) - return None - | _ -> return this.TryGetOptionsForProject(projectId) - } + member this.TryGetOptionsForDocumentOrProject(document: Document) = + async { + let projectId = document.Project.Id + + // The options for a single-file script project are re-requested each time the file is analyzed. This is because the + // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze + // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. + match singleFileProjectTable.TryGetValue(projectId) with + | true, (loadTime, _, _) -> + try + let fileName = document.FilePath + let! cancellationToken = Async.CancellationToken + let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask + // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been + // compiled and #r will refer to files on disk. + let tryGetOrCreateProjectId _ = None + let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString()) + this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) + return Some (parsingOptions, None, projectOptions) + with ex -> + Assert.Exception(ex) + return None + | _ -> return this.TryGetOptionsForProject(projectId) + } /// Get the options for a document or project relevant for syntax processing. /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project options for a script. @@ -540,7 +543,7 @@ type let projectDisplayName = projectDisplayNameOf projectFileName let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) - let _referencedProjectFileNames, parsingOptions, projectOptions = projectInfoManager.ComputeSingleFileOptions (tryGetOrCreateProjectId workspace, fileName, loadTime, fileContents, workspace) |> Async.RunSynchronously + let _referencedProjectFileNames, parsingOptions, projectOptions = projectInfoManager.ComputeSingleFileOptions (tryGetOrCreateProjectId workspace, fileName, loadTime, fileContents) |> Async.RunSynchronously projectInfoManager.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) if isNull (workspace.ProjectTracker.GetProject projectId) then diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 7f706e98443..22ea0db0107 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -75,7 +75,7 @@ type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames |> Array.choose (fun flag -> if flag.StartsWith("-r:") then Some flag.[3..] else None) override this.CompilationBinOutputPath = None override this.ProjectFileName = checkOptions.ProjectFileName - override this.BuildErrorReporter with get() = None and set _v = () + override this.BuildErrorReporter with get() = None and set _ = () override this.AdviseProjectSiteChanges(_,_) = () override this.AdviseProjectSiteCleaned(_,_) = () override this.AdviseProjectSiteClosed(_,_) = () @@ -128,11 +128,12 @@ type private ProjectSiteOfSingleFile(sourceFile) = /// Manage Storage of FSharpProjectOptions the options for a project type internal FSharpProjectOptionsTable () = + // A table of information about projects, excluding single-file projects. let projectTable = ConcurrentDictionary>() let commandLineOptions = new ConcurrentDictionary() - /// Go and re-get all of the options for everything that references projectId + /// Re-fetch all of the options for everything that references projectId let refreshInfoForProjectsThatReferenceThisProject (projectId:ProjectId) = for KeyValue(otherProjectId, ((referencedProjectIds, _parsingOptions, _site, _options), refresh)) in projectTable.ToArray() do for referencedProjectId in referencedProjectIds do @@ -161,69 +162,74 @@ type internal FSharpProjectOptionsTable () = | true, (sources, references, options) -> sources, references, options | _ -> [||], [||], [||] + /// Store the command line options for a projectId member this.SetOptionsWithProjectId(projectId:ProjectId, sourcePaths:string[], referencePaths:string[], options:string[]) = commandLineOptions.[projectId] <- (sourcePaths, referencePaths, options) + let internal provideProjectSiteProvider(workspace:VisualStudioWorkspaceImpl, project:Project, serviceProvider:System.IServiceProvider, projectOptionsTable:FSharpProjectOptionsTable option) = let hier = workspace.GetHierarchy(project.Id) let getCommandLineOptionsWithProjectId (projectId) = match projectOptionsTable with | Some (options) -> options.GetCommandLineOptionsWithProjectId(projectId) | None -> [||], [||], [||] - {new IProvideProjectSite with - member x.GetProjectSite() = - let fst (a, _, _) = a - let snd (_, b, _) = b - let mutable errorReporter = - let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) - Some(reporter:> IVsLanguageServiceBuildErrorReporter2) - - { new IProjectSite with - member __.Description = project.Name - member __.CompilationSourceFiles = getCommandLineOptionsWithProjectId(project.Id) |> fst - member __.CompilationOptions = - let _,references,options = getCommandLineOptionsWithProjectId(project.Id) - Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] - member __.CompilationReferences = getCommandLineOptionsWithProjectId(project.Id) |> snd - member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) - member __.ProjectFileName = project.FilePath - member __.AdviseProjectSiteChanges(_,_) = () - member __.AdviseProjectSiteCleaned(_,_) = () - member __.AdviseProjectSiteClosed(_,_) = () - member __.IsIncompleteTypeCheckEnvironment = false - member __.TargetFrameworkMoniker = "" - member __.ProjectGuid = project.Id.Id.ToString() - member __.LoadTime = System.DateTime.Now - member __.ProjectProvider = Some (x) - member __.BuildErrorReporter with get () = errorReporter and - set (v) = errorReporter <- v - } - - interface IVsHierarchy with - member __.SetSite(psp) = hier.SetSite(psp) - member __.GetSite(psp) = hier.GetSite(ref psp) - member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) - member __.Close() = hier.Close() - member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) - member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) - member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) - member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) - member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, ref ppHierarchyNested, ref pitemidNested) - member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) - member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) - member __.Unused0() = hier.Unused0() - member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) - member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) - member __.Unused1() = hier.Unused1() - member __.Unused2() = hier.Unused2() - member __.Unused3() = hier.Unused3() - member __.Unused4() = hier.Unused4() + { + new IProvideProjectSite with + member x.GetProjectSite() = + let fst (a, _, _) = a + let snd (_, b, _) = b + let mutable errorReporter = + let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) + Some(reporter:> IVsLanguageServiceBuildErrorReporter2) + + { + new IProjectSite with + member __.Description = project.Name + member __.CompilationSourceFiles = getCommandLineOptionsWithProjectId(project.Id) |> fst + member __.CompilationOptions = + let _,references,options = getCommandLineOptionsWithProjectId(project.Id) + Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] + member __.CompilationReferences = getCommandLineOptionsWithProjectId(project.Id) |> snd + member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) + member __.ProjectFileName = project.FilePath + member __.AdviseProjectSiteChanges(_,_) = () + member __.AdviseProjectSiteCleaned(_,_) = () + member __.AdviseProjectSiteClosed(_,_) = () + member __.IsIncompleteTypeCheckEnvironment = false + member __.TargetFrameworkMoniker = "" + member __.ProjectGuid = project.Id.Id.ToString() + member __.LoadTime = System.DateTime.Now + member __.ProjectProvider = Some (x) + member __.BuildErrorReporter with get () = errorReporter and set (v) = errorReporter <- v + } + interface IVsHierarchy with + member __.SetSite(psp) = hier.SetSite(psp) + member __.GetSite(psp) = hier.GetSite(ref psp) + member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) + member __.Close() = hier.Close() + member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) + member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) + member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) + member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) + member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = + hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, + ref ppHierarchyNested, ref pitemidNested) + member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) + member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) + member __.Unused0() = hier.Unused0() + member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) + member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) + member __.Unused1() = hier.Unused1() + member __.Unused2() = hier.Unused2() + member __.Unused3() = hier.Unused3() + member __.Unused4() = hier.Unused4() } /// Information about projects, open files and other active artifacts in visual studio. /// Keeps track of the relationship between IVsTextLines buffers, IFSharpSource_DEPRECATED objects, IProjectSite objects and FSharpProjectOptions [] type internal ProjectSitesAndFiles() = + static let sourceUserDataGuid = new Guid("{55F834FD-B950-4C61-BBAA-0511ABAF4AE2}") // Guid for source user data on text buffer static let mutable stamp = 0L static let tryGetProjectSite(hierarchy:IVsHierarchy) = @@ -285,7 +291,8 @@ type internal ProjectSitesAndFiles() = let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None seq { match solutionService with | Some solutionService -> - for reference in getReferencesForSolutionService solutionService do yield reference + for reference in getReferencesForSolutionService solutionService do + yield reference | None -> () } From 9cd9f22fe928d9bae063144fc6223ef0441cff94 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 1 Nov 2017 14:53:28 -0700 Subject: [PATCH 080/150] skip publishing packages unless the variable `PB_PUBLISHTYPE` is set to `myget` --- build.cmd | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build.cmd b/build.cmd index 103030160a8..ff834797bde 100644 --- a/build.cmd +++ b/build.cmd @@ -389,6 +389,8 @@ REM ------------------ Report config ----------------------- REM after this point, ARG variable should not be used, use only BUILD_* or TEST_* +REM all PB_* variables override any settings + REM if the `PB_SKIPTESTS` variable is set to 'true' then no tests should be built or run, even if explicitly specified if /i "%PB_SKIPTESTS%" == "true" ( set TEST_NET40_COMPILERUNIT_SUITE=0 @@ -400,6 +402,12 @@ if /i "%PB_SKIPTESTS%" == "true" ( set TEST_VS_IDEUNIT_SUITE=0 ) +REM MyGet packages published as part of the build are only for nightly dogfooding, so any other value means publishing should be skipped +REM The official build definition sets PB_PUBLISHTYPE to "myget" by default. +if /i not "%PB_PUBLISHTYPE%" == "myget" ( + set PUBLISH_VSIX=0 +) + echo Build/Tests configuration: echo. echo BUILD_PROTO=%BUILD_PROTO% @@ -416,6 +424,8 @@ echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo. echo PB_SKIPTESTS=%PB_SKIPTESTS% +echo PB_PUBLISHTYPE=%PB_PUBLISHTYPE% +echo. echo TEST_NET40_COMPILERUNIT_SUITE=%TEST_NET40_COMPILERUNIT_SUITE% echo TEST_NET40_COREUNIT_SUITE=%TEST_NET40_COREUNIT_SUITE% echo TEST_NET40_FSHARP_SUITE=%TEST_NET40_FSHARP_SUITE% From 1adf07bbdbaf15de7c2975914e764f6ef29884be Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Tue, 31 Oct 2017 17:28:47 -0700 Subject: [PATCH 081/150] Minor cleanup --- .../LanguageService/LanguageService.fs | 107 ++++++++--------- .../ProjectSitesAndFiles.fs | 109 ++++++++++-------- 2 files changed, 113 insertions(+), 103 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 8055202d252..4e7757eb588 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -15,17 +15,16 @@ open System.Linq open System.Runtime.CompilerServices open System.Runtime.InteropServices open System.Threading - -open Microsoft.FSharp.Compiler.CompileOps -open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider - open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.Diagnostics open Microsoft.CodeAnalysis.Completion open Microsoft.CodeAnalysis.Options +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.VisualStudio open Microsoft.VisualStudio.Editor +open Microsoft.VisualStudio.FSharp.LanguageService +open Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService @@ -34,7 +33,6 @@ open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList open Microsoft.VisualStudio.LanguageServices.ProjectSystem open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop -open Microsoft.VisualStudio.FSharp.LanguageService open Microsoft.VisualStudio.ComponentModelHost // Exposes FSharpChecker as MEF export @@ -89,7 +87,7 @@ type internal FSharpCheckerProvider // It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). // The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. [); Composition.Shared>] -type internal FSharpProjectOptionsManager +type internal FSharpProjectOptionsManager [] ( checkerProvider: FSharpCheckerProvider, @@ -114,33 +112,36 @@ type internal FSharpProjectOptionsManager /// Clear a project from the project table member this.ClearInfoForProject(projectId:ProjectId) = projectOptionsTable.ClearInfoForProject(projectId) + /// Clear a project from the single file project table member this.ClearInfoForSingleFileProject(projectId) = singleFileProjectTable.TryRemove(projectId) |> ignore + /// Update a project in the single file project table member this.AddOrUpdateSingleFileProject(projectId, data) = singleFileProjectTable.[projectId] <- data /// Get the exact options for a single-file script - member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents, workspace: Workspace) = async { - let extraProjectInfo = Some(box workspace) - let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) - if SourceFile.MustBeSingleFileProject(fileName) then - // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. - // This is because we repeatedly recompute the options. - let optionsStamp = None - let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) - // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been - // compiled and #r will refer to files on disk - let referencedProjectFileNames = [| |] - let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable, true) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - else - let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable, true) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - } + member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents) = + async { + let extraProjectInfo = Some(box workspace) + let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject |> Option.map(fun (_, _, projectOptions) -> projectOptions) + if SourceFile.MustBeSingleFileProject(fileName) then + // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. + // This is because we repeatedly recompute the options. + let optionsStamp = None + let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) + // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been + // compiled and #r will refer to files on disk + let referencedProjectFileNames = [| |] + let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable, true) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + else + let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable, true) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + } /// Update the info for a project in the project table member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, site, userOpName) = @@ -164,32 +165,34 @@ type internal FSharpProjectOptionsManager | _ -> FSharpParsingOptions.Default CompilerEnvironment.GetCompilationDefinesForEditing(document.Name, parsingOptions) + /// Try and get the Options for a project member this.TryGetOptionsForProject(projectId:ProjectId) = projectOptionsTable.TryGetOptionsForProject(projectId) /// Get the exact options for a document or project - member this.TryGetOptionsForDocumentOrProject(document: Document) = async { - let projectId = document.Project.Id - - // The options for a single-file script project are re-requested each time the file is analyzed. This is because the - // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze - // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. - match singleFileProjectTable.TryGetValue(projectId) with - | true, (loadTime, _, _) -> - try - let fileName = document.FilePath - let! cancellationToken = Async.CancellationToken - let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask - // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been - // compiled and #r will refer to files on disk. - let tryGetOrCreateProjectId _ = None - let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString(), document.Project.Solution.Workspace) - this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) - return Some (parsingOptions, None, projectOptions) - with ex -> - Assert.Exception(ex) - return None - | _ -> return this.TryGetOptionsForProject(projectId) - } + member this.TryGetOptionsForDocumentOrProject(document: Document) = + async { + let projectId = document.Project.Id + + // The options for a single-file script project are re-requested each time the file is analyzed. This is because the + // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze + // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. + match singleFileProjectTable.TryGetValue(projectId) with + | true, (loadTime, _, _) -> + try + let fileName = document.FilePath + let! cancellationToken = Async.CancellationToken + let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask + // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been + // compiled and #r will refer to files on disk. + let tryGetOrCreateProjectId _ = None + let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString()) + this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) + return Some (parsingOptions, None, projectOptions) + with ex -> + Assert.Exception(ex) + return None + | _ -> return this.TryGetOptionsForProject(projectId) + } /// Get the options for a document or project relevant for syntax processing. /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project options for a script. @@ -540,7 +543,7 @@ type let projectDisplayName = projectDisplayNameOf projectFileName let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) - let _referencedProjectFileNames, parsingOptions, projectOptions = projectInfoManager.ComputeSingleFileOptions (tryGetOrCreateProjectId workspace, fileName, loadTime, fileContents, workspace) |> Async.RunSynchronously + let _referencedProjectFileNames, parsingOptions, projectOptions = projectInfoManager.ComputeSingleFileOptions (tryGetOrCreateProjectId workspace, fileName, loadTime, fileContents) |> Async.RunSynchronously projectInfoManager.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) if isNull (workspace.ProjectTracker.GetProject projectId) then diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 7f706e98443..22ea0db0107 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -75,7 +75,7 @@ type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames |> Array.choose (fun flag -> if flag.StartsWith("-r:") then Some flag.[3..] else None) override this.CompilationBinOutputPath = None override this.ProjectFileName = checkOptions.ProjectFileName - override this.BuildErrorReporter with get() = None and set _v = () + override this.BuildErrorReporter with get() = None and set _ = () override this.AdviseProjectSiteChanges(_,_) = () override this.AdviseProjectSiteCleaned(_,_) = () override this.AdviseProjectSiteClosed(_,_) = () @@ -128,11 +128,12 @@ type private ProjectSiteOfSingleFile(sourceFile) = /// Manage Storage of FSharpProjectOptions the options for a project type internal FSharpProjectOptionsTable () = + // A table of information about projects, excluding single-file projects. let projectTable = ConcurrentDictionary>() let commandLineOptions = new ConcurrentDictionary() - /// Go and re-get all of the options for everything that references projectId + /// Re-fetch all of the options for everything that references projectId let refreshInfoForProjectsThatReferenceThisProject (projectId:ProjectId) = for KeyValue(otherProjectId, ((referencedProjectIds, _parsingOptions, _site, _options), refresh)) in projectTable.ToArray() do for referencedProjectId in referencedProjectIds do @@ -161,69 +162,74 @@ type internal FSharpProjectOptionsTable () = | true, (sources, references, options) -> sources, references, options | _ -> [||], [||], [||] + /// Store the command line options for a projectId member this.SetOptionsWithProjectId(projectId:ProjectId, sourcePaths:string[], referencePaths:string[], options:string[]) = commandLineOptions.[projectId] <- (sourcePaths, referencePaths, options) + let internal provideProjectSiteProvider(workspace:VisualStudioWorkspaceImpl, project:Project, serviceProvider:System.IServiceProvider, projectOptionsTable:FSharpProjectOptionsTable option) = let hier = workspace.GetHierarchy(project.Id) let getCommandLineOptionsWithProjectId (projectId) = match projectOptionsTable with | Some (options) -> options.GetCommandLineOptionsWithProjectId(projectId) | None -> [||], [||], [||] - {new IProvideProjectSite with - member x.GetProjectSite() = - let fst (a, _, _) = a - let snd (_, b, _) = b - let mutable errorReporter = - let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) - Some(reporter:> IVsLanguageServiceBuildErrorReporter2) - - { new IProjectSite with - member __.Description = project.Name - member __.CompilationSourceFiles = getCommandLineOptionsWithProjectId(project.Id) |> fst - member __.CompilationOptions = - let _,references,options = getCommandLineOptionsWithProjectId(project.Id) - Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] - member __.CompilationReferences = getCommandLineOptionsWithProjectId(project.Id) |> snd - member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) - member __.ProjectFileName = project.FilePath - member __.AdviseProjectSiteChanges(_,_) = () - member __.AdviseProjectSiteCleaned(_,_) = () - member __.AdviseProjectSiteClosed(_,_) = () - member __.IsIncompleteTypeCheckEnvironment = false - member __.TargetFrameworkMoniker = "" - member __.ProjectGuid = project.Id.Id.ToString() - member __.LoadTime = System.DateTime.Now - member __.ProjectProvider = Some (x) - member __.BuildErrorReporter with get () = errorReporter and - set (v) = errorReporter <- v - } - - interface IVsHierarchy with - member __.SetSite(psp) = hier.SetSite(psp) - member __.GetSite(psp) = hier.GetSite(ref psp) - member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) - member __.Close() = hier.Close() - member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) - member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) - member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) - member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) - member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, ref ppHierarchyNested, ref pitemidNested) - member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) - member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) - member __.Unused0() = hier.Unused0() - member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) - member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) - member __.Unused1() = hier.Unused1() - member __.Unused2() = hier.Unused2() - member __.Unused3() = hier.Unused3() - member __.Unused4() = hier.Unused4() + { + new IProvideProjectSite with + member x.GetProjectSite() = + let fst (a, _, _) = a + let snd (_, b, _) = b + let mutable errorReporter = + let reporter = ProjectExternalErrorReporter(project.Id, "FS", serviceProvider) + Some(reporter:> IVsLanguageServiceBuildErrorReporter2) + + { + new IProjectSite with + member __.Description = project.Name + member __.CompilationSourceFiles = getCommandLineOptionsWithProjectId(project.Id) |> fst + member __.CompilationOptions = + let _,references,options = getCommandLineOptionsWithProjectId(project.Id) + Array.concat [options; references |> Array.map(fun r -> "-r:" + r)] + member __.CompilationReferences = getCommandLineOptionsWithProjectId(project.Id) |> snd + member site.CompilationBinOutputPath = site.CompilationOptions |> Array.tryPick (fun s -> if s.StartsWith("-o:") then Some s.[3..] else None) + member __.ProjectFileName = project.FilePath + member __.AdviseProjectSiteChanges(_,_) = () + member __.AdviseProjectSiteCleaned(_,_) = () + member __.AdviseProjectSiteClosed(_,_) = () + member __.IsIncompleteTypeCheckEnvironment = false + member __.TargetFrameworkMoniker = "" + member __.ProjectGuid = project.Id.Id.ToString() + member __.LoadTime = System.DateTime.Now + member __.ProjectProvider = Some (x) + member __.BuildErrorReporter with get () = errorReporter and set (v) = errorReporter <- v + } + interface IVsHierarchy with + member __.SetSite(psp) = hier.SetSite(psp) + member __.GetSite(psp) = hier.GetSite(ref psp) + member __.QueryClose(pfCanClose) = hier.QueryClose(ref pfCanClose) + member __.Close() = hier.Close() + member __.GetGuidProperty(itemid, propid, pguid) = hier.GetGuidProperty(itemid, propid, ref pguid) + member __.SetGuidProperty(itemid, propid, rguid) = hier.SetGuidProperty(itemid, propid, ref rguid) + member __.GetProperty(itemid, propid, pvar) = hier.GetProperty(itemid, propid, ref pvar) + member __.SetProperty(itemid, propid, var) = hier.SetProperty(itemid, propid, var) + member __.GetNestedHierarchy(itemid, iidHierarchyNested, ppHierarchyNested, pitemidNested) = + hier.GetNestedHierarchy(itemid, ref iidHierarchyNested, + ref ppHierarchyNested, ref pitemidNested) + member __.GetCanonicalName(itemid, pbstrName) = hier.GetCanonicalName(itemid, ref pbstrName) + member __.ParseCanonicalName(pszName, pitemid) = hier.ParseCanonicalName(pszName, ref pitemid) + member __.Unused0() = hier.Unused0() + member __.AdviseHierarchyEvents(pEventSink, pdwCookie) = hier.AdviseHierarchyEvents(pEventSink, ref pdwCookie) + member __.UnadviseHierarchyEvents(dwCookie) = hier.UnadviseHierarchyEvents(dwCookie) + member __.Unused1() = hier.Unused1() + member __.Unused2() = hier.Unused2() + member __.Unused3() = hier.Unused3() + member __.Unused4() = hier.Unused4() } /// Information about projects, open files and other active artifacts in visual studio. /// Keeps track of the relationship between IVsTextLines buffers, IFSharpSource_DEPRECATED objects, IProjectSite objects and FSharpProjectOptions [] type internal ProjectSitesAndFiles() = + static let sourceUserDataGuid = new Guid("{55F834FD-B950-4C61-BBAA-0511ABAF4AE2}") // Guid for source user data on text buffer static let mutable stamp = 0L static let tryGetProjectSite(hierarchy:IVsHierarchy) = @@ -285,7 +291,8 @@ type internal ProjectSitesAndFiles() = let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None seq { match solutionService with | Some solutionService -> - for reference in getReferencesForSolutionService solutionService do yield reference + for reference in getReferencesForSolutionService solutionService do + yield reference | None -> () } From 87c4f5e0aa5cb8312c75f1c6d09d02a2a3ef8073 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 1 Nov 2017 16:34:45 -0700 Subject: [PATCH 082/150] Make cross language project references work when references are built --- .../LanguageService/LanguageService.fs | 10 ++++----- .../FSharp.LanguageService.fsproj | 1 + .../LanguageServiceConstants.fs | 10 +++++++++ .../ProjectSitesAndFiles.fs | 21 ++++++++----------- 4 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 4e7757eb588..bbb1a00524a 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -35,7 +35,7 @@ open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.ComponentModelHost -// Exposes FSharpChecker as MEF export +/// Exposes FSharpChecker as MEF export [); Composition.Shared>] type internal FSharpCheckerProvider [] @@ -82,10 +82,10 @@ type internal FSharpCheckerProvider /// Exposes FCS FSharpProjectOptions information management as MEF component. -// -// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. -// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). -// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. +/// +/// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. +/// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). +/// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. [); Composition.Shared>] type internal FSharpProjectOptionsManager [] diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 22c3f49cf78..5ac5900f574 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -67,6 +67,7 @@ Microsoft.VisualStudio.FSharp.LanguageService.Strings + diff --git a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs new file mode 100644 index 00000000000..b64d0405948 --- /dev/null +++ b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.LanguageService + +[] +module internal LanguageServiceConstants = + + /// "F#" + [] + let FSharpLanguageName = "F#" diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 22ea0db0107..f5abc9eca30 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -34,23 +34,20 @@ module internal rec Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open System open System.Collections.Concurrent -open System.ComponentModel.Composition -open System.IO open System.Diagnostics -open Microsoft.VisualStudio -open Microsoft.VisualStudio.TextManager.Interop -open Microsoft.VisualStudio.Shell.Interop -open Microsoft.FSharp.Compiler.SourceCodeServices +open System.IO open Microsoft.CodeAnalysis -open Microsoft.VisualStudio.LanguageServices +open Microsoft.FSharp.Compiler.SourceCodeServices + +open Microsoft.VisualStudio +open Microsoft.VisualStudio.FSharp.LanguageService open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList -open VSLangProj -open System.ComponentModel.Composition.Primitives -open Microsoft.VisualStudio.Shell -open System.Collections.Immutable +open Microsoft.VisualStudio.Shell.Interop +open Microsoft.VisualStudio.TextManager.Interop +open VSLangProj /// An additional interface that an IProjectSite object can implement to indicate it has an FSharpProjectOptions /// already available, so we don't have to recreate it @@ -274,7 +271,7 @@ type internal ProjectSitesAndFiles() = if not (isNull project) then for reference in project.ProjectReferences do let project = workspace.CurrentSolution.GetProject(reference.ProjectId) - if not (isNull project) then + if not (isNull project) && project.Language = LanguageServiceConstants.FSharpLanguageName then let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) let outputPath = referenceProject.BinOutputPath From 0a9c0c13f610d1ca9ba3dcafe8bb1bc66cc9e7dd Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 1 Nov 2017 22:28:03 -0700 Subject: [PATCH 083/150] Remove build fcs from branch dev15.5 --- netci.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netci.groovy b/netci.groovy index ddf51e05e7d..bd222089ceb 100644 --- a/netci.groovy +++ b/netci.groovy @@ -38,7 +38,7 @@ def static getBuildJobName(def configuration, def os) { def buildCommand = ''; def buildFlavor= ''; - if (configuration == "Release_fcs") { + if (configuration == "Release_fcs" && branch != "dev15.5") { // Build and test FCS NuGet package buildPath = "./fcs/" buildFlavor = "" From 15c2b121f2132985a9156a83992f7efba24f6d13 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 1 Nov 2017 22:28:03 -0700 Subject: [PATCH 084/150] Remove build fcs from branch dev15.5 --- netci.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netci.groovy b/netci.groovy index 185ea17a197..c28fde2074b 100644 --- a/netci.groovy +++ b/netci.groovy @@ -38,7 +38,7 @@ def static getBuildJobName(def configuration, def os) { def buildCommand = ''; def buildFlavor= ''; - if (configuration == "Release_fcs") { + if (configuration == "Release_fcs" && branch != "dev15.5") { // Build and test FCS NuGet package buildPath = "./fcs/" buildFlavor = "" From 0da7a646e11852cbc8aa604079ca4396af8d2758 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 1 Nov 2017 23:26:47 -0700 Subject: [PATCH 085/150] Really do nothing --- build.cmd | 7 +++++-- build.sh | 4 ++++ netci.groovy | 19 +++++++++++-------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/build.cmd b/build.cmd index b24937a8647..850d3779cd2 100644 --- a/build.cmd +++ b/build.cmd @@ -4,13 +4,13 @@ rem Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt setlocal enableDelayedExpansion :ARGUMENTS_VALIDATION - -if /I "%1" == "--help" (goto :USAGE) +if /I "%1" == "--help" (goto :USAGE) if /I "%1" == "/help" (goto :USAGE) if /I "%1" == "/h" (goto :USAGE) if /I "%1" == "/?" (goto :USAGE) goto :ARGUMENTS_OK + :USAGE echo Build and run a subset of test suites @@ -49,6 +49,9 @@ goto :success :ARGUMENTS_OK +rem Do no work +if /I "%1" == "none" (goto :success) + rem disable setup build by setting FSC_BUILD_SETUP=0 if /i "%FSC_BUILD_SETUP%" == "" (set FSC_BUILD_SETUP=1) diff --git a/build.sh b/build.sh index 6c3323a4f9b..a6dbef8aa63 100755 --- a/build.sh +++ b/build.sh @@ -64,6 +64,10 @@ if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ]; then show_usage_and_exit fi +if [ "$1" = "none" ]; then + exit 0 +fi + # Save directory of the current script -- this is used below to fix up relative paths (if needed). # The directory should have a trailing slash like it does on Windows, to minimize differences between scripts. _scriptdir="$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )/" diff --git a/netci.groovy b/netci.groovy index c28fde2074b..1696dc21b01 100644 --- a/netci.groovy +++ b/netci.groovy @@ -21,6 +21,7 @@ def static getBuildJobName(def configuration, def os) { // Linux configurations = ['Release', 'Release_fcs' ]; } + configurations.each { configuration -> def lowerConfiguration = configuration.toLowerCase() @@ -68,7 +69,7 @@ def static getBuildJobName(def configuration, def os) { build_args = "net40" } else { - build_args = "ci" + build_args = "none" } } @@ -102,13 +103,15 @@ ${buildPath}build.cmd ${buildFlavor} ${build_args}""") Utilities.setMachineAffinity(newJob, os, affinity) Utilities.standardJobSetup(newJob, project, isPullRequest, "*/${branch}") - - Utilities.addArchival(newJob, "tests/TestResults/*.*", "", skipIfNoTestFiles, false) - if (configuration == "Release_fcs") { - Utilities.addArchival(newJob, "Release/fcs/**") - } - else { - Utilities.addArchival(newJob, "${buildFlavor}/**") + + if (build_args == "none") { + Utilities.addArchival(newJob, "tests/TestResults/*.*", "", skipIfNoTestFiles, false) + if (configuration == "Release_fcs") { + Utilities.addArchival(newJob, "Release/fcs/**") + } + else { + Utilities.addArchival(newJob, "${buildFlavor}/**") + } } if (isPullRequest) { Utilities.addGithubPRTriggerForBranch(newJob, branch, "${os} ${configuration} Build") From 94e9a215db8cf3c4d90cb7ef9ee044b01d18e7d0 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Thu, 2 Nov 2017 14:44:43 +0800 Subject: [PATCH 086/150] rollback a error change --- src/fsharp/FSharp.Core/prim-types.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index ceea69f3fdf..36ae18b7ae0 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -3172,7 +3172,7 @@ namespace Microsoft.FSharp.Collections match lst with | _ when i = 0 -> lst | _::t -> loop (i-1) t - | [] -> [] + | [] -> outOfRange() loop n l type List<'T> with From 4b8de46d30f3e34c91dc575e0d966b290c5851d1 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 1 Nov 2017 23:54:04 -0700 Subject: [PATCH 087/150] scripts --- build.cmd | 13 ++++++++++--- build.sh | 13 +++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/build.cmd b/build.cmd index 850d3779cd2..365fac9ccc0 100644 --- a/build.cmd +++ b/build.cmd @@ -49,9 +49,6 @@ goto :success :ARGUMENTS_OK -rem Do no work -if /I "%1" == "none" (goto :success) - rem disable setup build by setting FSC_BUILD_SETUP=0 if /i "%FSC_BUILD_SETUP%" == "" (set FSC_BUILD_SETUP=1) @@ -98,6 +95,10 @@ for %%i in (%BUILD_FSC_DEFAULT%) do ( call :PROCESS_ARG %%i ) REM apply defaults +if /i "%_buildexit%" == "1" ( + exit /B %_buildexitvalue% +) + if /i "%_autoselect%" == "1" ( set BUILD_NET40_FSHARP_CORE=1 set BUILD_NET40=1 @@ -135,6 +136,12 @@ set ARG2=%~2 if "%ARG%" == "1" if "%2" == "" (set ARG=default) if "%2" == "" if not "%ARG%" == "default" goto :EOF +rem Do no work +if /i "%ARG%" == "none" ( + set _buildexit=1 + set _buildexitvalue=0 +) + if /i "%ARG%" == "net40-lib" ( set _autoselect=0 set BUILD_NET40_FSHARP_CORE=1 diff --git a/build.sh b/build.sh index a6dbef8aa63..0f9a55a65d4 100755 --- a/build.sh +++ b/build.sh @@ -64,10 +64,6 @@ if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ]; then show_usage_and_exit fi -if [ "$1" = "none" ]; then - exit 0 -fi - # Save directory of the current script -- this is used below to fix up relative paths (if needed). # The directory should have a trailing slash like it does on Windows, to minimize differences between scripts. _scriptdir="$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )/" @@ -142,6 +138,11 @@ do "nobuild") export BUILD_PHASE=0 ;; + "none") + _autoselect=0 + export _buildexit=1 + export _buildexitVALUE=0 + ;; "all") _autoselect=0 export BUILD_PROTO=1 @@ -324,6 +325,10 @@ do esac done +if [ $_buildexit -eq 1 ]; then + exit $_buildexitvalue +fi + # Apply defaults, if necessary. if [ $_autoselect -eq 1 ]; then export BUILD_NET40=1 From ebd20ded5f9ef1993282ad2a403032c387742976 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 2 Nov 2017 00:02:09 -0700 Subject: [PATCH 088/150] No test files when building none --- netci.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netci.groovy b/netci.groovy index 1696dc21b01..1b7f7d39dd6 100644 --- a/netci.groovy +++ b/netci.groovy @@ -104,7 +104,7 @@ ${buildPath}build.cmd ${buildFlavor} ${build_args}""") Utilities.standardJobSetup(newJob, project, isPullRequest, "*/${branch}") - if (build_args == "none") { + if (build_args != "none") { Utilities.addArchival(newJob, "tests/TestResults/*.*", "", skipIfNoTestFiles, false) if (configuration == "Release_fcs") { Utilities.addArchival(newJob, "Release/fcs/**") From 41111ac869a40eeeb2bd6acc57a6847e14885d54 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 2 Nov 2017 11:19:28 -0700 Subject: [PATCH 089/150] remove MyGet package publishing It's instead being added as a separate step in our official build. --- build.cmd | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/build.cmd b/build.cmd index ff834797bde..6401d93ca53 100644 --- a/build.cmd +++ b/build.cmd @@ -78,9 +78,6 @@ set TEST_VS_IDEUNIT_SUITE=0 set INCLUDE_TEST_SPEC_NUNIT= set INCLUDE_TEST_TAGS= -set PUBLISH_VSIX=0 -set MYGET_APIKEY= - REM ------------------ Parse all arguments ----------------------- set _autoselect=1 @@ -206,7 +203,6 @@ if /i "%ARG%" == "microbuild" ( set TEST_CORECLR_FSHARP_SUITE=0 set TEST_VS_IDEUNIT_SUITE=1 set CI=1 - set PUBLISH_VSIX=1 REM redirecting TEMP directories set TEMP=%~dp0%BUILD_CONFIG%\TEMP @@ -375,10 +371,6 @@ if /i "%ARG%" == "init" ( set BUILD_PROTO_WITH_CORECLR_LKG=1 ) -if /i [%ARG:~0,13%] == [MYGET_APIKEY:] ( - set MYGET_APIKEY=%ARG:~13% -) - goto :EOF :: Note: "goto :EOF" returns from an in-batchfile "call" command :: in preference to returning from the entire batch file. @@ -402,12 +394,6 @@ if /i "%PB_SKIPTESTS%" == "true" ( set TEST_VS_IDEUNIT_SUITE=0 ) -REM MyGet packages published as part of the build are only for nightly dogfooding, so any other value means publishing should be skipped -REM The official build definition sets PB_PUBLISHTYPE to "myget" by default. -if /i not "%PB_PUBLISHTYPE%" == "myget" ( - set PUBLISH_VSIX=0 -) - echo Build/Tests configuration: echo. echo BUILD_PROTO=%BUILD_PROTO% @@ -424,7 +410,6 @@ echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo. echo PB_SKIPTESTS=%PB_SKIPTESTS% -echo PB_PUBLISHTYPE=%PB_PUBLISHTYPE% echo. echo TEST_NET40_COMPILERUNIT_SUITE=%TEST_NET40_COMPILERUNIT_SUITE% echo TEST_NET40_COREUNIT_SUITE=%TEST_NET40_COREUNIT_SUITE% @@ -435,8 +420,6 @@ echo TEST_CORECLR_FSHARP_SUITE=%TEST_CORECLR_FSHARP_SUITE% echo TEST_VS_IDEUNIT_SUITE=%TEST_VS_IDEUNIT_SUITE% echo INCLUDE_TEST_SPEC_NUNIT=%INCLUDE_TEST_SPEC_NUNIT% echo INCLUDE_TEST_TAGS=%INCLUDE_TEST_TAGS% -echo PUBLISH_VSIX=%PUBLISH_VSIX% -echo MYGET_APIKEY=%MYGET_APIKEY% echo TEMP=%TEMP% :: load Visual Studio 2017 developer command prompt if VS150COMNTOOLS is not set @@ -953,17 +936,6 @@ if "%TEST_VS_IDEUNIT_SUITE%" == "1" ( ) ) -REM ---------------- publish-vsix ----------------------- - -if "%PUBLISH_VSIX%" == "1" ( - if not "%MYGET_APIKEY%" == "" ( - powershell -noprofile -executionPolicy ByPass -file "%~dp0setup\publish-assets.ps1" -binariesPath "%~dp0%BUILD_CONFIG%" -branchName "%BUILD_SOURCEBRANCH%" -apiKey "%MYGET_APIKEY%" - if errorlevel 1 goto :failure - ) else ( - echo No MyGet API key specified, skipping package publish. - ) -) - goto :success REM ------ exit ------------------------------------- :failure From 6b4a0bd74fd22be50bded5b17dab5a4ea1e9593f Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 2 Nov 2017 14:59:37 -0700 Subject: [PATCH 090/150] use a stable up-to-date version of MSBuild --- build.cmd | 38 +------------------------------------- packages.config | 1 + 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/build.cmd b/build.cmd index ff834797bde..8f0a80e6c2b 100644 --- a/build.cmd +++ b/build.cmd @@ -500,43 +500,7 @@ if "%RestorePackages%"=="" ( @call src\update.cmd signonly -:: Check prerequisites -if not "%VisualStudioVersion%" == "" goto vsversionset -if exist "%VS150COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=15.0 -if not "%VisualStudioVersion%" == "" goto vsversionset - -if not "%VisualStudioVersion%" == "" goto vsversionset -if exist "%VS150COMNTOOLS%\..\..\ide\devenv.exe" set VisualStudioVersion=15.0 -if not "%VisualStudioVersion%" == "" goto vsversionset - -if exist "%VS140COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=14.0 -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 -if exist "%ProgramFiles%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 -if not "%VisualStudioVersion%" == "" goto vsversionset - -if exist "%VS120COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=12.0 -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 -if exist "%ProgramFiles%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 - -:vsversionset -if "%VisualStudioVersion%" == "" echo Error: Could not find an installation of Visual Studio && goto :failure - -if exist "%VS150COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" ( - set _msbuildexe="%VS150COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" - goto :havemsbuild -) -if exist "%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( - set _msbuildexe="%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" - goto :havemsbuild -) -if exist "%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( - set _msbuildexe="%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" - goto :havemsbuild -) -echo Error: Could not find MSBuild.exe. && goto :failure -goto :eof - -:havemsbuild +set _msbuildexe=%~dp0packages\RoslynTools.MSBuild.0.4.0-alpha\tools\msbuild\MSBuild.exe set _nrswitch=/nr:false :: See diff --git a/packages.config b/packages.config index ff5ad0ff98d..df8853ab791 100644 --- a/packages.config +++ b/packages.config @@ -10,6 +10,7 @@ + From 9fadedb474f27d0d4699f2715e437f3bf4b7a48a Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 2 Nov 2017 14:37:33 -0700 Subject: [PATCH 091/150] enable publishing NuGet packages to an Azure Blob feed --- PublishToBlob.proj | 29 +++++++++++++++++++++++++++++ packages.config | 3 +++ 2 files changed, 32 insertions(+) create mode 100644 PublishToBlob.proj diff --git a/PublishToBlob.proj b/PublishToBlob.proj new file mode 100644 index 00000000000..9d071710a0e --- /dev/null +++ b/PublishToBlob.proj @@ -0,0 +1,29 @@ + + + + + + Microsoft.DotNet.Build.Tasks.Feed + + 1.0.0-prerelease-02121-01 + + + + + + + + + + + + + diff --git a/packages.config b/packages.config index ff5ad0ff98d..84cd4ec98f5 100644 --- a/packages.config +++ b/packages.config @@ -11,6 +11,9 @@ + + + From 651b6d67f58ce172087df2998f774f9df9577d9c Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 2 Nov 2017 18:20:20 -0700 Subject: [PATCH 092/150] Revert "Make cross language project references work when references are built" This reverts commit 87c4f5e0aa5cb8312c75f1c6d09d02a2a3ef8073. --- .../LanguageService/LanguageService.fs | 10 ++++----- .../FSharp.LanguageService.fsproj | 1 - .../LanguageServiceConstants.fs | 10 --------- .../ProjectSitesAndFiles.fs | 21 +++++++++++-------- 4 files changed, 17 insertions(+), 25 deletions(-) delete mode 100644 vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index bbb1a00524a..4e7757eb588 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -35,7 +35,7 @@ open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.ComponentModelHost -/// Exposes FSharpChecker as MEF export +// Exposes FSharpChecker as MEF export [); Composition.Shared>] type internal FSharpCheckerProvider [] @@ -82,10 +82,10 @@ type internal FSharpCheckerProvider /// Exposes FCS FSharpProjectOptions information management as MEF component. -/// -/// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. -/// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). -/// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. +// +// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. +// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). +// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. [); Composition.Shared>] type internal FSharpProjectOptionsManager [] diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 5ac5900f574..22c3f49cf78 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -67,7 +67,6 @@ Microsoft.VisualStudio.FSharp.LanguageService.Strings - diff --git a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs deleted file mode 100644 index b64d0405948..00000000000 --- a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace Microsoft.VisualStudio.FSharp.LanguageService - -[] -module internal LanguageServiceConstants = - - /// "F#" - [] - let FSharpLanguageName = "F#" diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index f5abc9eca30..22ea0db0107 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -34,20 +34,23 @@ module internal rec Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open System open System.Collections.Concurrent -open System.Diagnostics +open System.ComponentModel.Composition open System.IO - -open Microsoft.CodeAnalysis +open System.Diagnostics +open Microsoft.VisualStudio +open Microsoft.VisualStudio.TextManager.Interop +open Microsoft.VisualStudio.Shell.Interop open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.VisualStudio -open Microsoft.VisualStudio.FSharp.LanguageService +open Microsoft.CodeAnalysis +open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList -open Microsoft.VisualStudio.Shell.Interop -open Microsoft.VisualStudio.TextManager.Interop - open VSLangProj +open System.ComponentModel.Composition.Primitives +open Microsoft.VisualStudio.Shell +open System.Collections.Immutable + /// An additional interface that an IProjectSite object can implement to indicate it has an FSharpProjectOptions /// already available, so we don't have to recreate it @@ -271,7 +274,7 @@ type internal ProjectSitesAndFiles() = if not (isNull project) then for reference in project.ProjectReferences do let project = workspace.CurrentSolution.GetProject(reference.ProjectId) - if not (isNull project) && project.Language = LanguageServiceConstants.FSharpLanguageName then + if not (isNull project) then let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) let outputPath = referenceProject.BinOutputPath From 2a505944e706778299a7583bf6388be4de061d03 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 2 Nov 2017 19:40:43 -0700 Subject: [PATCH 093/150] Enable reference to prebuilt c# projects --- .../FSharp.LanguageService.fsproj | 1 + .../FSharp.LanguageService/LanguageServiceConstants.fs | 10 ++++++++++ .../src/FSharp.LanguageService/ProjectSitesAndFiles.fs | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 22c3f49cf78..5ac5900f574 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -67,6 +67,7 @@ Microsoft.VisualStudio.FSharp.LanguageService.Strings + diff --git a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs new file mode 100644 index 00000000000..b64d0405948 --- /dev/null +++ b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.LanguageService + +[] +module internal LanguageServiceConstants = + + /// "F#" + [] + let FSharpLanguageName = "F#" diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 22ea0db0107..44d8a7b6d55 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -274,7 +274,7 @@ type internal ProjectSitesAndFiles() = if not (isNull project) then for reference in project.ProjectReferences do let project = workspace.CurrentSolution.GetProject(reference.ProjectId) - if not (isNull project) then + if not (isNull project) && (project.Language = LanguageServiceConstants.FSharpLanguageName) then let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) let outputPath = referenceProject.BinOutputPath From 619fa47b0894dd1e97f321ef47876c43c2da0402 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 2 Nov 2017 19:45:30 -0700 Subject: [PATCH 094/150] Revert "Make cross language project references work when references are built" This reverts commit 87c4f5e0aa5cb8312c75f1c6d09d02a2a3ef8073. --- .../LanguageService/LanguageService.fs | 10 ++++----- .../FSharp.LanguageService.fsproj | 1 - .../LanguageServiceConstants.fs | 10 --------- .../ProjectSitesAndFiles.fs | 21 +++++++++++-------- 4 files changed, 17 insertions(+), 25 deletions(-) delete mode 100644 vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index bbb1a00524a..4e7757eb588 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -35,7 +35,7 @@ open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.ComponentModelHost -/// Exposes FSharpChecker as MEF export +// Exposes FSharpChecker as MEF export [); Composition.Shared>] type internal FSharpCheckerProvider [] @@ -82,10 +82,10 @@ type internal FSharpCheckerProvider /// Exposes FCS FSharpProjectOptions information management as MEF component. -/// -/// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. -/// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). -/// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. +// +// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. +// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). +// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. [); Composition.Shared>] type internal FSharpProjectOptionsManager [] diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 5ac5900f574..22c3f49cf78 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -67,7 +67,6 @@ Microsoft.VisualStudio.FSharp.LanguageService.Strings - diff --git a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs deleted file mode 100644 index b64d0405948..00000000000 --- a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace Microsoft.VisualStudio.FSharp.LanguageService - -[] -module internal LanguageServiceConstants = - - /// "F#" - [] - let FSharpLanguageName = "F#" diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index f5abc9eca30..22ea0db0107 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -34,20 +34,23 @@ module internal rec Microsoft.VisualStudio.FSharp.LanguageService.SiteProvider open System open System.Collections.Concurrent -open System.Diagnostics +open System.ComponentModel.Composition open System.IO - -open Microsoft.CodeAnalysis +open System.Diagnostics +open Microsoft.VisualStudio +open Microsoft.VisualStudio.TextManager.Interop +open Microsoft.VisualStudio.Shell.Interop open Microsoft.FSharp.Compiler.SourceCodeServices -open Microsoft.VisualStudio -open Microsoft.VisualStudio.FSharp.LanguageService +open Microsoft.CodeAnalysis +open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList -open Microsoft.VisualStudio.Shell.Interop -open Microsoft.VisualStudio.TextManager.Interop - open VSLangProj +open System.ComponentModel.Composition.Primitives +open Microsoft.VisualStudio.Shell +open System.Collections.Immutable + /// An additional interface that an IProjectSite object can implement to indicate it has an FSharpProjectOptions /// already available, so we don't have to recreate it @@ -271,7 +274,7 @@ type internal ProjectSitesAndFiles() = if not (isNull project) then for reference in project.ProjectReferences do let project = workspace.CurrentSolution.GetProject(reference.ProjectId) - if not (isNull project) && project.Language = LanguageServiceConstants.FSharpLanguageName then + if not (isNull project) then let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) let outputPath = referenceProject.BinOutputPath From e2151dd5de33d6d12b7bad30056f1089c8e732e8 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 2 Nov 2017 20:03:23 -0700 Subject: [PATCH 095/150] Enable F# - C# project support --- .../FSharp.LanguageService.fsproj | 1 + .../FSharp.LanguageService/LanguageServiceConstants.fs | 10 ++++++++++ .../src/FSharp.LanguageService/ProjectSitesAndFiles.fs | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 22c3f49cf78..5ac5900f574 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -67,6 +67,7 @@ Microsoft.VisualStudio.FSharp.LanguageService.Strings + diff --git a/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs new file mode 100644 index 00000000000..b64d0405948 --- /dev/null +++ b/vsintegration/src/FSharp.LanguageService/LanguageServiceConstants.fs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.LanguageService + +[] +module internal LanguageServiceConstants = + + /// "F#" + [] + let FSharpLanguageName = "F#" diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 22ea0db0107..cc6e220d661 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -274,7 +274,7 @@ type internal ProjectSitesAndFiles() = if not (isNull project) then for reference in project.ProjectReferences do let project = workspace.CurrentSolution.GetProject(reference.ProjectId) - if not (isNull project) then + if not (isNull project) && project.Language = LanguageServiceConstants.FSharpLanguageName then let siteProvider = provideProjectSiteProvider (workspace, project, serviceProvider, projectOptionsTable) let referenceProject = workspace.ProjectTracker.GetProject(reference.ProjectId) let outputPath = referenceProject.BinOutputPath From 61660da0a399a3cdf1bcf77442c7ea42ab9a03fe Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 2 Nov 2017 15:51:55 -0700 Subject: [PATCH 096/150] enable additional NuGet restore sources to be passed in --- build.cmd | 14 ++++++++++---- build.sh | 13 +++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/build.cmd b/build.cmd index ff834797bde..47f469e470b 100644 --- a/build.cmd +++ b/build.cmd @@ -570,18 +570,24 @@ if "%RestorePackages%" == "true" ( cd.. @if ERRORLEVEL 1 echo Error: Paket restore failed && goto :failure - %_ngenexe% install %_nugetexe% /nologo + %_ngenexe% install %_nugetexe% /nologo + set _nugetoptions=-PackagesDirectory packages -ConfigFile %_nugetconfig% + if not "%PB_RESTORESOURCE%" == "" ( + set _nugetoptions=!_nugetoptions! -Source %PB_RESTORESOURCE% + ) + + echo _nugetoptions=!_nugetoptions! - %_nugetexe% restore packages.config -PackagesDirectory packages -ConfigFile %_nugetconfig% + %_nugetexe% restore packages.config !_nugetoptions! @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure if "%BUILD_VS%" == "1" ( - %_nugetexe% restore vsintegration\packages.config -PackagesDirectory packages -ConfigFile %_nugetconfig% + %_nugetexe% restore vsintegration\packages.config !_nugetoptions! @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure ) if "%BUILD_SETUP%" == "1" ( - %_nugetexe% restore setup\packages.config -PackagesDirectory packages -ConfigFile %_nugetconfig% + %_nugetexe% restore setup\packages.config !_nugetoptions! @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure ) ) diff --git a/build.sh b/build.sh index 214248bcbd2..51f1715cc97 100755 --- a/build.sh +++ b/build.sh @@ -432,21 +432,26 @@ if [ "${RestorePackages:-true}" = 'true' ]; then if [ $exit_code -ne 0 ]; then exit $exit_code fi - - eval "$_nugetexe restore packages.config -PackagesDirectory packages -ConfigFile $_nugetconfig" + + _nugetoptions="-PackagesDirectory packages -ConfigFile $_nugetconfig" + if [ "$PB_RESTORESOURCE" != "" ]; then + _nugetoptions="$_nugetoptions -Source $PB_RESTORESOURCE" + fi + + eval "$_nugetexe restore packages.config $_nugetoptions" if [ $? -ne 0 ]; then failwith "Nuget restore failed" fi if [ "$BUILD_VS" = '1' ]; then - eval "$_nugetexe restore vsintegration/packages.config -PackagesDirectory packages -ConfigFile $_nugetconfig" + eval "$_nugetexe restore vsintegration/packages.config $_nugetoptions" if [ $? -ne 0 ]; then failwith "Nuget restore failed" fi fi if [ "$BUILD_SETUP" = '1' ]; then - eval "$_nugetexe restore setup/packages.config -PackagesDirectory packages -ConfigFile $_nugetconfig" + eval "$_nugetexe restore setup/packages.config $_nugetoptions" if [ $? -ne 0 ]; then failwith "Nuget restore failed" fi From 5165d13c9af78c43eee449da408c1b2b17ac05e1 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Sat, 4 Nov 2017 02:27:34 -0700 Subject: [PATCH 097/150] Remove portable library templates --- .../NetCore259Project.csproj | 69 ----------------- .../Template/AssemblyInfo.fs | 35 --------- .../NETCore259PortableLibrary.vstemplate | 32 -------- .../Template/PortableLibrary.fsproj | 68 ----------------- .../Template/PortableLibrary1.fs | 4 - .../NetCore259Project/Template/Script.fsx | 6 -- .../NetCore78Project/NetCore78Project.csproj | 61 --------------- .../NetCore78Project/Template/AssemblyInfo.fs | 35 --------- .../NETCore78PortableLibrary.vstemplate | 32 -------- .../Template/PortableLibrary.fsproj | 68 ----------------- .../Template/PortableLibrary1.fs | 4 - .../NetCore78Project/Template/Script.fsx | 6 -- .../NetCoreProject/NetCoreProject.csproj | 68 ----------------- .../NetCoreProject/Template/AssemblyInfo.fs | 35 --------- .../NETCore7PortableLibrary.vstemplate | 32 -------- .../Template/PortableLibrary.fsproj | 68 ----------------- .../Template/PortableLibrary1.fs | 4 - .../NetCoreProject/Template/Script.fsx | 6 -- .../PortableLibraryProject.csproj | 61 --------------- .../Template/AssemblyInfo.fs | 35 --------- .../Template/PortableLibrary.fsproj | 76 ------------------- .../Template/PortableLibrary.vstemplate | 32 -------- .../Template/PortableLibrary1.fs | 4 - .../Template/Script.fsx | 6 -- .../Source.extension.vsixmanifest | 4 - .../VisualFSharpOpenSource.csproj | 32 -------- .../Source.extension.vsixmanifest | 4 - .../VisualFSharpTemplates.csproj | 32 -------- ...vsintegration-project-templates-build.proj | 4 - 29 files changed, 923 deletions(-) delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/AssemblyInfo.fs delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary1.fs delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/Script.fsx delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/AssemblyInfo.fs delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary1.fs delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/Script.fsx delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/AssemblyInfo.fs delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary1.fs delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/Script.fsx delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/AssemblyInfo.fs delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary1.fs delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/Script.fsx diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj deleted file mode 100644 index 8075167e5be..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\..\..\src - NetCore259Project - ProjectTemplates - true - true - false - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - false - false - false - false - false - false - false - false - false - {D9D95330-3626-4199-B7AF-17B8E4AF6D87} - - - - Debug - net40 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\$(TemplateCategory)\$(AssemblyName) - - - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci - false - false - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/AssemblyInfo.fs b/vsintegration/ProjectTemplates/NetCore259Project/Template/AssemblyInfo.fs deleted file mode 100644 index d4f0ec0fc43..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace $safeprojectname$.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/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate deleted file mode 100644 index 40a686a3236..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - Microsoft.FSharp.NETCore259PortableLibrary - FSharp - 4.5 - 1 - true - PortableLibrary - true - true - - - - AssemblyInfo.fs - PortableLibrary1.fs - Script.fsx - - - - NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - NuGet.VisualStudio.TemplateWizard - - - - - - - diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj deleted file mode 100644 index 14c55f91353..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - $guid1$ - Library - $safeprojectname$ - $safeprojectname$ - v4.5 - Profile259 - netcore - 3.259.41.0 - true - true - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - - - - - 12 - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary1.fs b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary1.fs deleted file mode 100644 index c8a8cd1b462..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace $safeprojectname$ - -type Class1() = - member this.X = "F#" diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/Script.fsx b/vsintegration/ProjectTemplates/NetCore259Project/Template/Script.fsx deleted file mode 100644 index 82377f6da43..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/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 $safeprojectname$ - diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj deleted file mode 100644 index b8bd4d18b0d..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\..\..\src - NetCore78Project - ProjectTemplates - true - true - false - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - false - false - false - false - false - false - false - false - false - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} - - - - Debug - net40 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\$(TemplateCategory)\$(AssemblyName) - - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci - false - false - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci - false - false - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/AssemblyInfo.fs b/vsintegration/ProjectTemplates/NetCore78Project/Template/AssemblyInfo.fs deleted file mode 100644 index d4f0ec0fc43..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace $safeprojectname$.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/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate deleted file mode 100644 index bea03c28446..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - Microsoft.FSharp.NETCore78PortableLibrary - FSharp - 4.5 - 1 - true - PortableLibrary - true - true - - - - AssemblyInfo.fs - PortableLibrary1.fs - Script.fsx - - - - NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - NuGet.VisualStudio.TemplateWizard - - - - - - - diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj deleted file mode 100644 index a2dbe62ee0a..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - $guid1$ - Library - $safeprojectname$ - $safeprojectname$ - v4.5 - Profile78 - netcore - 3.78.41.0 - true - true - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - - - - - 12 - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary1.fs b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary1.fs deleted file mode 100644 index c8a8cd1b462..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace $safeprojectname$ - -type Class1() = - member this.X = "F#" diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/Script.fsx b/vsintegration/ProjectTemplates/NetCore78Project/Template/Script.fsx deleted file mode 100644 index 82377f6da43..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/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 $safeprojectname$ - diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj deleted file mode 100644 index 353e40e2371..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\..\..\src - NetCoreProject - ProjectTemplates - true - true - false - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - false - false - false - false - false - false - false - false - false - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} - - - - Debug - net40 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\$(TemplateCategory)\$(AssemblyName) - - - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci - false - false - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci - false - false - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/AssemblyInfo.fs b/vsintegration/ProjectTemplates/NetCoreProject/Template/AssemblyInfo.fs deleted file mode 100644 index d4f0ec0fc43..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace $safeprojectname$.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/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate deleted file mode 100644 index cbe5d2d8798..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - Microsoft.FSharp.NETCore7PortableLibrary - FSharp - 4.5 - 1 - true - PortableLibrary - true - true - - - - AssemblyInfo.fs - PortableLibrary1.fs - Script.fsx - - - - NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - NuGet.VisualStudio.TemplateWizard - - - - - - - diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj deleted file mode 100644 index 9fffc5eed06..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - $guid1$ - Library - $safeprojectname$ - $safeprojectname$ - v4.5 - Profile7 - netcore - 3.7.41.0 - true - true - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - - - - - 12 - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary1.fs b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary1.fs deleted file mode 100644 index c8a8cd1b462..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace $safeprojectname$ - -type Class1() = - member this.X = "F#" diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/Script.fsx b/vsintegration/ProjectTemplates/NetCoreProject/Template/Script.fsx deleted file mode 100644 index 82377f6da43..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/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 $safeprojectname$ - diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj deleted file mode 100644 index 728746d55ef..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\..\..\src - PortableLibraryProject - ProjectTemplates - true - true - false - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - false - false - false - false - false - false - false - false - false - {DB374A0C-7560-479F-9B21-D37C81F7624F} - - - Debug - net40 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\$(TemplateCategory)\$(AssemblyName) - - - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci - false - false - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci - false - false - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/AssemblyInfo.fs b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/AssemblyInfo.fs deleted file mode 100644 index d4f0ec0fc43..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace $safeprojectname$.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/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj deleted file mode 100644 index 331ff81e6ac..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - $guid1$ - Library - $safeprojectname$ - $safeprojectname$ - v4.0 - Profile47 - 3.47.41.0 - true - true - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETPortable\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.3.1\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.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 - - - - - - diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate deleted file mode 100644 index 6c3001420cc..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - Microsoft.FSharp.PortableLibrary - FSharp - 4.0 - 1 - true - PortableLibrary - true - true - - - - AssemblyInfo.fs - PortableLibrary1.fs - Script.fsx - - - - NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - NuGet.VisualStudio.TemplateWizard - - - - - - - diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary1.fs b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary1.fs deleted file mode 100644 index c8a8cd1b462..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace $safeprojectname$ - -type Class1() = - member this.X = "F#" diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/Script.fsx b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/Script.fsx deleted file mode 100644 index 82377f6da43..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/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 $safeprojectname$ - diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest index c60aa24979a..86a241cedbd 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest @@ -43,10 +43,6 @@ - - - - diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj index c0bd76dc751..7456816be95 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj +++ b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj @@ -278,38 +278,6 @@ false True - - {d9d95330-3626-4199-b7af-17b8e4af6d87} - NetCore259Project - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {1a8dbf70-4178-4ae3-af5f-39ddd5692210} - NetCore78Project - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {5b739cf3-1116-4eb4-b598-6c16bea81ce5} - NetCoreProject - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {db374a0c-7560-479f-9b21-d37c81f7624f} - PortableLibraryProject - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - {2facee44-48bd-40b5-a2ee-b54a0c9bb7c4} TutorialProject diff --git a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest index df362dcf4d4..3d17751f813 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpTemplates/Source.extension.vsixmanifest @@ -16,10 +16,6 @@ - - - - diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index a40934de4a6..f9835d36fb1 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -108,38 +108,6 @@ false True - - {d9d95330-3626-4199-b7af-17b8e4af6d87} - NetCore259Project - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {1a8dbf70-4178-4ae3-af5f-39ddd5692210} - NetCore78Project - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {5b739cf3-1116-4eb4-b598-6c16bea81ce5} - NetCoreProject - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - - - {db374a0c-7560-479f-9b21-d37c81f7624f} - PortableLibraryProject - ProjectTemplates - TemplateProjectOutputGroup%3b - false - True - {2facee44-48bd-40b5-a2ee-b54a0c9bb7c4} TutorialProject diff --git a/vsintegration/fsharp-vsintegration-project-templates-build.proj b/vsintegration/fsharp-vsintegration-project-templates-build.proj index 4c657e693d7..d810cea4de3 100644 --- a/vsintegration/fsharp-vsintegration-project-templates-build.proj +++ b/vsintegration/fsharp-vsintegration-project-templates-build.proj @@ -7,10 +7,6 @@ - - - - From c28a5cbfbbb0849778735ba370723f5069f77baf Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Sat, 4 Nov 2017 12:03:51 -0700 Subject: [PATCH 098/150] report the value of PB_RESTORESOURCE --- build.cmd | 1 + build.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/build.cmd b/build.cmd index 56a8bc738ea..5bba28c3967 100644 --- a/build.cmd +++ b/build.cmd @@ -410,6 +410,7 @@ echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo. echo PB_SKIPTESTS=%PB_SKIPTESTS% +echo PB_RESTORESOURCE=%PB_RESTORESOURCE% echo. echo TEST_NET40_COMPILERUNIT_SUITE=%TEST_NET40_COMPILERUNIT_SUITE% echo TEST_NET40_COREUNIT_SUITE=%TEST_NET40_COREUNIT_SUITE% diff --git a/build.sh b/build.sh index 51f1715cc97..a0cf1193619 100755 --- a/build.sh +++ b/build.sh @@ -380,6 +380,8 @@ printf "BUILD_CONFIG=%s\n" "$BUILD_CONFIG" printf "BUILD_PUBLICSIGN=%s\n" "$BUILD_PUBLICSIGN" printf "\n" printf "PB_SKIPTESTS=%s\n" "$PB_SKIPTESTS" +printf "PB_RESTORESOURCE=%s\n" "$PB_RESTORESOURCE" +printf "\n" printf "TEST_NET40_COMPILERUNIT_SUITE=%s\n" "$TEST_NET40_COMPILERUNIT_SUITE" printf "TEST_NET40_COREUNIT_SUITE=%s\n" "$TEST_NET40_COREUNIT_SUITE" printf "TEST_NET40_FSHARP_SUITE=%s\n" "$TEST_NET40_FSHARP_SUITE" From 2afdda0f245fab8c8b8ba1a32ff8c552da9d9623 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Sat, 4 Nov 2017 19:28:02 -0700 Subject: [PATCH 099/150] Revert "use a stable up-to-date version of MSBuild" This reverts commit 6b4a0bd74fd22be50bded5b17dab5a4ea1e9593f. --- build.cmd | 38 +++++++++++++++++++++++++++++++++++++- packages.config | 1 - 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 5bba28c3967..ad5258a044e 100644 --- a/build.cmd +++ b/build.cmd @@ -484,7 +484,43 @@ if "%RestorePackages%"=="" ( @call src\update.cmd signonly -set _msbuildexe=%~dp0packages\RoslynTools.MSBuild.0.4.0-alpha\tools\msbuild\MSBuild.exe +:: Check prerequisites +if not "%VisualStudioVersion%" == "" goto vsversionset +if exist "%VS150COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=15.0 +if not "%VisualStudioVersion%" == "" goto vsversionset + +if not "%VisualStudioVersion%" == "" goto vsversionset +if exist "%VS150COMNTOOLS%\..\..\ide\devenv.exe" set VisualStudioVersion=15.0 +if not "%VisualStudioVersion%" == "" goto vsversionset + +if exist "%VS140COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=14.0 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 +if exist "%ProgramFiles%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 +if not "%VisualStudioVersion%" == "" goto vsversionset + +if exist "%VS120COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=12.0 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 +if exist "%ProgramFiles%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 + +:vsversionset +if "%VisualStudioVersion%" == "" echo Error: Could not find an installation of Visual Studio && goto :failure + +if exist "%VS150COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" ( + set _msbuildexe="%VS150COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" + goto :havemsbuild +) +if exist "%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( + set _msbuildexe="%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" + goto :havemsbuild +) +if exist "%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( + set _msbuildexe="%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" + goto :havemsbuild +) +echo Error: Could not find MSBuild.exe. && goto :failure +goto :eof + +:havemsbuild set _nrswitch=/nr:false :: See diff --git a/packages.config b/packages.config index afc993a4197..84cd4ec98f5 100644 --- a/packages.config +++ b/packages.config @@ -10,7 +10,6 @@ - From 578db478dbcefd7194121ac5ccf6844387377eab Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 6 Nov 2017 07:31:57 +0300 Subject: [PATCH 100/150] Use UTC timestamps in the compiler and service (#3889) * Use UTC timestamps in compiler and service * Fix tests --- src/absil/il.fs | 4 +- src/absil/illib.fs | 5 +- src/absil/ilread.fs | 2 +- src/fsharp/CompileOps.fs | 2 +- .../FSharp.Build/FSharpEmbedResXSource.fs | 2 +- .../FSharp.Build/FSharpEmbedResourceText.fs | 4 +- .../Microsoft.FSharp.Control/AsyncModule.fs | 6 +- src/fsharp/vs/IncrementalBuild.fs | 4 +- .../AttributeUsage/AssemblyVersion03.fs | 4 +- .../AttributeUsage/AssemblyVersion04.fs | 2 +- tests/service/MultiProjectAnalysisTests.fs | 12 +-- .../src/FSharp.LanguageService.Base/Source.cs | 2 +- .../Project/ProjectNode.cs | 2 +- .../FSharp.ProjectSystem.FSharp/Project.fs | 4 +- vsintegration/tests/Salsa/salsa.fs | 2 +- .../Tests.LanguageService.IncrementalBuild.fs | 84 +++++++++---------- .../unittests/Tests.ProjectSystem.UpToDate.fs | 24 +++--- 17 files changed, 84 insertions(+), 81 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 22e7a396a5d..1bed3442a9b 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -3656,7 +3656,7 @@ let computeILRefs modul = { AssemblyReferences = Seq.fold (fun acc x -> x::acc) [] s.refsA ModuleReferences = Seq.fold (fun acc x -> x::acc) [] s.refsM } -let tspan = System.TimeSpan(System.DateTime.Now.Ticks - System.DateTime(2000,1,1).Ticks) +let tspan = System.TimeSpan(System.DateTime.UtcNow.Ticks - System.DateTime(2000,1,1).Ticks) let parseILVersion (vstr : string) = // matches "v1.2.3.4" or "1.2.3.4". Note, if numbers are missing, returns -1 (not 0). @@ -3667,7 +3667,7 @@ let parseILVersion (vstr : string) = // account for wildcards if versionComponents.Length > 2 then let defaultBuild = (uint16)tspan.Days % System.UInt16.MaxValue - 1us - let defaultRevision = (uint16)(System.DateTime.Now.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us + let defaultRevision = (uint16)(System.DateTime.UtcNow.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us if versionComponents.[2] = "*" then if versionComponents.Length > 3 then failwith "Invalid version format" diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 79e244402f0..976cc1ac2ea 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -1257,6 +1257,7 @@ module Shim = abstract FileStreamReadShim: fileName:string -> System.IO.Stream abstract FileStreamCreateShim: fileName:string -> System.IO.Stream abstract FileStreamWriteExistingShim: fileName:string -> System.IO.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 @@ -1264,6 +1265,8 @@ module Shim = abstract IsPathRootedShim: path:string -> bool abstract IsInvalidPathShim: filename:string -> bool abstract GetTempPathShim : unit -> string + + /// Utc time of the last modification abstract GetLastWriteTimeShim: fileName:string -> System.DateTime abstract SafeExists: fileName:string -> bool abstract FileDelete: fileName:string -> unit @@ -1303,7 +1306,7 @@ module Shim = member __.GetTempPathShim() = System.IO.Path.GetTempPath() - member __.GetLastWriteTimeShim (fileName:string) = File.GetLastWriteTime fileName + member __.GetLastWriteTimeShim (fileName:string) = File.GetLastWriteTimeUtc fileName member __.SafeExists (fileName:string) = System.IO.File.Exists fileName member __.FileDelete (fileName:string) = System.IO.File.Delete fileName diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 647d30457eb..1b7735b9772 100644 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -3984,7 +3984,7 @@ let OpenILModuleReaderAfterReadingAllBytes infile opts = opts.pdbPath.IsSome), true with e -> System.Diagnostics.Debug.Assert(false, sprintf "Failed to compute key in OpenILModuleReaderAfterReadingAllBytes cache for '%s'. Falling back to uncached." infile) - ("", System.DateTime.Now, ILScopeRef.Local, false), false + ("", System.DateTime.UtcNow, ILScopeRef.Local, false), false let cacheResult = if not succeeded then None // Fall back to uncached. diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 21251bd24e4..0d35f05dc1c 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2460,7 +2460,7 @@ type TcConfigBuilder = isInvalidationSupported = false sqmSessionGuid = None sqmNumOfSourceFiles = 0 - sqmSessionStartedTime = System.DateTime.Now.Ticks + sqmSessionStartedTime = System.DateTime.UtcNow.Ticks emitDebugInfoInQuotations = false exename = None copyFSharpCore = false diff --git a/src/fsharp/FSharp.Build/FSharpEmbedResXSource.fs b/src/fsharp/FSharp.Build/FSharpEmbedResXSource.fs index 1954d8f56cd..0150ef26ec5 100644 --- a/src/fsharp/FSharp.Build/FSharpEmbedResXSource.fs +++ b/src/fsharp/FSharp.Build/FSharpEmbedResXSource.fs @@ -42,7 +42,7 @@ module internal {1} = // simple up-to-date check if File.Exists(resx) && File.Exists(sourcePath) && - File.GetLastWriteTime(resx) <= File.GetLastWriteTime(sourcePath) then + File.GetLastWriteTimeUtc(resx) <= File.GetLastWriteTimeUtc(sourcePath) then printMessage (sprintf "Skipping generation: '%s' since it is up-to-date." sourcePath) Some(sourcePath) else diff --git a/src/fsharp/FSharp.Build/FSharpEmbedResourceText.fs b/src/fsharp/FSharp.Build/FSharpEmbedResourceText.fs index b7d46807c79..3e2e58eddb5 100644 --- a/src/fsharp/FSharp.Build/FSharpEmbedResourceText.fs +++ b/src/fsharp/FSharp.Build/FSharpEmbedResourceText.fs @@ -351,8 +351,8 @@ open Printf if File.Exists(outFilename) && File.Exists(outXmlFilename) && File.Exists(filename) && - File.GetLastWriteTime(filename) <= File.GetLastWriteTime(outFilename) && - File.GetLastWriteTime(filename) <= File.GetLastWriteTime(outXmlFilename) then + File.GetLastWriteTimeUtc(filename) <= File.GetLastWriteTimeUtc(outFilename) && + File.GetLastWriteTimeUtc(filename) <= File.GetLastWriteTimeUtc(outXmlFilename) then printMessage (sprintf "Skipping generation of %s and %s since up-to-date" outFilename outXmlFilename) Some (outFilename, outXmlFilename) else diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs index 6fa946563c8..d0574d52d60 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs @@ -162,7 +162,7 @@ type AsyncModule() = let tickstamps = ref [] // like timestamps but for ticks :) for i = 1 to 10 do - tickstamps := DateTime.Now.Ticks :: !tickstamps + tickstamps := DateTime.UtcNow.Ticks :: !tickstamps do! Async.Sleep(20) return !tickstamps @@ -233,7 +233,7 @@ type AsyncModule() = [] member this.``AwaitWaitHandle.Timeout``() = use waitHandle = new System.Threading.ManualResetEvent(false) - let startTime = DateTime.Now + let startTime = DateTime.UtcNow let r = Async.AwaitWaitHandle(waitHandle, 500) @@ -241,7 +241,7 @@ type AsyncModule() = Assert.IsFalse(r, "Timeout expected") - let endTime = DateTime.Now + let endTime = DateTime.UtcNow let delta = endTime - startTime Assert.IsTrue(delta.TotalMilliseconds < 1100.0, sprintf "Expected faster timeout than %.0f ms" delta.TotalMilliseconds) diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index 56f7113c377..01bfd8d0188 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -463,7 +463,7 @@ module internal IncrementalBuild = /// Bind a set of build rules to a set of input values. let ToBound(buildRules:BuildRules, inputs: BuildInput list) = - let now = DateTime.Now + let now = DateTime.UtcNow let rec applyScalarExpr(se, results) = match se with | ScalarInput(id, n) -> @@ -1191,7 +1191,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let flags, isExe = tcConfig.ComputeCanContainEntryPoint(sourceFiles |> List.map snd) ((sourceFiles, flags) ||> List.map2 (fun (m, nm) flag -> (m, nm, (flag, isExe)))) - let defaultTimeStamp = DateTime.Now + let defaultTimeStamp = DateTime.UtcNow let basicDependencies = [ for (UnresolvedAssemblyReference(referenceText, _)) in unresolvedReferences do diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion03.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion03.fs index 3bf626c591a..379425a04eb 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion03.fs +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion03.fs @@ -7,9 +7,9 @@ do let asm = System.Reflection.Assembly.GetExecutingAssembly().GetName() -let tspan = System.TimeSpan(System.DateTime.Now.Ticks - System.DateTime(2000,1,1).Ticks) +let tspan = System.TimeSpan(System.DateTime.UtcNow.Ticks - System.DateTime(2000,1,1).Ticks) let defaultBuild = (uint16)tspan.Days % System.UInt16.MaxValue - 1us -let defaultRevision = (uint16)(System.DateTime.Now.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us +let defaultRevision = (uint16)(System.DateTime.UtcNow.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us printfn "%s" <| asm.Version.ToString() let success = diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs index f6c9e45164f..87285efcc03 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs @@ -7,7 +7,7 @@ do let asm = System.Reflection.Assembly.GetExecutingAssembly().GetName() -let defaultRevision = (uint16)(System.DateTime.Now.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us +let defaultRevision = (uint16)(System.DateTime.UtcNow.TimeOfDay.TotalSeconds / 2.0) % System.UInt16.MaxValue - 1us printfn "%s" <| asm.Version.ToString() let success = diff --git a/tests/service/MultiProjectAnalysisTests.fs b/tests/service/MultiProjectAnalysisTests.fs index b6adcce2049..aa38fa58457 100644 --- a/tests/service/MultiProjectAnalysisTests.fs +++ b/tests/service/MultiProjectAnalysisTests.fs @@ -499,14 +499,14 @@ let ``Test multi project symbols should pick up changes in dependent projects`` //---------------- Change the file by adding a line, then re-check everything -------------------- - let wt0 = System.DateTime.Now - let wt1 = File.GetLastWriteTime MultiProjectDirty1.fileName1 + 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.GetLastWriteTime 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 @@ -550,13 +550,13 @@ let ``Test multi project symbols should pick up changes in dependent projects`` //---------------- Revert the change to the file -------------------- - let wt0b = System.DateTime.Now - let wt1b = File.GetLastWriteTime MultiProjectDirty1.fileName1 + 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.GetLastWriteTime 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 diff --git a/vsintegration/src/FSharp.LanguageService.Base/Source.cs b/vsintegration/src/FSharp.LanguageService.Base/Source.cs index b3a71299642..79f558a3e73 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/Source.cs +++ b/vsintegration/src/FSharp.LanguageService.Base/Source.cs @@ -163,7 +163,7 @@ internal FSharpSourceBase_DEPRECATED(LanguageService_DEPRECATED service, IVsText this.lastOnIdleRequestDuration = 0; - this.openedTime = System.DateTime.Now; + this.openedTime = System.DateTime.UtcNow; } ~FSharpSourceBase_DEPRECATED() diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs index bf1d827a2ef..e6f28af66f9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs @@ -4163,7 +4163,7 @@ public void SetProjectFileDirty(bool value) this.isDirty = value; if (this.isDirty) { - this.lastModifiedTime = DateTime.Now; + this.lastModifiedTime = DateTime.UtcNow; this.buildIsPrepared = false; } } diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index aeac457a16c..1a4732cf1e5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -1431,7 +1431,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem // Returns an IProjectSite that references "this" to get its information member private x.CreateRunningProjectSite() = - let creationTime = System.DateTime.Now + let creationTime = System.DateTime.UtcNow { new Microsoft.VisualStudio.FSharp.LanguageService.IProjectSite with member __.CompilationSourceFiles = x.CompilationSourceFiles @@ -1473,7 +1473,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem let mutable staticBuildErrorReporter = buildErrorReporter let projFileName = MSBuildProject.GetFullPath(x.BuildProject) let targetFrameworkMoniker = x.GetTargetFrameworkMoniker() - let creationTime = DateTime.Now + let creationTime = DateTime.UtcNow // This object is thread-safe { new Microsoft.VisualStudio.FSharp.LanguageService.IProjectSite with diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index 95e51ca8437..7ca1f8aed1d 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -240,7 +240,7 @@ module internal Salsa = let mutable prevConfig = "" let mutable prevPlatform = "" let GetFlags() = - let newtimestamp = File.GetLastWriteTime(projectfile) + let newtimestamp = File.GetLastWriteTimeUtc(projectfile) let curConfig = configurationFunc() let curPlatform = platformFunc() if timestamp <> newtimestamp diff --git a/vsintegration/tests/unittests/Tests.LanguageService.IncrementalBuild.fs b/vsintegration/tests/unittests/Tests.LanguageService.IncrementalBuild.fs index 24bedca011f..fc233280388 100644 --- a/vsintegration/tests/unittests/Tests.LanguageService.IncrementalBuild.fs +++ b/vsintegration/tests/unittests/Tests.LanguageService.IncrementalBuild.fs @@ -61,7 +61,7 @@ type IncrementalBuild() = let updateStamp = ref true let StampFile _cache _ctok filename = - let result = File.GetLastWriteTime(filename) + let result = File.GetLastWriteTimeUtc(filename) if !updateStamp then // Here, simulate that VS is writing to our file. TouchFile() @@ -79,7 +79,7 @@ type IncrementalBuild() = let bound = buildDesc.GetInitialPartialBuild inputs let DoCertainStep bound = - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) match IncrementalBuild.Step cache ctok save (Target(mapped,None)) bound |> Cancellable.runWithoutCancellation with | Some bound -> bound | None -> failwith "Expected to be able to step" @@ -96,7 +96,7 @@ type IncrementalBuild() = updateStamp:=false bound <- DoCertainStep bound bound <- DoCertainStep bound - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) match IncrementalBuild.Step cache ctok save (Target (mapped, None)) bound |> Cancellable.runWithoutCancellation with | Some bound -> failwith "Build should have stopped" | None -> () @@ -110,7 +110,7 @@ type IncrementalBuild() = let Scan ctok acc filename = eventually { return acc+"-"+filename+"-"+(!mapSuffix) } - let stampAs = ref DateTime.Now + let stampAs = ref DateTime.UtcNow let StampFile _cache _ctok filename = !stampAs @@ -127,7 +127,7 @@ type IncrementalBuild() = printf "-[Step1]----------------------------------------------------------------------------------------\n" // Evaluate the first time. - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save scanned bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (scanned, bound) Assert.AreEqual("AccVal-File1.fs-Suffix1-File2.fs-Suffix1",r.[1]) @@ -135,7 +135,7 @@ type IncrementalBuild() = printf "-[Step2]----------------------------------------------------------------------------------------\n" // Evaluate the second time. No change should be seen. mapSuffix:="Suffix2" - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save scanned bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (scanned,bound) Assert.AreEqual("AccVal-File1.fs-Suffix1-File2.fs-Suffix1",r.[1]) @@ -143,8 +143,8 @@ type IncrementalBuild() = printf "-[Step3]----------------------------------------------------------------------------------------\n" // Evaluate a third time with timestamps updated. Should cause a rebuild System.Threading.Thread.Sleep 10 // Sleep a little to avoid grabbing the same 'Now' - stampAs:=DateTime.Now - let cache = TimeStampCache(System.DateTime.Now) + stampAs:=DateTime.UtcNow + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save scanned bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (scanned,bound) Assert.AreEqual("AccVal-File1.fs-Suffix2-File2.fs-Suffix2",r.[1]) @@ -153,7 +153,7 @@ type IncrementalBuild() = /// Test case of zero elements in a vector [] member public rb.aaZeroElementVector() = // Starts with 'aa' to put it at the front. - let stamp = ref DateTime.Now + let stamp = ref DateTime.UtcNow let Stamp _cache _ctok (s:string) = !stamp let Map ctok (s:string) = s let Demult ctok (a:string[]) = a.Length |> cancellable.Return @@ -171,7 +171,7 @@ type IncrementalBuild() = let inputs1 = [ BuildInput.VectorInput(inputVector, [""]) ] let build1 = buildDesc.GetInitialPartialBuild inputs1 - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let build1Evaled = Eval cache ctok save result build1 |> Cancellable.runWithoutCancellation let r1 = GetScalarResult (result, build1Evaled) match r1 with @@ -179,11 +179,11 @@ type IncrementalBuild() = | None -> failwith "Expected the value 1 to be returned." // Now with zero. This was the original bug. - stamp := DateTime.Now + stamp := DateTime.UtcNow let inputs0 = [ BuildInput.VectorInput(inputVector, []) ] let build0 = buildDesc.GetInitialPartialBuild inputs0 - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let build0Evaled = Eval cache ctok save result build0 |> Cancellable.runWithoutCancellation let r0 = GetScalarResult (result, build0Evaled) match r0 with @@ -196,12 +196,12 @@ type IncrementalBuild() = [] member public rb.MultiplexTransitionUp() = let elements = ref 1 - let timestamp = ref System.DateTime.Now + let timestamp = ref System.DateTime.UtcNow let Input() : string array = [| for i in 1..!elements -> sprintf "Element %d" i |] let Stamp _cache ctok s = !timestamp let Map ctok (s:string) = sprintf "Mapped %s " s let Result ctok (a:string[]) = String.Join(",", a) |> cancellable.Return - let now = System.DateTime.Now + let now = System.DateTime.UtcNow let FixedTimestamp _cache _ctok _ = now let buildDesc = new BuildDescriptionScope() @@ -220,7 +220,7 @@ type IncrementalBuild() = // Evaluate it with value 1 elements := 1 - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save result bound |> Cancellable.runWithoutCancellation let r1 = GetScalarResult(result, bound) match r1 with @@ -230,9 +230,9 @@ type IncrementalBuild() = // Now, re-evaluate it with value 2 elements := 2 System.Threading.Thread.Sleep(100) - timestamp := System.DateTime.Now + timestamp := System.DateTime.UtcNow - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save result bound |> Cancellable.runWithoutCancellation let r2 = GetScalarResult (result, bound) match r2 with @@ -244,7 +244,7 @@ type IncrementalBuild() = [] member public rb.MultiplexTransitionDown() = let elements = ref 1 - let timestamp = ref System.DateTime.Now + let timestamp = ref System.DateTime.UtcNow let Mult(s:string) : string array = [| for i in 1..!elements -> sprintf "Element %d" i |] let Stamp(s) = !timestamp let Map(s:string) = @@ -257,7 +257,7 @@ type IncrementalBuild() = let result = String.Join(",", a) printfn "Result called with %d items returns %s" a.Length result result - let now = System.DateTime.Now + let now = System.DateTime.UtcNow let FixedTimestamp _ = printfn "Fixing timestamp" now @@ -290,7 +290,7 @@ type IncrementalBuild() = // Now, re-evaluate it with value 1 elements := 1 System.Threading.Thread.Sleep(100) - timestamp := System.DateTime.Now + timestamp := System.DateTime.UtcNow let buildDemuxed = Eval demultiplexedInput bound let rdm = GetScalarResult (demultiplexedInput,buildDemuxed) @@ -325,7 +325,7 @@ type IncrementalBuild() = let MapIt ctok filename = filename+"."+(!mapSuffix) - let stampAs = ref DateTime.Now + let stampAs = ref DateTime.UtcNow let StampFile _cache ctok filename = !stampAs @@ -339,7 +339,7 @@ type IncrementalBuild() = printf "-[Step1]----------------------------------------------------------------------------------------\n" // Evaluate the first time. - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save mapped bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (mapped,bound) Assert.AreEqual("File2.fs.Suffix1",r.[1]) @@ -347,17 +347,17 @@ type IncrementalBuild() = printf "-[Step2]----------------------------------------------------------------------------------------\n" // Evaluate the second time. No change should be seen. mapSuffix:="Suffix2" - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save mapped bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (mapped,bound) Assert.AreEqual("File2.fs.Suffix1",r.[1]) printf "-[Step3]----------------------------------------------------------------------------------------\n" // Evaluate a third time with timestamps updated. Should cause a rebuild - let cache = TimeStampCache(System.DateTime.Now) - while !stampAs = DateTime.Now do + let cache = TimeStampCache(System.DateTime.UtcNow) + while !stampAs = DateTime.UtcNow do System.Threading.Thread.Sleep 10 // Sleep a little to avoid grabbing the same 'Now' - stampAs:=DateTime.Now + stampAs:=DateTime.UtcNow let bound = Eval cache ctok save mapped bound |> Cancellable.runWithoutCancellation let r = GetVectorResult (mapped,bound) Assert.AreEqual("File2.fs.Suffix2",r.[1]) @@ -370,7 +370,7 @@ type IncrementalBuild() = let Join ctok (filenames:_[]) = !joinedResult |> cancellable.Return - let stampAs = ref DateTime.Now + let stampAs = ref DateTime.UtcNow let StampFile _cache ctok filename = !stampAs @@ -384,7 +384,7 @@ type IncrementalBuild() = printf "-[Step1]----------------------------------------------------------------------------------------\n" // Evaluate the first time. - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save joined bound |> Cancellable.runWithoutCancellation let (r,_) = Option.get (GetScalarResult(joined,bound)) Assert.AreEqual("Join1",r) @@ -392,17 +392,17 @@ type IncrementalBuild() = printf "-[Step2]----------------------------------------------------------------------------------------\n" // Evaluate the second time. No change should be seen. joinedResult:="Join2" - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save joined bound |> Cancellable.runWithoutCancellation let (r,_) = Option.get (GetScalarResult (joined,bound)) Assert.AreEqual("Join1",r) printf "-[Step3]----------------------------------------------------------------------------------------\n" // Evaluate a third time with timestamps updated. Should cause a rebuild - while !stampAs = DateTime.Now do + while !stampAs = DateTime.UtcNow do System.Threading.Thread.Sleep 10 // Sleep a little to avoid grabbing the same 'Now' - stampAs:=DateTime.Now - let cache = TimeStampCache(System.DateTime.Now) + stampAs:=DateTime.UtcNow + let cache = TimeStampCache(System.DateTime.UtcNow) let bound = Eval cache ctok save joined bound |> Cancellable.runWithoutCancellation let (r,_) = Option.get (GetScalarResult (joined,bound)) Assert.AreEqual("Join2",r) @@ -422,7 +422,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.VectorInput(inVector, ["File1.fs";"File2.fs";"File3.fs"]) ] let bound = buildDesc.GetInitialPartialBuild inputs - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let e = Eval cache ctok save scanned bound |> Cancellable.runWithoutCancellation let r = GetScalarResult (vectorSize,e) match r with @@ -439,7 +439,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.ScalarInput(inScalar, "A Scalar Value") ] let bound = buildDesc.GetInitialPartialBuild inputs - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let e = Eval cache ctok save inScalar bound |> Cancellable.runWithoutCancellation let r = GetScalarResult(inScalar,e) match r with @@ -463,7 +463,7 @@ type IncrementalBuild() = BuildInput.ScalarInput(inScalar, (5,"")) ] let bound = buildDesc.GetInitialPartialBuild(inputs) - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let e = Eval cache ctok save result bound |> Cancellable.runWithoutCancellation let r = GetVectorResult(result,e) if [| (6,"File1.fs"); (7,"File2.fs"); (8, "File3.fs") |] <> r then @@ -481,7 +481,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.VectorInput(inVector, ["File1.fs";"File2.fs";"File3.fs"]) ] let bound = buildDesc.GetInitialPartialBuild(inputs) - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let e = Eval cache ctok save result bound |> Cancellable.runWithoutCancellation let r = GetScalarResult (result, e) match r with @@ -506,7 +506,7 @@ type IncrementalBuild() = let cts = new CancellationTokenSource() cts.Cancel() let res = - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) match Eval cache ctok save result bound |> Cancellable.run cts.Token with | ValueOrCancelled.Cancelled _ -> true | ValueOrCancelled.Value _ -> false @@ -518,7 +518,7 @@ type IncrementalBuild() = [] member public rb.AssemblyReferenceModel() = let ParseTask ctok filename = sprintf "Parse(%s)" filename - let now = System.DateTime.Now + let now = System.DateTime.UtcNow let StampFileNameTask _cache ctok filename = now let TimestampReferencedAssemblyTask _cache ctok reference = now let ApplyMetaCommands ctok (parseResults:string[]) = "tcConfig-of("+String.Join(",",parseResults)+")" @@ -558,7 +558,7 @@ type IncrementalBuild() = [ BuildInput.VectorInput(fileNamesNode, ["File1.fs";"File2.fs";"File3.fs"]); BuildInput.VectorInput(referencedAssembliesNode, [("lib1.dll", now);("lib2.dll", now)]) ] let bound = buildDesc.GetInitialPartialBuild(inputs) - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let e = Eval cache ctok save finalizedTypeCheckNode bound |> Cancellable.runWithoutCancellation let r = GetScalarResult(finalizedTypeCheckNode,e) @@ -576,7 +576,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.VectorInput(inputs, [1;2;3;4]) ] let bound = buildDesc.GetInitialPartialBuild inputs - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let evaled = Eval cache ctok save outputs bound |> Cancellable.runWithoutCancellation let outputs = GetVectorResult(outputs,evaled) Assert.AreEqual("Transformation of 4", outputs.[3]) @@ -602,7 +602,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.VectorInput(inputs, [1;2;3;4]) ] let bound = buildDesc.GetInitialPartialBuild inputs - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let evaled = Eval cache ctok save outputs bound |> Cancellable.runWithoutCancellation let outputs = GetVectorResult(outputs,evaled) Assert.AreEqual("Transformation of 4", outputs.[3]) @@ -621,7 +621,7 @@ type IncrementalBuild() = let inputs = [ BuildInput.VectorInput(inputs, []) ] let bound = buildDesc.GetInitialPartialBuild inputs - let cache = TimeStampCache(System.DateTime.Now) + let cache = TimeStampCache(System.DateTime.UtcNow) let evaled = Eval cache ctok save outputs bound |> Cancellable.runWithoutCancellation let outputs = GetVectorResult(outputs,evaled) () diff --git a/vsintegration/tests/unittests/Tests.ProjectSystem.UpToDate.fs b/vsintegration/tests/unittests/Tests.ProjectSystem.UpToDate.fs index a6dae956d1f..0d079f2f01e 100644 --- a/vsintegration/tests/unittests/Tests.ProjectSystem.UpToDate.fs +++ b/vsintegration/tests/unittests/Tests.ProjectSystem.UpToDate.fs @@ -50,7 +50,7 @@ type UpToDate() = let nonePath = Path.Combine(project.ProjectFolder, "none.txt") let embedPath = Path.Combine(project.ProjectFolder, "embedresource.txt") - let startTime = DateTime.Now + let startTime = DateTime.UtcNow File.AppendAllText(sourcePath, "printfn \"hello\"") File.AppendAllText(contentPath, "some content") @@ -64,14 +64,14 @@ type UpToDate() = Assert.IsTrue(config.IsUpToDate(logger, true)) // None items should not affect up-to-date (unless captured by well-known items, e.g. App.config) - File.SetLastWriteTime(nonePath, DateTime.Now.AddMinutes(5.)) + File.SetLastWriteTime(nonePath, DateTime.UtcNow.AddMinutes(5.)) Assert.IsTrue(config.IsUpToDate(logger, true)) for path in [sourcePath; contentPath; resourcePath; embedPath; configPath] do printfn "Testing path %s" path // touch file - File.SetLastWriteTime(path, DateTime.Now.AddMinutes(5.)) + File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(5.)) Assert.IsFalse(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) @@ -104,7 +104,7 @@ type UpToDate() = let verPath = Path.Combine(project.ProjectFolder, "ver.txt") let keyPath = Path.Combine(project.ProjectFolder, "key.txt") - let startTime = DateTime.Now + let startTime = DateTime.UtcNow File.AppendAllText(sourcePath, "printfn \"hello\"") File.AppendAllText(verPath, "1.2.3.4") @@ -119,7 +119,7 @@ type UpToDate() = printfn "Testing path %s" path // touch file - File.SetLastWriteTime(path, DateTime.Now.AddMinutes(5.)) + File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(5.)) Assert.IsFalse(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) @@ -143,7 +143,7 @@ type UpToDate() = let output = VsMocks.vsOutputWindowPane(ref []) let logger = OutputWindowLogger.CreateUpToDateCheckLogger(output) let absFilePath = Path.Combine(project.ProjectFolder, "file1.fs") - let startTime = DateTime.Now + let startTime = DateTime.UtcNow File.AppendAllText(absFilePath, "printfn \"hello\"") Assert.IsFalse(config.IsUpToDate(logger, true)) @@ -151,7 +151,7 @@ type UpToDate() = Assert.IsTrue(config.IsUpToDate(logger, true)) // touch proj file - File.SetLastWriteTime(projFileName, DateTime.Now.AddMinutes(5.)) + File.SetLastWriteTime(projFileName, DateTime.UtcNow.AddMinutes(5.)) Assert.IsFalse(config.IsUpToDate(logger, true)) File.SetLastWriteTime(projFileName, startTime) @@ -194,14 +194,14 @@ type UpToDate() = File.AppendAllText(sourcePath2, "let x = Test.X") let config2 = project2.ConfigProvider.GetProjectConfiguration(configNameDebug) - let startTime = DateTime.Now + let startTime = DateTime.UtcNow Assert.IsFalse(config2.IsUpToDate(logger, true)) project2.Build(configNameDebug, output, "Build") |> AssertBuildSuccessful Assert.IsTrue(config2.IsUpToDate(logger, true)) // reference is updated - File.SetLastWriteTime(output1, DateTime.Now.AddMinutes(5.)) + File.SetLastWriteTime(output1, DateTime.UtcNow.AddMinutes(5.)) Assert.IsFalse(config2.IsUpToDate(logger, true)) File.SetLastWriteTime(output1, startTime) Assert.IsTrue(config2.IsUpToDate(logger, true)) @@ -244,13 +244,13 @@ type UpToDate() = project.Build(configNameDebug, output, "Build") |> AssertBuildSuccessful Assert.IsTrue(config.IsUpToDate(logger, true)) - let startTime = DateTime.Now + let startTime = DateTime.UtcNow for path in [exeObjPath; exeBinpath; pdbObjPath; pdbBinPath; xmlDocPath; exeConfigPath] do printfn "Testing output %s" path // touch file - File.SetLastWriteTime(path, DateTime.Now.AddMinutes(-5.)) + File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(-5.)) Assert.IsFalse(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) @@ -401,7 +401,7 @@ type ``UpToDate PreserveNewest`` () = let u = ProjectConfig.IsUpToDatePreserveNewest(logger, (Func<_,_,_>(tryTimestamp)), input, output) u, !logs - let now = System.DateTime.Now + let now = System.DateTime.UtcNow let before = now.AddHours(-1.0) let ``no input -> not up-to-date and log`` = From 690fdc496f51ea5368f87291c0fbc131fcb7e371 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 6 Nov 2017 07:32:40 +0300 Subject: [PATCH 101/150] Do not trim error ranges (#3892) * Do not trim error ranges (fixes #3685) * Remove a mention of the Error List window in an error message --- src/fsharp/FSComp.txt | 2 +- src/fsharp/symbols/SymbolHelpers.fs | 19 +++++++++---------- src/fsharp/symbols/SymbolHelpers.fsi | 4 ++-- src/fsharp/vs/service.fs | 8 ++++---- tests/fsharp/typecheck/sigs/neg20.bsl | 6 +++--- tests/fsharp/typecheck/sigs/neg61.bsl | 2 +- .../E_RigidTypeAnnotation03.fsx | 8 ++++---- .../E_TwoDifferentTypeVariablesGen00.fs | 12 ++++++------ .../E_LessThanDotOpenParen001.fs | 6 +++--- .../Tests.LanguageService.ErrorList.fs | 2 +- 10 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 6e5dc678d20..deeb8d5daf0 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -361,7 +361,7 @@ csCtorHasNoArgumentOrReturnProperty,"The object constructor '%s' has no argument csNoOverloadsFound,"No overloads match for method '%s'." csMethodIsOverloaded,"A unique overload for method '%s' could not be determined based on type information prior to this program point. A type annotation may be needed." csCandidates,"Candidates: %s" -csSeeAvailableOverloads,"The available overloads are shown below (or in the Error List window)." +csSeeAvailableOverloads,"The available overloads are shown below." 512,parsDoCannotHaveVisibilityDeclarations,"Accessibility modifiers are not permitted on 'do' bindings, but '%s' was given." 513,parsEofInHashIf,"End of file in #if section begun at or after here" 514,parsEofInString,"End of file in string begun at or before here" diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 4632f3a5d9b..ffb3f013be8 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -62,16 +62,15 @@ 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, trim:bool, fallbackRange:range) = + static member CreateFromException(exn, isError, fallbackRange:range) = let m = match GetRangeOfDiagnostic exn with Some m -> m | None -> fallbackRange - let e = if trim then m.Start else m.End let msg = bufs (fun buf -> OutputPhasedDiagnostic buf exn false) let errorNum = GetDiagnosticNumber exn - FSharpErrorInfo(m.FileName, m.Start, e, (if isError then FSharpErrorSeverity.Error else FSharpErrorSeverity.Warning), msg, exn.Subcategory(), errorNum) + 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, trim:bool, fallbackRange:range, (linesCount:int, lastLength:int)) = - let r = FSharpErrorInfo.CreateFromException(exn, isError, trim, fallbackRange) + 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 let startline, schange = min (r.StartLineAlternate, false) (linesCount, true) @@ -93,7 +92,7 @@ type ErrorScope() = PushErrorLoggerPhaseUntilUnwind (fun _oldLogger -> { new ErrorLogger("ErrorScope") with member x.DiagnosticSink(exn, isError) = - let err = FSharpErrorInfo.CreateFromException(exn, isError, false, range.Zero) + let err = FSharpErrorInfo.CreateFromException(exn, isError, range.Zero) errors <- err :: errors if isError && firstError.IsNone then firstError <- Some err.Message @@ -180,18 +179,18 @@ module ErrorHelpers = let ReportError (options, allErrors, mainInputFileName, fileInfo, (exn, sev)) = [ let isError = (sev = FSharpErrorSeverity.Error) || ReportWarningAsError options exn if (isError || ReportWarning options exn) then - let oneError trim exn = + let oneError exn = [ // We use the first line of the file as a fallbackRange for reporting unexpected errors. // Not ideal, but it's hard to see what else to do. let fallbackRange = rangeN mainInputFileName 1 - let ei = FSharpErrorInfo.CreateFromExceptionAndAdjustEof (exn, isError, trim, fallbackRange, fileInfo) + let ei = FSharpErrorInfo.CreateFromExceptionAndAdjustEof (exn, isError, fallbackRange, fileInfo) if allErrors || (ei.FileName = mainInputFileName) || (ei.FileName = TcGlobals.DummyFileNameForRangesWithoutASpecificLocation) then yield ei ] let mainError, relatedErrors = SplitRelatedDiagnostics exn - yield! oneError false mainError + yield! oneError mainError for e in relatedErrors do - yield! oneError true e ] + yield! oneError e ] let CreateErrorInfos (options, allErrors, mainInputFileName, errors) = let fileInfo = (Int32.MaxValue, Int32.MaxValue) diff --git a/src/fsharp/symbols/SymbolHelpers.fsi b/src/fsharp/symbols/SymbolHelpers.fsi index c36f931fe8d..216fecacb8e 100755 --- a/src/fsharp/symbols/SymbolHelpers.fsi +++ b/src/fsharp/symbols/SymbolHelpers.fsi @@ -46,8 +46,8 @@ type internal FSharpErrorInfo = member Message:string member Subcategory:string member ErrorNumber:int - static member internal CreateFromExceptionAndAdjustEof : PhasedDiagnostic * isError: bool * trim: bool * range * lastPosInFile:(int*int) -> FSharpErrorInfo - static member internal CreateFromException : PhasedDiagnostic * isError: bool * trim: bool * range -> FSharpErrorInfo + static member internal CreateFromExceptionAndAdjustEof : PhasedDiagnostic * isError: bool * range * lastPosInFile:(int*int) -> FSharpErrorInfo + static member internal CreateFromException : PhasedDiagnostic * isError: bool * range -> FSharpErrorInfo //---------------------------------------------------------------------------- // Object model for quick info diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index f96d560b763..a49e0cf0cdb 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -2104,10 +2104,10 @@ module CompileHelpers = let errors = ResizeArray<_>() let errorSink isError exn = - let mainError,relatedErrors = SplitRelatedDiagnostics exn - let oneError trim e = errors.Add(FSharpErrorInfo.CreateFromException (e, isError, trim, Range.range0)) - oneError false mainError - List.iter (oneError true) relatedErrors + let mainError, relatedErrors = SplitRelatedDiagnostics exn + let oneError e = errors.Add(FSharpErrorInfo.CreateFromException (e, isError, Range.range0)) + oneError mainError + List.iter oneError relatedErrors let errorLogger = { new ErrorLogger("CompileAPI") with diff --git a/tests/fsharp/typecheck/sigs/neg20.bsl b/tests/fsharp/typecheck/sigs/neg20.bsl index fc46431486b..d8051fd7bb9 100644 --- a/tests/fsharp/typecheck/sigs/neg20.bsl +++ b/tests/fsharp/typecheck/sigs/neg20.bsl @@ -159,7 +159,7 @@ neg20.fs(129,19,129,22): typecheck error FS0001: This expression was expected to but here has type 'string' -neg20.fs(131,5,131,24): typecheck error FS0041: No overloads match for method 'OM3'. The available overloads are shown below (or in the Error List window). +neg20.fs(131,5,131,24): typecheck error FS0041: No overloads match for method 'OM3'. The available overloads are shown below. neg20.fs(131,5,131,24): typecheck error FS0041: Possible overload: 'static member C.OM3 : x:'b * y:int -> int'. Type constraint mismatch. The type 'obj' is not compatible with type @@ -199,7 +199,7 @@ neg20.fs(166,13,166,35): typecheck error FS0502: The member or object constructo neg20.fs(167,13,167,31): typecheck error FS0502: The member or object constructor 'M5' takes 2 type argument(s) but is here given 1. The required signature is 'member C.M5 : y:'a * z:'b -> int'. -neg20.fs(182,14,182,31): typecheck error FS0041: No overloads match for method 'M'. The available overloads are shown below (or in the Error List window). +neg20.fs(182,14,182,31): typecheck error FS0041: No overloads match for method 'M'. The available overloads are shown below. neg20.fs(182,14,182,31): typecheck error FS0041: Possible overload: 'static member C2.M : fmt:string * [] args:int [] -> string'. Type constraint mismatch. The type 'obj' is not compatible with type @@ -236,7 +236,7 @@ neg20.fs(184,34,184,39): typecheck error FS0001: This expression was expected to but here has type 'obj' -neg20.fs(188,14,188,31): typecheck error FS0041: No overloads match for method 'M'. The available overloads are shown below (or in the Error List window). +neg20.fs(188,14,188,31): typecheck error FS0041: No overloads match for method 'M'. The available overloads are shown below. neg20.fs(188,14,188,31): typecheck error FS0041: Possible overload: 'static member C3.M : fmt:string * [] args:string [] -> string'. Type constraint mismatch. The type 'obj' is not compatible with type diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index db9bea49058..b513bb46a9c 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -83,7 +83,7 @@ neg61.fs(156,21,156,22): typecheck error FS3147: This 'let' definition may not b neg61.fs(171,13,171,18): typecheck error FS3099: 'sumBy' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected 1 argument(s), but given 0. -neg61.fs(174,22,174,23): typecheck error FS0041: No overloads match for method 'Source'. The available overloads are shown below (or in the Error List window). +neg61.fs(174,22,174,23): typecheck error FS0041: No overloads match for method 'Source'. The available overloads are shown below. neg61.fs(174,22,174,23): typecheck error FS0041: Possible overload: 'member Linq.QueryBuilder.Source : source:System.Linq.IQueryable<'T> -> Linq.QuerySource<'T,'Q>'. Type constraint mismatch. The type 'int' is not compatible with type diff --git a/tests/fsharpqa/Source/Conformance/Expressions/Type-relatedExpressions/E_RigidTypeAnnotation03.fsx b/tests/fsharpqa/Source/Conformance/Expressions/Type-relatedExpressions/E_RigidTypeAnnotation03.fsx index 80aa63ceace..2c0c7519831 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/Type-relatedExpressions/E_RigidTypeAnnotation03.fsx +++ b/tests/fsharpqa/Source/Conformance/Expressions/Type-relatedExpressions/E_RigidTypeAnnotation03.fsx @@ -23,11 +23,11 @@ let _ = T.M( @"\" : char ) exit 1 // Way more errors are reported, but this is a good enough list. //This expression was expected to have type. 'sbyte' .but here has type. 'byte' -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. //This expression was expected to have type. 'float32' .but here has type. 'float<'u>' -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. //This expression was expected to have type. 'float32<'u>' .but here has type. 'decimal' //Type mismatch\. Expecting a. 'decimal' .but given a. 'decimal' -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. //This expression was expected to have type. 'char' .but here has type. 'string' -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. diff --git a/tests/fsharpqa/Source/Conformance/InferenceProcedures/TypeInference/E_TwoDifferentTypeVariablesGen00.fs b/tests/fsharpqa/Source/Conformance/InferenceProcedures/TypeInference/E_TwoDifferentTypeVariablesGen00.fs index c94cd93f0f5..a567c6e395d 100644 --- a/tests/fsharpqa/Source/Conformance/InferenceProcedures/TypeInference/E_TwoDifferentTypeVariablesGen00.fs +++ b/tests/fsharpqa/Source/Conformance/InferenceProcedures/TypeInference/E_TwoDifferentTypeVariablesGen00.fs @@ -7,11 +7,11 @@ //This expression was expected to have type. 'int' .but here has type. ''b' //A type parameter is missing a constraint 'when 'b :> C' //Type constraint mismatch. The type.+''b'.+is not compatible with type -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. @@ -20,12 +20,12 @@ //This expression was expected to have type. 'int' .but here has type. ''b' //A type parameter is missing a constraint 'when 'b :> C' //Type constraint mismatch. The type.+''b'.+is not compatible with type -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. @@ -34,12 +34,12 @@ //This expression was expected to have type. 'int' .but here has type. ''b' //A type parameter is missing a constraint 'when 'b :> C' //Type constraint mismatch. The type.+''b'.+is not compatible with type -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. -//No overloads match for method 'M'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'M'\. The available overloads are shown below\. diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/SymbolicOperators/E_LessThanDotOpenParen001.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/SymbolicOperators/E_LessThanDotOpenParen001.fs index 3da7c94ac1d..b7c161c5620 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/SymbolicOperators/E_LessThanDotOpenParen001.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/SymbolicOperators/E_LessThanDotOpenParen001.fs @@ -4,9 +4,9 @@ // want to verify we do not crash! //This construct causes code to be less generic than indicated by the type annotations\. The type variable 'S has been constrained to be type 'int' //This code is not sufficiently generic\. The type variable \^T when \^T : \(static member \( \+ \) : \^T \* \^T -> \^a\) could not be generalized because it would escape its scope -//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below \(or in the Error List window\)\. -//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below \(or in the Error List window\)\. -//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below \(or in the Error List window\)\. +//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below\. +//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below\. +//No overloads match for method 'op_PlusPlusPlus'\. The available overloads are shown below\. type public TestType<'T,'S>() = diff --git a/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs b/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs index 9e08413586f..d72c2c4032f 100644 --- a/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs +++ b/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs @@ -184,7 +184,7 @@ let g (t : T) = t.Count() CheckErrorList content <| fun errors -> Assert.AreEqual(3, List.length errors) - assertContains errors "No overloads match for method 'X'. The available overloads are shown below (or in the Error List window)." + assertContains errors "No overloads match for method 'X'. The available overloads are shown below." for expected in expectedMessages do errors |> List.exists (fun e -> e.Message.StartsWith expected) From fa2c844b6309cfad2db67f0464c1ab53a915b45e Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 6 Nov 2017 08:58:59 -0800 Subject: [PATCH 102/150] update template setup authoring for removed templates --- .../Templates.swr | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr index 9bb6cfc0a8c..ee35fedc9a3 100644 --- a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr +++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr @@ -18,34 +18,6 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplate file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCore259Project" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore259Project\AssemblyInfo.fs" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\NETCore259PortableLibrary.vstemplate" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary.fsproj" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary1.fs" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore259Project\Script.fsx" - -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCore78Project" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore78Project\AssemblyInfo.fs" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\NETCore78PortableLibrary.vstemplate" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary.fsproj" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary1.fs" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore78Project\Script.fsx" - -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCoreProject" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCoreProject\AssemblyInfo.fs" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\NETCore7PortableLibrary.vstemplate" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary.fsproj" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary1.fs" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCoreProject\Script.fsx" - -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\PortableLibraryProject" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\PortableLibraryProject\AssemblyInfo.fs" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.fsproj" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.vstemplate" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary1.fs" - file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\PortableLibraryProject\Script.fsx" - folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\TutorialProject\Tutorial.fsx" From 1cb436aa44828b2aa82b30c6eea267c9bccd4e32 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Mon, 6 Nov 2017 17:24:27 -0800 Subject: [PATCH 103/150] Fix Struct.ValueTuple on net 4.7.1 --- src/fsharp/CompileOps.fs | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0d35f05dc1c..d7ebe36c75c 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -1776,19 +1776,6 @@ let GetFSharpCoreLibraryName () = "FSharp.Core" // If necessary assume a reference to the latest .NET Framework FSharp.Core with which those tools are built. let GetDefaultFSharpCoreReference() = typeof>.Assembly.Location -// If necessary assume a reference to the latest System.ValueTuple with which those tools are built. -let GetDefaultSystemValueTupleReference() = -#if COMPILER_SERVICE_AS_DLL - None // TODO, right now FCS doesn't add this reference automatically -#else - try - let asm = typeof>.Assembly - if asm.FullName.StartsWith "System.ValueTuple" then - Some asm.Location - else None - with _ -> None -#endif - let GetFsiLibraryName () = "FSharp.Compiler.Interactive.Settings" // This list is the default set of references for "non-project" files. @@ -1821,10 +1808,10 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Collections" // System.Collections.Generic.List yield "System.Runtime.Numerics" // BigInteger yield "System.Threading" // OperationCanceledException - // always include a default reference to System.ValueTuple.dll in scripts and out-of-project sources - match GetDefaultSystemValueTupleReference() with - | None -> () - | Some v -> yield v +#if !COMPILER_SERVICE_AS_DLL + // TODO, right now FCS doesn't add this reference automatically + yield "System.ValueTuple" +#endif yield "System.Web" yield "System.Web.Services" From 46a1e68addb8c1f685bc661b129758f2d047d237 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 6 Nov 2017 20:19:45 -0800 Subject: [PATCH 104/150] Update Dependencies (#3884) * update * Upgrade System.Collection.Immutable to 1.4.0 * more updates * re-fix vssdk * update .dll.config --- DotnetCLIToolsVersion.txt | 2 +- ...FSharp.Compiler.Service.netstandard.fsproj | 2 +- .../FSharp.Compiler.Service.fsproj | 6 ++--- fcs/nuget/FSharp.Compiler.Service.nuspec | 2 +- packages.config | 8 +++--- .../component-groups/Compiler_Redist.wxs | 8 +++--- setup/packages.config | 8 +++--- src/FSharpSource.Settings.targets | 2 +- src/FSharpSource.targets | 2 +- .../FSharp.Compiler.Private.fsproj | 27 +++---------------- .../FSharp.Compiler.Private.fsproj | 4 +-- .../FSharp.Compiler.Private.netcore.nuspec | 6 ++--- .../FSharp.Compiler.Private/project.json | 6 ++--- .../Microsoft.FSharp.Compiler.nuspec | 8 +++--- .../Testing.FSharp.Compiler.nuspec | 8 +++--- src/fsharp/Fsc-proto/Fsc-proto.fsproj | 4 +-- .../VisualFSharpOpenSource.csproj | 4 +-- .../ProjectSystem.fsproj | 2 +- .../VisualFSharp.Unittests.dll.config | 2 +- 19 files changed, 45 insertions(+), 66 deletions(-) diff --git a/DotnetCLIToolsVersion.txt b/DotnetCLIToolsVersion.txt index 0286f3da097..07fe0f906a8 100644 --- a/DotnetCLIToolsVersion.txt +++ b/DotnetCLIToolsVersion.txt @@ -1 +1 @@ -2.0.0-preview2-006502 +2.0.3-servicing-007056 diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index 3b8ed6361e6..b756152b993 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -652,7 +652,7 @@ - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index 1d5057aae1c..a955e015b80 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -635,16 +635,16 @@ - $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.PortablePdb.1.2.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.4.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll diff --git a/fcs/nuget/FSharp.Compiler.Service.nuspec b/fcs/nuget/FSharp.Compiler.Service.nuspec index ba4c2e7c3d5..3d4a1213bb0 100644 --- a/fcs/nuget/FSharp.Compiler.Service.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.nuspec @@ -14,7 +14,7 @@

    F# compiler services for creating IDE tools, language extensions and for F# embedding. - + diff --git a/packages.config b/packages.config index 84cd4ec98f5..7667cd2d480 100644 --- a/packages.config +++ b/packages.config @@ -15,9 +15,9 @@ - - - + + + @@ -32,7 +32,7 @@ - + diff --git a/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs b/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs index 78ed9289055..a17daea8e54 100644 --- a/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs +++ b/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs @@ -171,19 +171,19 @@ - + - + - + - + diff --git a/setup/packages.config b/setup/packages.config index aded14292c8..24b02a45ed8 100644 --- a/setup/packages.config +++ b/setup/packages.config @@ -1,9 +1,9 @@ - - - - + + + + diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 7f964f14beb..2fa8ed67d77 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -35,7 +35,7 @@ 2.3.0-beta2-61719-01 15.0 15.0.26201 - 1.3.1 + 1.4.0 Microsoft.VSSDK.BuildTools.15.0.26201 15.3.23 diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index f9e54f501f7..d8b3751a01d 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -156,7 +156,7 @@ $(FSharpSourcesRoot)\..\$(Configuration)\$(ProtoFlavour)\bin - $(FSharpSourcesRoot)\..\Tools\dotnet20\sdk\2.0.0-preview2-006502\FSharp + $(FSharpSourcesRoot)\..\Tools\dotnet20\sdk\2.0.3-servicing-007056\FSharp ..\packages\FSharp.Compiler.Tools.4.1.27\tools\Microsoft.FSharp.Targets diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index c8eec300d75..6dee1958bf0 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -627,37 +627,16 @@ - - + - + @@ -666,7 +645,7 @@ - + diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 24f3ea8f576..e68a817dbba 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -689,13 +689,13 @@ - ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.2.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll ..\..\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - ..\..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll + ..\..\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\..\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec index 302e10bbe27..8c4bb2aedc0 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec @@ -16,14 +16,14 @@ - + - + @@ -31,7 +31,7 @@ - + diff --git a/src/fsharp/FSharp.Compiler.Private/project.json b/src/fsharp/FSharp.Compiler.Private/project.json index bee86e2f411..2264a6ce7c8 100644 --- a/src/fsharp/FSharp.Compiler.Private/project.json +++ b/src/fsharp/FSharp.Compiler.Private/project.json @@ -1,14 +1,14 @@ { "dependencies": { "NETStandard.Library": "1.6.1", - "System.Collections.Immutable":"1.3.1", + "System.Collections.Immutable":"1.4.0", "System.Diagnostics.Process": "4.3.0", "System.Diagnostics.TraceSource": "4.3.0", "System.Linq.Expressions": "4.3.0", "System.Linq.Queryable": "4.3.0", "System.Net.Requests": "4.3.0", "System.Reflection.Emit": "4.3.0", - "System.Reflection.Metadata": "1.4.2", + "System.Reflection.Metadata": "1.5.0", "System.Reflection.TypeExtensions": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0", @@ -17,7 +17,7 @@ "System.Threading.Tasks.Parallel": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", - "Microsoft.DiaSymReader.PortablePdb": "1.1.0", + "Microsoft.DiaSymReader.PortablePdb": "1.2.0", "Microsoft.DiaSymReader": "1.1.0", "System.ValueTuple": "4.3.1" }, diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index bf3b7397d7b..edd278cf82f 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -33,8 +33,8 @@ - - + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec index ac1069ee47b..27bfa91f071 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -32,8 +32,8 @@ - - + + diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj index 1f86f23372a..047e70052fb 100644 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ b/src/fsharp/Fsc-proto/Fsc-proto.fsproj @@ -453,13 +453,13 @@ - $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.PortablePdb.1.2.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj index 7456816be95..54bf08a51bb 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj +++ b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj @@ -292,8 +292,8 @@ False $(FSharpSourcesRoot)\..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll - - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index b7b90d75070..ff08f31bb70 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -218,7 +218,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Shell.$(RoslynVSBinariesVersion).$(RoslynVSPackagesVersion)\lib\Microsoft.VisualStudio.Shell.$(RoslynVSBinariesVersion).dll - + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config b/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config index 7f55b7d12fc..4a0c1ed3562 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config @@ -49,7 +49,7 @@ - + From e0933b400e9db4876306cfac7819ee430de4fc1a Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 7 Nov 2017 07:20:18 +0300 Subject: [PATCH 105/150] Use HashSet instead of Set in the type suggestion algorithm (#3883) * use HashSet instead of Set in the type suggestion algorithm * fix tests * optimize jaro * reduce allocations * fix * use Stack * back to ResizeArray, no rev * refactor GetRecordLabelsForType * use imperative loop instead of seq --- src/fsharp/ConstraintSolver.fs | 2 +- src/fsharp/ErrorLogger.fs | 4 +- src/fsharp/NameResolution.fs | 164 ++++++++++++-------------- src/fsharp/TypeChecker.fs | 8 +- src/utils/EditDistance.fs | 86 ++++++-------- tests/fsharp/typecheck/sigs/neg01.bsl | 4 +- tests/fsharp/typecheck/sigs/neg14.bsl | 4 +- 7 files changed, 125 insertions(+), 147 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 7a88d2e5604..8529b3f0c4e 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -2050,7 +2050,7 @@ and ReportNoCandidatesError (csenv:ConstraintSolverEnv) (nUnnamedCallerArgs, nNa let predictFields() = minfo.DeclaringEntityRef.AllInstanceFieldsAsList |> List.map (fun p -> p.Name.Replace("@", "")) - |> Set.ofList + |> System.Collections.Generic.HashSet ErrorWithSuggestions((msgNum, FSComp.SR.csCtorHasNoArgumentOrReturnProperty(methodName, id.idText, msgText)), id.idRange, id.idText, predictFields) else diff --git a/src/fsharp/ErrorLogger.fs b/src/fsharp/ErrorLogger.fs index d854d897573..cb2b585168c 100755 --- a/src/fsharp/ErrorLogger.fs +++ b/src/fsharp/ErrorLogger.fs @@ -54,9 +54,9 @@ let rec findOriginalException err = | WrappedError(err, _) -> findOriginalException err | _ -> err -type Suggestions = unit -> Set +type Suggestions = unit -> Collections.Generic.HashSet -let NoSuggestions : Suggestions = fun () -> Set.empty +let NoSuggestions : Suggestions = fun () -> Collections.Generic.HashSet() /// Thrown when we stop processing the F# Interactive entry or #load. exception StopProcessingExn of exn option with diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 7150c4d99d3..5a30b96cd2f 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -899,7 +899,9 @@ let AddResults res1 res2 = | 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,fun () -> Set.union (suggestions1()) (suggestions2()))) + 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) -> if n1 < n2 then Exception e2 else Exception e1 @@ -1761,7 +1763,7 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne |> Seq.collect (fun kv -> kv.Value) |> Seq.filter (fun modref -> IsEntityAccessible amap m ad modref) |> Seq.collect (fun e -> [e.DisplayName; e.DemangledModuleOrNamespaceName]) - |> Set.ofSeq + |> HashSet UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,suggestModulesAndNamespaces)) @@ -1774,7 +1776,7 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne mty.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.collect (fun e -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) - |> Set.ofSeq + |> HashSet let error = raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespace,id,suggestNames)) moduleNotFoundErrorCache := Some error @@ -2014,16 +2016,13 @@ let DecodeFSharpEvent (pinfos:PropInfo list) ad g (ncenv:NameResolver) m = /// Returns all record label names for the given type. let GetRecordLabelsForType g nenv typ = + let result = HashSet() if isRecdTy g typ then - let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv typ - nenv.eFieldLabels - |> Seq.filter (fun kv -> - kv.Value - |> List.exists (fun r -> r.TyconRef.DisplayName = typeName)) - |> Seq.map (fun kv -> kv.Key) - |> Set.ofSeq - else - Set.empty + let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv typ + for KeyValue(k, v) in nenv.eFieldLabels do + if v |> List.exists (fun r -> r.TyconRef.DisplayName = typeName) then + result.Add k |> ignore + result // 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. @@ -2112,21 +2111,22 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let suggestions1 = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) m typ |> List.map (fun p -> p.PropertyName) - |> Set.ofList + let suggestions2 = ExtensionMethInfosOfTypeInScope ncenv.InfoReader nenv None m typ |> List.map (fun m -> m.DisplayName) - |> Set.ofList + let suggestions3 = GetIntrinsicPropInfosOfType ncenv.InfoReader (None, ad, AllowMultiIntfInstantiations.No) findFlag m typ |> List.map (fun p -> p.PropertyName) - |> Set.ofList + let suggestions4 = GetIntrinsicMethInfosOfType ncenv.InfoReader (None, ad, AllowMultiIntfInstantiations.No) findFlag m typ |> List.filter (fun m -> not m.IsClassConstructor && not m.IsConstructor) |> List.map (fun m -> m.DisplayName) - |> Set.ofList + let suggestions5 = GetRecordLabelsForType g nenv typ + let suggestions6 = match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> @@ -2134,17 +2134,17 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let tcref,_ = destAppTy g typ tcref.UnionCasesArray |> Array.map (fun uc -> uc.DisplayName) - |> Set.ofArray else - Set.empty - | _ -> Set.empty + [||] + | _ -> [||] - suggestions1 - |> Set.union suggestions2 - |> Set.union suggestions3 - |> Set.union suggestions4 - |> Set.union suggestions5 - |> Set.union suggestions6 + [ yield! suggestions1 + yield! suggestions2 + yield! suggestions3 + yield! suggestions4 + yield! suggestions5 + yield! suggestions6 ] + |> HashSet raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id, suggestMembers)) @@ -2259,13 +2259,11 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN modref.ModuleOrNamespaceType.AllEntities |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef e)) |> Seq.map (fun e -> e.DisplayName) - |> Set.ofSeq let submodules = mty.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq let unions = modref.ModuleOrNamespaceType.AllEntities @@ -2276,25 +2274,23 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN else tycon.UnionCasesArray) |> Seq.map (fun uc -> uc.DisplayName) - |> Set.ofSeq let vals = modref.ModuleOrNamespaceType.AllValsByLogicalName |> Seq.filter (fun e -> IsValAccessible ad (mkNestedValRef modref e.Value)) |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq 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) - |> Set.ofSeq - types - |> Set.union submodules - |> Set.union unions - |> Set.union vals - |> Set.union exns + [ yield! types + yield! submodules + yield! unions + yield! vals + yield! exns ] + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameValueConstructorNamespaceOrType,id,suggestPossibleTypesAndNames)) | results -> AtMostOneResult id.idRange results @@ -2393,20 +2389,17 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n let suggestedNames = nenv.eUnqualifiedItems |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq let suggestedTypes = nenv.TyconsByDemangledNameAndArity fullyQualified |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq let suggestedModulesAndNamespaces = 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]) - |> Set.ofSeq let unions = // check if the user forgot to use qualified access @@ -2421,12 +2414,12 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n else None) |> Seq.map (fun t -> t.DisplayName + "." + id.idText) - |> Set.ofSeq - suggestedNames - |> Set.union suggestedTypes - |> Set.union suggestedModulesAndNamespaces - |> Set.union unions + [ yield! suggestedNames + yield! suggestedTypes + yield! suggestedModulesAndNamespaces + yield! unions ] + |> HashSet raze (UndefinedName(0,FSComp.SR.undefinedNameValueOfConstructor,id,suggestNamesAndTypes)) ForceRaise failingCase @@ -2514,33 +2507,28 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n search +++ moduleSearch +++ tyconSearch let suggestEverythingInScope() = - let suggestedModulesAndNamespaces = - 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]) - |> Set.ofSeq + 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]) - let suggestedTypes = - nenv.TyconsByDemangledNameAndArity fullyQualified - |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) - |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq - - let suggestedNames = - nenv.eUnqualifiedItems - |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq - - suggestedNames - |> Set.union suggestedTypes - |> Set.union suggestedModulesAndNamespaces + yield! + nenv.TyconsByDemangledNameAndArity fullyQualified + |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) + |> Seq.map (fun e -> e.Value.DisplayName) + + yield! + nenv.eUnqualifiedItems + |> Seq.map (fun e -> e.Value.DisplayName) + } |> HashSet match innerSearch with | Exception (UndefinedName(0,_,id1,suggestionsF)) when id.idRange = id1.idRange -> let mergeSuggestions() = - suggestEverythingInScope() - |> Set.union (suggestionsF()) + let res = suggestEverythingInScope() + res.UnionWith(suggestionsF()) + res let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueNamespaceTypeOrModule,id,mergeSuggestions)) ForceRaise failingCase @@ -2635,15 +2623,15 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num 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]) - |> Set.ofSeq let suggestedTypes = nenv.TyconsByDemangledNameAndArity FullyQualifiedFlag.OpenQualified |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq - Set.union submodules suggestedTypes + [ yield! submodules + yield! suggestedTypes ] + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameConstructorModuleOrNamespace,id,suggestPossibleTypes)) | results -> AtMostOneResult id.idRange results @@ -2746,7 +2734,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo let suggestTypes() = tcref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) | id::rest -> @@ -2767,7 +2755,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo let suggestTypes() = tcref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) @@ -2787,7 +2775,7 @@ let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) modref.ModuleOrNamespaceType.AllEntities |> Seq.filter (fun e -> IsEntityAccessible amap m ad (modref.NestedTyconRef e)) |> Seq.collect (fun e -> [e.DisplayName; e.DemangledModuleOrNamespaceName]) - |> Set.ofSeq + |> HashSet let errorTextF s = FSComp.SR.undefinedNameTypeIn(s,fullDisplayTextOfModRef modref) UndefinedName(depth,errorTextF,id,suggestPossibleTypes) @@ -2814,7 +2802,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.collect (fun e -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) - |> Set.ofSeq + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespaceOrModule,id,suggestPossibleModules)) let tyconSearch = @@ -2825,7 +2813,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty let suggestTypes() = modref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange |> Seq.map (fun e -> e.Value.DisplayName) - |> Set.ofSeq + |> HashSet raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) tyconSearch +++ modulSearch @@ -2868,7 +2856,7 @@ let rec ResolveTypeLongIdentPrim (ncenv:NameResolver) occurence fullyQualified m if e.Value.DisplayName.EndsWith "Attribute" then yield e.Value.DisplayName.Replace("Attribute","")] | _ -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) - |> Set.ofSeq + |> HashSet raze (UndefinedName(0,FSComp.SR.undefinedNameType,id,suggestPossibleTypes)) @@ -2991,18 +2979,19 @@ let SuggestOtherLabelsOfSameRecordType g (nenv:NameResolutionEnv) typ (id:Ident) allFields |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) - |> Set.ofList - Set.difference labelsOfPossibleRecord givenFields - + 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) |> Set.ofList + let givenFields = allFields |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) |> HashSet let fullyQualfied = - if Set.isEmpty givenFields then + if givenFields.Count = 0 then // return labels from all records - NameMap.domainL nenv.eFieldLabels |> Set.ofList |> Set.remove "contents" + let result = NameMap.domainL nenv.eFieldLabels |> HashSet + result.Remove "contents" |> ignore + result else let possibleRecords = [for fld in givenFields do @@ -3010,10 +2999,10 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel | None -> () | Some recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) ] |> List.groupBy fst - |> List.map (fun (r,fields) -> r, fields |> List.map snd |> Set.ofList) - |> List.filter (fun (_,fields) -> Set.isSubset givenFields fields) + |> List.map (fun (r,fields) -> r, fields |> List.map snd) + |> List.filter (fun (_,fields) -> givenFields.IsSubsetOf fields) |> List.map fst - |> Set.ofList + |> HashSet let labelsOfPossibleRecords = nenv.eFieldLabels @@ -3022,11 +3011,12 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel |> List.map (fun r -> r.TyconRef.DisplayName) |> List.exists possibleRecords.Contains) |> Seq.map (fun kv -> kv.Key) - |> Set.ofSeq + |> HashSet - Set.difference labelsOfPossibleRecords givenFields + labelsOfPossibleRecords.ExceptWith givenFields + labelsOfPossibleRecords - if not (Set.isEmpty fullyQualfied) then fullyQualfied else + if fullyQualfied.Count > 0 then fullyQualfied else // check if the user forgot to use qualified access nenv.eTyconsByDemangledNameAndArity @@ -3040,7 +3030,7 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel else None) |> Seq.map (fun t -> t.DisplayName + "." + id.idText) - |> Set.ofSeq + |> HashSet UndefinedName(0,FSComp.SR.undefinedNameRecordLabel, id, suggestLabels) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 966a5f18806..9cb244a4669 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -4458,16 +4458,16 @@ and TcTyparOrMeasurePar optKind cenv (env:TcEnv) newOk tpenv (Typar(id, _, _) as let predictions1 = env.eNameResEnv.eTypars |> Seq.map (fun p -> "'" + p.Key) - |> Set.ofSeq let predictions2 = match tpenv with | UnscopedTyparEnv elements -> elements |> Seq.map (fun p -> "'" + p.Key) - |> Set.ofSeq - Set.union predictions1 predictions2 + [ yield! predictions1 + yield! predictions2 ] + |> HashSet let reportedId = Ident("'" + id.idText, id.idRange) error (UndefinedName(0, FSComp.SR.undefinedNameTypeParameter, reportedId, predictTypeParameters)) @@ -6440,7 +6440,7 @@ and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty:TType) virtNameAndArity let suggestVirtualMembers() = virtNameAndArityPairs |> List.map (fst >> fst) - |> Set.ofList + |> HashSet if containsNonAbstractMemberWithSameName then errorR(ErrorWithSuggestions(FSComp.SR.tcMemberFoundIsNotAbstractOrVirtual(tcref.DisplayName, bindName), mBinding, bindName, suggestVirtualMembers)) diff --git a/src/utils/EditDistance.fs b/src/utils/EditDistance.fs index 3ab53e679f4..6beac0c408f 100644 --- a/src/utils/EditDistance.fs +++ b/src/utils/EditDistance.fs @@ -3,11 +3,13 @@ /// Functions to compute the edit distance between two strings module internal Internal.Utilities.EditDistance -/// Given an offset and a radius from that offset, -/// does mChar exist in that part of str? -let inline existsInWin (mChar: char) (str: string) offset rad = - let startAt = max 0 (offset - rad) - let endAt = min (offset + rad) (String.length str - 1) +open System +open System.Collections.Generic + +/// Given an offset and a radius from that offset, does mChar exist in that part of str? +let inline existsInWin (mChar: char) (str: string) (offset: int) (rad: int) = + let startAt = Math.Max(0, offset - rad) + let endAt = Math.Min(offset + rad, str.Length - 1) if endAt - startAt < 0 then false else let rec exists index = @@ -15,61 +17,47 @@ let inline existsInWin (mChar: char) (str: string) offset rad = elif index = endAt then false else exists (index + 1) exists startAt - -/// The jaro distance between s1 and s2 -let jaro s1 s2 = - // The radius is half of the lesser - // of the two string lengths rounded up. + +let jaro (s1: string) (s2: string) = + // The radius is half of the lesser of the two string lengths rounded up. let matchRadius = - let minLen = - min (String.length s1) (String.length s2) in - minLen / 2 + minLen % 2 - + let minLen = Math.Min(s1.Length, s2.Length) + minLen / 2 + minLen % 2 + // An inner function which recursively finds the number // of matched characters within the radius. let commonChars (chars1: string) (chars2: string) = - let rec inner i result = - match i with - | -1 -> result - | _ -> if existsInWin chars1.[i] chars2 i matchRadius - then inner (i - 1) (chars1.[i] :: result) - else inner (i - 1) result - inner (chars1.Length - 1) [] - + let result = ResizeArray(chars1.Length) + for i = 0 to chars1.Length - 1 do + let c = chars1.[i] + if existsInWin c chars2 i matchRadius then + result.Add c + result + // The sets of common characters and their lengths as floats let c1 = commonChars s1 s2 let c2 = commonChars s2 s1 - let c1length = float (List.length c1) - let c2length = float (List.length c2) - - // The number of transpositions within - // the sets of common characters. - let transpositions = - let rec inner cl1 cl2 result = - match cl1, cl2 with - | [], _ | _, [] -> result - | c1h :: c1t, c2h :: c2t -> - if c1h <> c2h - then inner c1t c2t (result + 1.0) - else inner c1t c2t result - let mismatches = inner c1 c2 0.0 + let c1length = float c1.Count + let c2length = float c2.Count + + // The number of transpositions within the sets of common characters. + let transpositions = + let mutable mismatches = 0.0 + for i = 0 to (Math.Min(c1.Count, c2.Count)) - 1 do + if c1.[i] <> c2.[i] then + mismatches <- mismatches + 1.0 + // If one common string is longer than the other // each additional char counts as half a transposition (mismatches + abs (c1length - c2length)) / 2.0 - - let s1length = float (String.length s1) - let s2length = float (String.length s2) - let tLength = max c1length c2length - - // The jaro distance as given by - // 1/3 ( m2/|s1| + m1/|s2| + (mc-t)/mc ) - let result = (c1length / s1length + - c2length / s2length + - (tLength - transpositions) / tLength) - / 3.0 - + + let tLength = Math.Max(c1length, c2length) + + // The jaro distance as given by 1/3 ( m2/|s1| + m1/|s2| + (mc-t)/mc ) + let result = (c1length / float s1.Length + c2length / float s2.Length + (tLength - transpositions) / tLength) / 3.0 + // This is for cases where |s1|, |s2| or m are zero - if System.Double.IsNaN result then 0.0 else result + if Double.IsNaN result then 0.0 else result /// Calculates the Jaro-Winkler edit distance between two strings. /// The edit distance is a metric that allows to measure the amount of similarity between two strings. diff --git a/tests/fsharp/typecheck/sigs/neg01.bsl b/tests/fsharp/typecheck/sigs/neg01.bsl index c9c6d3a4a13..e2a7c05659e 100644 --- a/tests/fsharp/typecheck/sigs/neg01.bsl +++ b/tests/fsharp/typecheck/sigs/neg01.bsl @@ -5,8 +5,8 @@ neg01a.fs(22,8,23,7): typecheck error FS0913: Types cannot contain nested type d neg01b.fs(2,13,2,14): typecheck error FS0039: The value, constructor, namespace or type 'X' is not defined. Maybe you want one of the following: + z + A B - - z diff --git a/tests/fsharp/typecheck/sigs/neg14.bsl b/tests/fsharp/typecheck/sigs/neg14.bsl index 1b4a4c976b9..f10030ee529 100644 --- a/tests/fsharp/typecheck/sigs/neg14.bsl +++ b/tests/fsharp/typecheck/sigs/neg14.bsl @@ -3,8 +3,8 @@ neg14a.fs(9,6,9,33): typecheck error FS0343: The type 'missingInterfaceInSignatu neg14b.fs(2,13,2,14): typecheck error FS0039: The value, constructor, namespace or type 'X' is not defined. Maybe you want one of the following: + z + A B - - z From c212e965a572936e09ef2d0d543a6d197d293ccc Mon Sep 17 00:00:00 2001 From: KevinRansom Date: Tue, 7 Nov 2017 13:46:10 -0800 Subject: [PATCH 106/150] #nsure hosted compiler deploys system.valuetuple --- .../src/HostedCompilerServer/HostedCompilerServer.fsproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj index b102ee15ae3..98c23d8ccea 100644 --- a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj +++ b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj @@ -49,6 +49,10 @@ {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} FSharp.Compiler.Private + + $(FSharpSourcesRoot)\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll + true + From 433b331eca288fd9d31160033a88aeea29fb2d85 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 7 Nov 2017 19:30:31 -0800 Subject: [PATCH 107/150] apply all patches from source-build repo (#3904) --- src/buildfromsource.cmd | 7 +- src/buildfromsource.sh | 4 +- src/buildfromsource/BuildFromSource.targets | 53 +- src/buildfromsource/FSharp.Build/FSBuild.fs | 125 + src/buildfromsource/FSharp.Build/FSBuild.resx | 123 + .../FSharp.Build/FSharp.Build.fsproj | 5 +- .../FSInteractiveSettings.fs | 121 + .../FSInteractiveSettings.resx | 120 + ...Sharp.Compiler.Interactive.Settings.fsproj | 5 +- .../FSharp.Compiler.Private/FSComp.fs | 5701 +++++++++++++++++ .../FSharp.Compiler.Private/FSComp.resx | 4306 +++++++++++++ .../FSharp.Compiler.Private/FSIstrings.fs | 333 + .../FSharp.Compiler.Private/FSIstrings.resx | 279 + .../FSharp.Compiler.Private.fsproj | 14 +- .../FSharp.Compiler.nuget.fsproj | 4 +- src/buildfromsource/NuGet.config | 8 + .../buildtools/fslex/fslex.fsproj | 14 + .../buildtools/fsyacc/fsyacc.fsproj | 14 + 18 files changed, 11169 insertions(+), 67 deletions(-) create mode 100644 src/buildfromsource/FSharp.Build/FSBuild.fs create mode 100644 src/buildfromsource/FSharp.Build/FSBuild.resx create mode 100644 src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.fs create mode 100644 src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.resx create mode 100644 src/buildfromsource/FSharp.Compiler.Private/FSComp.fs create mode 100644 src/buildfromsource/FSharp.Compiler.Private/FSComp.resx create mode 100644 src/buildfromsource/FSharp.Compiler.Private/FSIstrings.fs create mode 100644 src/buildfromsource/FSharp.Compiler.Private/FSIstrings.resx create mode 100644 src/buildfromsource/NuGet.config create mode 100644 src/buildfromsource/buildtools/fslex/fslex.fsproj create mode 100644 src/buildfromsource/buildtools/fsyacc/fsyacc.fsproj diff --git a/src/buildfromsource.cmd b/src/buildfromsource.cmd index b18f616f0cb..3cb67b19a34 100644 --- a/src/buildfromsource.cmd +++ b/src/buildfromsource.cmd @@ -3,11 +3,6 @@ set __scriptpath=%~dp0 rem build tools -dotnet restore %__scriptpath%buildtools\fssrgen\fssrgen.fsproj -if ERRORLEVEL 1 echo Error: failed && goto :failure -dotnet publish %__scriptpath%buildtools\fssrgen\fssrgen.fsproj -o %__scriptpath%..\Tools\fssrgen -if ERRORLEVEL 1 echo Error: failed && goto :failure - dotnet restore %__scriptpath%buildtools\fslex\fslex.fsproj if ERRORLEVEL 1 echo Error: failed && goto :failure dotnet publish %__scriptpath%buildtools\fslex\fslex.fsproj -o %__scriptpath%..\Tools\fslex @@ -20,7 +15,7 @@ if ERRORLEVEL 1 echo Error: failed && goto :failure rem build and pack tools dotnet restore %__scriptpath%buildfromsource\FSharp.Compiler.nuget\FSharp.Compiler.nuget.fsproj if ERRORLEVEL 1 echo Error: failed && goto :failure -dotnet pack %__scriptpath%buildfromsource\FSharp.Compiler.nuget\FSharp.Compiler.nuget.fsproj -c debug +dotnet pack %__scriptpath%buildfromsource\FSharp.Compiler.nuget\FSharp.Compiler.nuget.fsproj -c Release if ERRORLEVEL 1 echo Error: failed && goto :failure goto :success diff --git a/src/buildfromsource.sh b/src/buildfromsource.sh index ac21542c307..b12189ad0ae 100755 --- a/src/buildfromsource.sh +++ b/src/buildfromsource.sh @@ -3,8 +3,6 @@ __scriptpath=$(cd "$(dirname "$0")"; pwd -P) # build tools -dotnet restore $__scriptpath/buildtools/fssrgen/fssrgen.fsproj -dotnet publish $__scriptpath/buildtools/fssrgen/fssrgen.fsproj -o $__scriptpath/../Tools/fssrgen dotnet restore $__scriptpath/buildtools/fslex/fslex.fsproj dotnet publish $__scriptpath/buildtools/fslex/fslex.fsproj -o $__scriptpath/../Tools/fslex dotnet restore $__scriptpath/buildtools/fsyacc/fsyacc.fsproj @@ -22,4 +20,4 @@ dotnet publish $__scriptpath/buildfromsource/Fsc/Fsc.fsproj # build and pack tools dotnet restore $__scriptpath/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj -dotnet pack $__scriptpath/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj -c release +dotnet pack $__scriptpath/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj -c Release diff --git a/src/buildfromsource/BuildFromSource.targets b/src/buildfromsource/BuildFromSource.targets index a42e1bd56de..e69d5959276 100644 --- a/src/buildfromsource/BuildFromSource.targets +++ b/src/buildfromsource/BuildFromSource.targets @@ -43,55 +43,12 @@ Condition="'$(DesignTimeBuild)' != 'true'"> - - - $([System.Text.RegularExpressions.Regex]::Replace($([System.IO.File]::ReadAllText("%(CopyAndSubstituteText.FullPath)")), "%(CopyAndSubstituteText.Pattern1)", "%(CopyAndSubstituteText.Replacement1)")) - - - $([System.Text.RegularExpressions.Regex]::Replace($(FileText), "%(CopyAndSubstituteText.Pattern2)", "%(CopyAndSubstituteText.Replacement2)")) - - - - - - - - - - - - $(MSBuildThisFileDirectory)../../Tools/fssrgen/fssrgen.dll - - - - - - - - - - - - - - - - - %(FsSrGen.Filename) - Resx - false - + + $([System.Text.RegularExpressions.Regex]::Replace($([System.IO.File]::ReadAllText("%(CopyAndSubstituteText.FullPath)")), "%(CopyAndSubstituteText.Pattern1)", "%(CopyAndSubstituteText.Replacement1)")) + $([System.Text.RegularExpressions.Regex]::Replace($(FileText), "%(CopyAndSubstituteText.Pattern2)", "%(CopyAndSubstituteText.Replacement2)")) + + diff --git a/src/buildfromsource/FSharp.Build/FSBuild.fs b/src/buildfromsource/FSharp.Build/FSBuild.fs new file mode 100644 index 00000000000..f4e36cd07a1 --- /dev/null +++ b/src/buildfromsource/FSharp.Build/FSBuild.fs @@ -0,0 +1,125 @@ +// This is a generated file; the original input is 'FSBuild.txt' +namespace FSBuild + +open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators +open Microsoft.FSharp.Reflection +open System.Reflection +// (namespaces below for specific case of using the tool to compile FSharp.Core itself) +open Microsoft.FSharp.Core +open Microsoft.FSharp.Core.Operators +open Microsoft.FSharp.Text +open Microsoft.FSharp.Collections +open Printf + +type internal SR private() = + + // BEGIN BOILERPLATE + + static let getCurrentAssembly () = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + typeof.GetTypeInfo().Assembly + #else + System.Reflection.Assembly.GetExecutingAssembly() + #endif + + static let getTypeInfo (t: System.Type) = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + t.GetTypeInfo() + #else + t + #endif + + static let resources = lazy (new System.Resources.ResourceManager("FSBuild", getCurrentAssembly())) + + static let GetString(name:string) = + let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) + #if DEBUG + if null = s then + System.Diagnostics.Debug.Assert(false, sprintf "**RESOURCE ERROR**: Resource token %s does not exist!" name) + #endif + s + + static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = + FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) + + static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() + + static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) + static let isFunctionType (ty1:System.Type) = + isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) + + static let rec destFunTy (ty:System.Type) = + if isFunctionType ty then + ty, ty.GetGenericArguments() + else + match getTypeInfo(ty).BaseType with + | null -> failwith "destFunTy: not a function type" + | b -> destFunTy b + + static let buildFunctionForOneArgPat (ty: System.Type) impl = + let _,tys = destFunTy ty + let rty = tys.[1] + // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf "%x"') + mkFunctionValue tys (fun inp -> impl rty inp) + + static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = + match fmt.[i] with + | '%' -> go args ty (i+1) + | 'd' + | 'f' + | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) + | _ -> failwith "bad format specifier" + + // newlines and tabs get converted to strings when read from a resource file + // this will preserve their original intention + static let postProcessString (s : string) = + s.Replace("\\n","\n").Replace("\\t","\t").Replace("\\r","\r").Replace("\\\"", "\"") + + static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = + let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt + let len = fmt.Length + + /// Function to capture the arguments and then run. + let rec capture args ty i = + if i >= len || (fmt.[i] = '%' && i+1 >= len) then + let b = new System.Text.StringBuilder() + b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore + box(b.ToString()) + // REVIEW: For these purposes, this should be a nop, but I'm leaving it + // in incase we ever decide to support labels for the error format string + // E.g., "%s%d" + elif System.Char.IsSurrogatePair(fmt,i) then + capture args ty (i+2) + else + match fmt.[i] with + | '%' -> + let i = i+1 + capture1 fmt i args ty capture + | _ -> + capture args ty (i+1) + + (unbox (capture [] (typeof<'T>) 0) : 'T) + + static let mutable swallowResourceText = false + + static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = + if swallowResourceText then + sprintf fmt + else + let mutable messageString = GetString(messageID) + messageString <- postProcessString messageString + createMessageString messageString fmt + + /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). + static member SwallowResourceText with get () = swallowResourceText + and set (b) = swallowResourceText <- b + // END BOILERPLATE + + /// ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. + /// (Originally from FSBuild.txt:2) + static member toolpathUnknown() = (GetStringFunc("toolpathUnknown",",,,") ) + + /// Call this method once to validate that all known resources are valid; throws if not + static member RunStartupValidation() = + ignore(GetString("toolpathUnknown")) + () diff --git a/src/buildfromsource/FSharp.Build/FSBuild.resx b/src/buildfromsource/FSharp.Build/FSBuild.resx new file mode 100644 index 00000000000..8ea57effe4b --- /dev/null +++ b/src/buildfromsource/FSharp.Build/FSBuild.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. + + \ No newline at end of file diff --git a/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj b/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj index 0d7c7c06cc3..42febe9c5a5 100644 --- a/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj +++ b/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj @@ -13,7 +13,10 @@ - + + FSBuild.resx + + diff --git a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.fs b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.fs new file mode 100644 index 00000000000..bc255ecfc74 --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.fs @@ -0,0 +1,121 @@ +// This is a generated file; the original input is '..\FSInteractiveSettings.txt' +namespace FSInteractiveSettings + +open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators +open Microsoft.FSharp.Reflection +open System.Reflection +// (namespaces below for specific case of using the tool to compile FSharp.Core itself) +open Microsoft.FSharp.Core +open Microsoft.FSharp.Core.Operators +open Microsoft.FSharp.Text +open Microsoft.FSharp.Collections +open Printf + +type internal SR private() = + + // BEGIN BOILERPLATE + + static let getCurrentAssembly () = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + typeof.GetTypeInfo().Assembly + #else + System.Reflection.Assembly.GetExecutingAssembly() + #endif + + static let getTypeInfo (t: System.Type) = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + t.GetTypeInfo() + #else + t + #endif + + static let resources = lazy (new System.Resources.ResourceManager("FSInteractiveSettings", getCurrentAssembly())) + + static let GetString(name:string) = + let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) + #if DEBUG + if null = s then + System.Diagnostics.Debug.Assert(false, sprintf "**RESOURCE ERROR**: Resource token %s does not exist!" name) + #endif + s + + static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = + FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) + + static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() + + static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) + static let isFunctionType (ty1:System.Type) = + isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) + + static let rec destFunTy (ty:System.Type) = + if isFunctionType ty then + ty, ty.GetGenericArguments() + else + match getTypeInfo(ty).BaseType with + | null -> failwith "destFunTy: not a function type" + | b -> destFunTy b + + static let buildFunctionForOneArgPat (ty: System.Type) impl = + let _,tys = destFunTy ty + let rty = tys.[1] + // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf "%x"') + mkFunctionValue tys (fun inp -> impl rty inp) + + static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = + match fmt.[i] with + | '%' -> go args ty (i+1) + | 'd' + | 'f' + | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) + | _ -> failwith "bad format specifier" + + // newlines and tabs get converted to strings when read from a resource file + // this will preserve their original intention + static let postProcessString (s : string) = + s.Replace("\\n","\n").Replace("\\t","\t").Replace("\\r","\r").Replace("\\\"", "\"") + + static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = + let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt + let len = fmt.Length + + /// Function to capture the arguments and then run. + let rec capture args ty i = + if i >= len || (fmt.[i] = '%' && i+1 >= len) then + let b = new System.Text.StringBuilder() + b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore + box(b.ToString()) + // REVIEW: For these purposes, this should be a nop, but I'm leaving it + // in incase we ever decide to support labels for the error format string + // E.g., "%s%d" + elif System.Char.IsSurrogatePair(fmt,i) then + capture args ty (i+2) + else + match fmt.[i] with + | '%' -> + let i = i+1 + capture1 fmt i args ty capture + | _ -> + capture args ty (i+1) + + (unbox (capture [] (typeof<'T>) 0) : 'T) + + static let mutable swallowResourceText = false + + static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = + if swallowResourceText then + sprintf fmt + else + let mutable messageString = GetString(messageID) + messageString <- postProcessString messageString + createMessageString messageString fmt + + /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). + static member SwallowResourceText with get () = swallowResourceText + and set (b) = swallowResourceText <- b + // END BOILERPLATE + + + /// Call this method once to validate that all known resources are valid; throws if not + static member RunStartupValidation() = + () diff --git a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.resx b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.resx new file mode 100644 index 00000000000..62a9bb5b850 --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSInteractiveSettings.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj index cc34966a10c..a8c1de7f177 100644 --- a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj @@ -15,7 +15,10 @@ - + + FSInteractiveSettings.resx + + diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs new file mode 100644 index 00000000000..abc321272d5 --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -0,0 +1,5701 @@ +// This is a generated file; the original input is '..\FSComp.txt' +namespace FSComp + +open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators +open Microsoft.FSharp.Reflection +open System.Reflection +// (namespaces below for specific case of using the tool to compile FSharp.Core itself) +open Microsoft.FSharp.Core +open Microsoft.FSharp.Core.Operators +open Microsoft.FSharp.Text +open Microsoft.FSharp.Collections +open Printf + +type internal SR private() = + + // BEGIN BOILERPLATE + + static let getCurrentAssembly () = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + typeof.GetTypeInfo().Assembly + #else + System.Reflection.Assembly.GetExecutingAssembly() + #endif + + static let getTypeInfo (t: System.Type) = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + t.GetTypeInfo() + #else + t + #endif + + static let resources = lazy (new System.Resources.ResourceManager("FSComp", getCurrentAssembly())) + + static let GetString(name:string) = + let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) + #if DEBUG + if null = s then + System.Diagnostics.Debug.Assert(false, sprintf "**RESOURCE ERROR**: Resource token %s does not exist!" name) + #endif + s + + static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = + FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) + + static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() + + static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) + static let isFunctionType (ty1:System.Type) = + isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) + + static let rec destFunTy (ty:System.Type) = + if isFunctionType ty then + ty, ty.GetGenericArguments() + else + match getTypeInfo(ty).BaseType with + | null -> failwith "destFunTy: not a function type" + | b -> destFunTy b + + static let buildFunctionForOneArgPat (ty: System.Type) impl = + let _,tys = destFunTy ty + let rty = tys.[1] + // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf "%x"') + mkFunctionValue tys (fun inp -> impl rty inp) + + static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = + match fmt.[i] with + | '%' -> go args ty (i+1) + | 'd' + | 'f' + | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) + | _ -> failwith "bad format specifier" + + // newlines and tabs get converted to strings when read from a resource file + // this will preserve their original intention + static let postProcessString (s : string) = + s.Replace("\\n","\n").Replace("\\t","\t").Replace("\\r","\r").Replace("\\\"", "\"") + + static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = + let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt + let len = fmt.Length + + /// Function to capture the arguments and then run. + let rec capture args ty i = + if i >= len || (fmt.[i] = '%' && i+1 >= len) then + let b = new System.Text.StringBuilder() + b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore + box(b.ToString()) + // REVIEW: For these purposes, this should be a nop, but I'm leaving it + // in incase we ever decide to support labels for the error format string + // E.g., "%s%d" + elif System.Char.IsSurrogatePair(fmt,i) then + capture args ty (i+2) + else + match fmt.[i] with + | '%' -> + let i = i+1 + capture1 fmt i args ty capture + | _ -> + capture args ty (i+1) + + (unbox (capture [] (typeof<'T>) 0) : 'T) + + static let mutable swallowResourceText = false + + static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = + if swallowResourceText then + sprintf fmt + else + let mutable messageString = GetString(messageID) + messageString <- postProcessString messageString + createMessageString messageString fmt + + /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). + static member SwallowResourceText with get () = swallowResourceText + and set (b) = swallowResourceText <- b + // END BOILERPLATE + + /// The namespace '%s' is not defined. + /// (Originally from ..\FSComp.txt:4) + static member undefinedNameNamespace(a0 : System.String) = (GetStringFunc("undefinedNameNamespace",",,,%s,,,") a0) + /// The namespace or module '%s' is not defined. + /// (Originally from ..\FSComp.txt:5) + static member undefinedNameNamespaceOrModule(a0 : System.String) = (GetStringFunc("undefinedNameNamespaceOrModule",",,,%s,,,") a0) + /// The field, constructor or member '%s' is not defined. + /// (Originally from ..\FSComp.txt:6) + static member undefinedNameFieldConstructorOrMember(a0 : System.String) = (GetStringFunc("undefinedNameFieldConstructorOrMember",",,,%s,,,") a0) + /// The value, constructor, namespace or type '%s' is not defined. + /// (Originally from ..\FSComp.txt:7) + static member undefinedNameValueConstructorNamespaceOrType(a0 : System.String) = (GetStringFunc("undefinedNameValueConstructorNamespaceOrType",",,,%s,,,") a0) + /// The value or constructor '%s' is not defined. + /// (Originally from ..\FSComp.txt:8) + static member undefinedNameValueOfConstructor(a0 : System.String) = (GetStringFunc("undefinedNameValueOfConstructor",",,,%s,,,") a0) + /// The value, namespace, type or module '%s' is not defined. + /// (Originally from ..\FSComp.txt:9) + static member undefinedNameValueNamespaceTypeOrModule(a0 : System.String) = (GetStringFunc("undefinedNameValueNamespaceTypeOrModule",",,,%s,,,") a0) + /// The constructor, module or namespace '%s' is not defined. + /// (Originally from ..\FSComp.txt:10) + static member undefinedNameConstructorModuleOrNamespace(a0 : System.String) = (GetStringFunc("undefinedNameConstructorModuleOrNamespace",",,,%s,,,") a0) + /// The type '%s' is not defined. + /// (Originally from ..\FSComp.txt:11) + static member undefinedNameType(a0 : System.String) = (GetStringFunc("undefinedNameType",",,,%s,,,") a0) + /// The type '%s' is not defined in '%s'. + /// (Originally from ..\FSComp.txt:12) + static member undefinedNameTypeIn(a0 : System.String, a1 : System.String) = (GetStringFunc("undefinedNameTypeIn",",,,%s,,,%s,,,") a0 a1) + /// The record label or namespace '%s' is not defined. + /// (Originally from ..\FSComp.txt:13) + static member undefinedNameRecordLabelOrNamespace(a0 : System.String) = (GetStringFunc("undefinedNameRecordLabelOrNamespace",",,,%s,,,") a0) + /// The record label '%s' is not defined. + /// (Originally from ..\FSComp.txt:14) + static member undefinedNameRecordLabel(a0 : System.String) = (GetStringFunc("undefinedNameRecordLabel",",,,%s,,,") a0) + /// Maybe you want one of the following: + /// (Originally from ..\FSComp.txt:15) + static member undefinedNameSuggestionsIntro() = (GetStringFunc("undefinedNameSuggestionsIntro",",,,") ) + /// The type parameter %s is not defined. + /// (Originally from ..\FSComp.txt:16) + static member undefinedNameTypeParameter(a0 : System.String) = (GetStringFunc("undefinedNameTypeParameter",",,,%s,,,") a0) + /// The pattern discriminator '%s' is not defined. + /// (Originally from ..\FSComp.txt:17) + static member undefinedNamePatternDiscriminator(a0 : System.String) = (GetStringFunc("undefinedNamePatternDiscriminator",",,,%s,,,") a0) + /// Replace with '%s' + /// (Originally from ..\FSComp.txt:18) + static member replaceWithSuggestion(a0 : System.String) = (GetStringFunc("replaceWithSuggestion",",,,%s,,,") a0) + /// Add . for indexer access. + /// (Originally from ..\FSComp.txt:19) + static member addIndexerDot() = (GetStringFunc("addIndexerDot",",,,") ) + /// All elements of a list constructor expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. + /// (Originally from ..\FSComp.txt:20) + static member listElementHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("listElementHasWrongType",",,,%s,,,%s,,,") a0 a1) + /// All elements of an array constructor expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. + /// (Originally from ..\FSComp.txt:21) + static member arrayElementHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("arrayElementHasWrongType",",,,%s,,,%s,,,") a0 a1) + /// The 'if' expression is missing an 'else' branch. The 'then' branch has type '%s'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type. + /// (Originally from ..\FSComp.txt:22) + static member missingElseBranch(a0 : System.String) = (GetStringFunc("missingElseBranch",",,,%s,,,") a0) + /// The 'if' expression needs to have type '%s' to satisfy context type requirements. It currently has type '%s'. + /// (Originally from ..\FSComp.txt:23) + static member ifExpression(a0 : System.String, a1 : System.String) = (GetStringFunc("ifExpression",",,,%s,,,%s,,,") a0 a1) + /// All branches of an 'if' expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. + /// (Originally from ..\FSComp.txt:24) + static member elseBranchHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("elseBranchHasWrongType",",,,%s,,,%s,,,") a0 a1) + /// All branches of a pattern match expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. + /// (Originally from ..\FSComp.txt:25) + static member followingPatternMatchClauseHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("followingPatternMatchClauseHasWrongType",",,,%s,,,%s,,,") a0 a1) + /// A pattern match guard must be of type 'bool', but this 'when' expression is of type '%s'. + /// (Originally from ..\FSComp.txt:26) + static member patternMatchGuardIsNotBool(a0 : System.String) = (GetStringFunc("patternMatchGuardIsNotBool",",,,%s,,,") a0) + /// A ';' is used to separate field values in records. Consider replacing ',' with ';'. + /// (Originally from ..\FSComp.txt:27) + static member commaInsteadOfSemicolonInRecord() = (GetStringFunc("commaInsteadOfSemicolonInRecord",",,,") ) + /// The '!' operator is used to dereference a ref cell. Consider using 'not expr' here. + /// (Originally from ..\FSComp.txt:28) + static member derefInsteadOfNot() = (GetStringFunc("derefInsteadOfNot",",,,") ) + /// The non-generic type '%s' does not expect any type arguments, but here is given %d type argument(s) + /// (Originally from ..\FSComp.txt:29) + static member buildUnexpectedTypeArgs(a0 : System.String, a1 : System.Int32) = (GetStringFunc("buildUnexpectedTypeArgs",",,,%s,,,%d,,,") a0 a1) + /// Consider using 'return!' instead of 'return'. + /// (Originally from ..\FSComp.txt:30) + static member returnUsedInsteadOfReturnBang() = (GetStringFunc("returnUsedInsteadOfReturnBang",",,,") ) + /// Consider using 'yield!' instead of 'yield'. + /// (Originally from ..\FSComp.txt:31) + static member yieldUsedInsteadOfYieldBang() = (GetStringFunc("yieldUsedInsteadOfYieldBang",",,,") ) + /// \nA tuple type is required for one or more arguments. Consider wrapping the given arguments in additional parentheses or review the definition of the interface. + /// (Originally from ..\FSComp.txt:32) + static member tupleRequiredInAbstractMethod() = (GetStringFunc("tupleRequiredInAbstractMethod",",,,") ) + /// Invalid warning number '%s' + /// (Originally from ..\FSComp.txt:33) + static member buildInvalidWarningNumber(a0 : System.String) = (203, GetStringFunc("buildInvalidWarningNumber",",,,%s,,,") a0) + /// Invalid version string '%s' + /// (Originally from ..\FSComp.txt:34) + static member buildInvalidVersionString(a0 : System.String) = (204, GetStringFunc("buildInvalidVersionString",",,,%s,,,") a0) + /// Invalid version file '%s' + /// (Originally from ..\FSComp.txt:35) + static member buildInvalidVersionFile(a0 : System.String) = (205, GetStringFunc("buildInvalidVersionFile",",,,%s,,,") a0) + /// Microsoft (R) F# Compiler version %s + /// (Originally from ..\FSComp.txt:36) + static member buildProductName(a0 : System.String) = (GetStringFunc("buildProductName",",,,%s,,,") a0) + /// F# Compiler for F# %s + /// (Originally from ..\FSComp.txt:37) + static member buildProductNameCommunity(a0 : System.String) = (GetStringFunc("buildProductNameCommunity",",,,%s,,,") a0) + /// Problem with filename '%s': %s + /// (Originally from ..\FSComp.txt:38) + static member buildProblemWithFilename(a0 : System.String, a1 : System.String) = (206, GetStringFunc("buildProblemWithFilename",",,,%s,,,%s,,,") a0 a1) + /// No inputs specified + /// (Originally from ..\FSComp.txt:39) + static member buildNoInputsSpecified() = (207, GetStringFunc("buildNoInputsSpecified",",,,") ) + /// The '--pdb' option requires the '--debug' option to be used + /// (Originally from ..\FSComp.txt:40) + static member buildPdbRequiresDebug() = (209, GetStringFunc("buildPdbRequiresDebug",",,,") ) + /// The search directory '%s' is invalid + /// (Originally from ..\FSComp.txt:41) + static member buildInvalidSearchDirectory(a0 : System.String) = (210, GetStringFunc("buildInvalidSearchDirectory",",,,%s,,,") a0) + /// The search directory '%s' could not be found + /// (Originally from ..\FSComp.txt:42) + static member buildSearchDirectoryNotFound(a0 : System.String) = (211, GetStringFunc("buildSearchDirectoryNotFound",",,,%s,,,") a0) + /// '%s' is not a valid filename + /// (Originally from ..\FSComp.txt:43) + static member buildInvalidFilename(a0 : System.String) = (212, GetStringFunc("buildInvalidFilename",",,,%s,,,") a0) + /// '%s' is not a valid assembly name + /// (Originally from ..\FSComp.txt:44) + static member buildInvalidAssemblyName(a0 : System.String) = (213, GetStringFunc("buildInvalidAssemblyName",",,,%s,,,") a0) + /// Unrecognized privacy setting '%s' for managed resource, valid options are 'public' and 'private' + /// (Originally from ..\FSComp.txt:45) + static member buildInvalidPrivacy(a0 : System.String) = (214, GetStringFunc("buildInvalidPrivacy",",,,%s,,,") a0) + /// Multiple references to '%s.dll' are not permitted + /// (Originally from ..\FSComp.txt:46) + static member buildMultipleReferencesNotAllowed(a0 : System.String) = (215, GetStringFunc("buildMultipleReferencesNotAllowed",",,,%s,,,") a0) + /// Could not read version from mscorlib.dll + /// (Originally from ..\FSComp.txt:47) + static member buildCouldNotReadVersionInfoFromMscorlib() = (GetStringFunc("buildCouldNotReadVersionInfoFromMscorlib",",,,") ) + /// Unable to read assembly '%s' + /// (Originally from ..\FSComp.txt:48) + static member buildCannotReadAssembly(a0 : System.String) = (218, GetStringFunc("buildCannotReadAssembly",",,,%s,,,") a0) + /// Assembly resolution failure at or near this location + /// (Originally from ..\FSComp.txt:49) + static member buildAssemblyResolutionFailed() = (220, GetStringFunc("buildAssemblyResolutionFailed",",,,") ) + /// The declarations in this file will be placed in an implicit module '%s' based on the file name '%s'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file. + /// (Originally from ..\FSComp.txt:50) + static member buildImplicitModuleIsNotLegalIdentifier(a0 : System.String, a1 : System.String) = (221, GetStringFunc("buildImplicitModuleIsNotLegalIdentifier",",,,%s,,,%s,,,") a0 a1) + /// Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration. + /// (Originally from ..\FSComp.txt:51) + static member buildMultiFileRequiresNamespaceOrModule() = (222, GetStringFunc("buildMultiFileRequiresNamespaceOrModule",",,,") ) + /// Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error. + /// (Originally from ..\FSComp.txt:52) + static member noEqualSignAfterModule() = (222, GetStringFunc("noEqualSignAfterModule",",,,") ) + /// This file contains multiple declarations of the form 'module SomeNamespace.SomeModule'. Only one declaration of this form is permitted in a file. Change your file to use an initial namespace declaration and/or use 'module ModuleName = ...' to define your modules. + /// (Originally from ..\FSComp.txt:53) + static member buildMultipleToplevelModules() = (223, GetStringFunc("buildMultipleToplevelModules",",,,") ) + /// Option requires parameter: %s + /// (Originally from ..\FSComp.txt:54) + static member buildOptionRequiresParameter(a0 : System.String) = (224, GetStringFunc("buildOptionRequiresParameter",",,,%s,,,") a0) + /// Source file '%s' could not be found + /// (Originally from ..\FSComp.txt:55) + static member buildCouldNotFindSourceFile(a0 : System.String) = (225, GetStringFunc("buildCouldNotFindSourceFile",",,,%s,,,") a0) + /// The file extension of '%s' is not recognized. Source files must have extension .fs, .fsi, .fsx, .fsscript, .ml or .mli. + /// (Originally from ..\FSComp.txt:56) + static member buildInvalidSourceFileExtension(a0 : System.String) = (226, GetStringFunc("buildInvalidSourceFileExtension",",,,%s,,,") a0) + /// Could not resolve assembly '%s' + /// (Originally from ..\FSComp.txt:57) + static member buildCouldNotResolveAssembly(a0 : System.String) = (227, GetStringFunc("buildCouldNotResolveAssembly",",,,%s,,,") a0) + /// Could not resolve assembly '%s' required by '%s' + /// (Originally from ..\FSComp.txt:58) + static member buildCouldNotResolveAssemblyRequiredByFile(a0 : System.String, a1 : System.String) = (228, GetStringFunc("buildCouldNotResolveAssemblyRequiredByFile",",,,%s,,,%s,,,") a0 a1) + /// Error opening binary file '%s': %s + /// (Originally from ..\FSComp.txt:59) + static member buildErrorOpeningBinaryFile(a0 : System.String, a1 : System.String) = (229, GetStringFunc("buildErrorOpeningBinaryFile",",,,%s,,,%s,,,") a0 a1) + /// The F#-compiled DLL '%s' needs to be recompiled to be used with this version of F# + /// (Originally from ..\FSComp.txt:60) + static member buildDifferentVersionMustRecompile(a0 : System.String) = (231, GetStringFunc("buildDifferentVersionMustRecompile",",,,%s,,,") a0) + /// Invalid directive. Expected '#I \"\"'. + /// (Originally from ..\FSComp.txt:61) + static member buildInvalidHashIDirective() = (232, GetStringFunc("buildInvalidHashIDirective",",,,") ) + /// Invalid directive. Expected '#r \"\"'. + /// (Originally from ..\FSComp.txt:62) + static member buildInvalidHashrDirective() = (233, GetStringFunc("buildInvalidHashrDirective",",,,") ) + /// Invalid directive. Expected '#load \"\" ... \"\"'. + /// (Originally from ..\FSComp.txt:63) + static member buildInvalidHashloadDirective() = (234, GetStringFunc("buildInvalidHashloadDirective",",,,") ) + /// Invalid directive. Expected '#time', '#time \"on\"' or '#time \"off\"'. + /// (Originally from ..\FSComp.txt:64) + static member buildInvalidHashtimeDirective() = (235, GetStringFunc("buildInvalidHashtimeDirective",",,,") ) + /// Directives inside modules are ignored + /// (Originally from ..\FSComp.txt:65) + static member buildDirectivesInModulesAreIgnored() = (236, GetStringFunc("buildDirectivesInModulesAreIgnored",",,,") ) + /// A signature for the file or module '%s' has already been specified + /// (Originally from ..\FSComp.txt:66) + static member buildSignatureAlreadySpecified(a0 : System.String) = (237, GetStringFunc("buildSignatureAlreadySpecified",",,,%s,,,") a0) + /// An implementation of file or module '%s' has already been given. Compilation order is significant in F# because of type inference. You may need to adjust the order of your files to place the signature file before the implementation. In Visual Studio files are type-checked in the order they appear in the project file, which can be edited manually or adjusted using the solution explorer. + /// (Originally from ..\FSComp.txt:67) + static member buildImplementationAlreadyGivenDetail(a0 : System.String) = (238, GetStringFunc("buildImplementationAlreadyGivenDetail",",,,%s,,,") a0) + /// An implementation of the file or module '%s' has already been given + /// (Originally from ..\FSComp.txt:68) + static member buildImplementationAlreadyGiven(a0 : System.String) = (239, GetStringFunc("buildImplementationAlreadyGiven",",,,%s,,,") a0) + /// The signature file '%s' does not have a corresponding implementation file. If an implementation file exists then check the 'module' and 'namespace' declarations in the signature and implementation files match. + /// (Originally from ..\FSComp.txt:69) + static member buildSignatureWithoutImplementation(a0 : System.String) = (240, GetStringFunc("buildSignatureWithoutImplementation",",,,%s,,,") a0) + /// '%s' is not a valid integer argument + /// (Originally from ..\FSComp.txt:70) + static member buildArgInvalidInt(a0 : System.String) = (241, GetStringFunc("buildArgInvalidInt",",,,%s,,,") a0) + /// '%s' is not a valid floating point argument + /// (Originally from ..\FSComp.txt:71) + static member buildArgInvalidFloat(a0 : System.String) = (242, GetStringFunc("buildArgInvalidFloat",",,,%s,,,") a0) + /// Unrecognized option: '%s' + /// (Originally from ..\FSComp.txt:72) + static member buildUnrecognizedOption(a0 : System.String) = (243, GetStringFunc("buildUnrecognizedOption",",,,%s,,,") a0) + /// Invalid module or namespace name + /// (Originally from ..\FSComp.txt:73) + static member buildInvalidModuleOrNamespaceName() = (244, GetStringFunc("buildInvalidModuleOrNamespaceName",",,,") ) + /// Error reading/writing metadata for the F# compiled DLL '%s'. Was the DLL compiled with an earlier version of the F# compiler? (error: '%s'). + /// (Originally from ..\FSComp.txt:74) + static member pickleErrorReadingWritingMetadata(a0 : System.String, a1 : System.String) = (GetStringFunc("pickleErrorReadingWritingMetadata",",,,%s,,,%s,,,") a0 a1) + /// The type/module '%s' is not a concrete module or type + /// (Originally from ..\FSComp.txt:75) + static member tastTypeOrModuleNotConcrete(a0 : System.String) = (245, GetStringFunc("tastTypeOrModuleNotConcrete",",,,%s,,,") a0) + /// The type '%s' has an inline assembly code representation + /// (Originally from ..\FSComp.txt:76) + static member tastTypeHasAssemblyCodeRepresentation(a0 : System.String) = (GetStringFunc("tastTypeHasAssemblyCodeRepresentation",",,,%s,,,") a0) + /// A namespace and a module named '%s' both occur in two parts of this assembly + /// (Originally from ..\FSComp.txt:77) + static member tastNamespaceAndModuleWithSameNameInAssembly(a0 : System.String) = (247, GetStringFunc("tastNamespaceAndModuleWithSameNameInAssembly",",,,%s,,,") a0) + /// Two modules named '%s' occur in two parts of this assembly + /// (Originally from ..\FSComp.txt:78) + static member tastTwoModulesWithSameNameInAssembly(a0 : System.String) = (248, GetStringFunc("tastTwoModulesWithSameNameInAssembly",",,,%s,,,") a0) + /// Two type definitions named '%s' occur in namespace '%s' in two parts of this assembly + /// (Originally from ..\FSComp.txt:79) + static member tastDuplicateTypeDefinitionInAssembly(a0 : System.String, a1 : System.String) = (249, GetStringFunc("tastDuplicateTypeDefinitionInAssembly",",,,%s,,,%s,,,") a0 a1) + /// A module and a type definition named '%s' occur in namespace '%s' in two parts of this assembly + /// (Originally from ..\FSComp.txt:80) + static member tastConflictingModuleAndTypeDefinitionInAssembly(a0 : System.String, a1 : System.String) = (250, GetStringFunc("tastConflictingModuleAndTypeDefinitionInAssembly",",,,%s,,,%s,,,") a0 a1) + /// Invalid member signature encountered because of an earlier error + /// (Originally from ..\FSComp.txt:81) + static member tastInvalidMemberSignature() = (251, GetStringFunc("tastInvalidMemberSignature",",,,") ) + /// This value does not have a valid property setter type + /// (Originally from ..\FSComp.txt:82) + static member tastValueDoesNotHaveSetterType() = (252, GetStringFunc("tastValueDoesNotHaveSetterType",",,,") ) + /// Invalid form for a property getter. At least one '()' argument is required when using the explicit syntax. + /// (Originally from ..\FSComp.txt:83) + static member tastInvalidFormForPropertyGetter() = (253, GetStringFunc("tastInvalidFormForPropertyGetter",",,,") ) + /// Invalid form for a property setter. At least one argument is required. + /// (Originally from ..\FSComp.txt:84) + static member tastInvalidFormForPropertySetter() = (254, GetStringFunc("tastInvalidFormForPropertySetter",",,,") ) + /// Unexpected use of a byref-typed variable + /// (Originally from ..\FSComp.txt:85) + static member tastUnexpectedByRef() = (255, GetStringFunc("tastUnexpectedByRef",",,,") ) + /// A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' + /// (Originally from ..\FSComp.txt:86) + static member tastValueMustBeLocalAndMutable() = (256, GetStringFunc("tastValueMustBeLocalAndMutable",",,,") ) + /// Invalid mutation of a constant expression. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...'. + /// (Originally from ..\FSComp.txt:87) + static member tastInvalidMutationOfConstant() = (257, GetStringFunc("tastInvalidMutationOfConstant",",,,") ) + /// The value has been copied to ensure the original is not mutated by this operation or because the copy is implicit when returning a struct from a member and another member is then accessed + /// (Originally from ..\FSComp.txt:88) + static member tastValueHasBeenCopied() = (GetStringFunc("tastValueHasBeenCopied",",,,") ) + /// Recursively defined values cannot appear directly as part of the construction of a tuple value within a recursive binding + /// (Originally from ..\FSComp.txt:89) + static member tastRecursiveValuesMayNotBeInConstructionOfTuple() = (259, GetStringFunc("tastRecursiveValuesMayNotBeInConstructionOfTuple",",,,") ) + /// Recursive values cannot appear directly as a construction of the type '%s' within a recursive binding. This feature has been removed from the F# language. Consider using a record instead. + /// (Originally from ..\FSComp.txt:90) + static member tastRecursiveValuesMayNotAppearInConstructionOfType(a0 : System.String) = (260, GetStringFunc("tastRecursiveValuesMayNotAppearInConstructionOfType",",,,%s,,,") a0) + /// Recursive values cannot be directly assigned to the non-mutable field '%s' of the type '%s' within a recursive binding. Consider using a mutable field instead. + /// (Originally from ..\FSComp.txt:91) + static member tastRecursiveValuesMayNotBeAssignedToNonMutableField(a0 : System.String, a1 : System.String) = (261, GetStringFunc("tastRecursiveValuesMayNotBeAssignedToNonMutableField",",,,%s,,,%s,,,") a0 a1) + /// Unexpected decode of AutoOpenAttribute + /// (Originally from ..\FSComp.txt:92) + static member tastUnexpectedDecodeOfAutoOpenAttribute() = (GetStringFunc("tastUnexpectedDecodeOfAutoOpenAttribute",",,,") ) + /// Unexpected decode of InternalsVisibleToAttribute + /// (Originally from ..\FSComp.txt:93) + static member tastUnexpectedDecodeOfInternalsVisibleToAttribute() = (GetStringFunc("tastUnexpectedDecodeOfInternalsVisibleToAttribute",",,,") ) + /// Unexpected decode of InterfaceDataVersionAttribute + /// (Originally from ..\FSComp.txt:94) + static member tastUnexpectedDecodeOfInterfaceDataVersionAttribute() = (GetStringFunc("tastUnexpectedDecodeOfInterfaceDataVersionAttribute",",,,") ) + /// Active patterns cannot return more than 7 possibilities + /// (Originally from ..\FSComp.txt:95) + static member tastActivePatternsLimitedToSeven() = (265, GetStringFunc("tastActivePatternsLimitedToSeven",",,,") ) + /// This is not a valid constant expression or custom attribute value + /// (Originally from ..\FSComp.txt:96) + static member tastNotAConstantExpression() = (267, GetStringFunc("tastNotAConstantExpression",",,,") ) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe mutability attributes differ + /// (Originally from ..\FSComp.txt:97) + static member ValueNotContainedMutabilityAttributesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAttributesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe names differ + /// (Originally from ..\FSComp.txt:98) + static member ValueNotContainedMutabilityNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled names differ + /// (Originally from ..\FSComp.txt:99) + static member ValueNotContainedMutabilityCompiledNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityCompiledNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe display names differ + /// (Originally from ..\FSComp.txt:100) + static member ValueNotContainedMutabilityDisplayNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityDisplayNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe accessibility specified in the signature is more than that specified in the implementation + /// (Originally from ..\FSComp.txt:101) + static member ValueNotContainedMutabilityAccessibilityMore(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAccessibilityMore",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe inline flags differ + /// (Originally from ..\FSComp.txt:102) + static member ValueNotContainedMutabilityInlineFlagsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityInlineFlagsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe literal constant values and/or attributes differ + /// (Originally from ..\FSComp.txt:103) + static member ValueNotContainedMutabilityLiteralConstantValuesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityLiteralConstantValuesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is a type function and the other is not. The signature requires explicit type parameters if they are present in the implementation. + /// (Originally from ..\FSComp.txt:104) + static member ValueNotContainedMutabilityOneIsTypeFunction(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOneIsTypeFunction",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe respective type parameter counts differ + /// (Originally from ..\FSComp.txt:105) + static member ValueNotContainedMutabilityParameterCountsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityParameterCountsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe types differ + /// (Originally from ..\FSComp.txt:106) + static member ValueNotContainedMutabilityTypesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityTypesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is an extension member and the other is not + /// (Originally from ..\FSComp.txt:107) + static member ValueNotContainedMutabilityExtensionsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityExtensionsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nAn arity was not inferred for this value + /// (Originally from ..\FSComp.txt:108) + static member ValueNotContainedMutabilityArityNotInferred(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityArityNotInferred",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe number of generic parameters in the signature and implementation differ (the signature declares %s but the implementation declares %s + /// (Originally from ..\FSComp.txt:109) + static member ValueNotContainedMutabilityGenericParametersDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String, a4 : System.String) = (GetStringFunc("ValueNotContainedMutabilityGenericParametersDiffer",",,,%s,,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3 a4) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe generic parameters in the signature and implementation have different kinds. Perhaps there is a missing [] attribute. + /// (Originally from ..\FSComp.txt:110) + static member ValueNotContainedMutabilityGenericParametersAreDifferentKinds(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityGenericParametersAreDifferentKinds",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe arities in the signature and implementation differ. The signature specifies that '%s' is function definition or lambda expression accepting at least %s argument(s), but the implementation is a computed function value. To declare that a computed function value is a permitted implementation simply parenthesize its type in the signature, e.g.\n\tval %s: int -> (int -> int)\ninstead of\n\tval %s: int -> int -> int. + /// (Originally from ..\FSComp.txt:111) + static member ValueNotContainedMutabilityAritiesDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String, a4 : System.String, a5 : System.String, a6 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAritiesDiffer",",,,%s,,,%s,,,%s,,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3 a4 a5 a6) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe CLI member names differ + /// (Originally from ..\FSComp.txt:112) + static member ValueNotContainedMutabilityDotNetNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityDotNetNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is static and the other isn't + /// (Originally from ..\FSComp.txt:113) + static member ValueNotContainedMutabilityStaticsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityStaticsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is virtual and the other isn't + /// (Originally from ..\FSComp.txt:114) + static member ValueNotContainedMutabilityVirtualsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityVirtualsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is abstract and the other isn't + /// (Originally from ..\FSComp.txt:115) + static member ValueNotContainedMutabilityAbstractsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAbstractsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is final and the other isn't + /// (Originally from ..\FSComp.txt:116) + static member ValueNotContainedMutabilityFinalsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityFinalsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is marked as an override and the other isn't + /// (Originally from ..\FSComp.txt:117) + static member ValueNotContainedMutabilityOverridesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOverridesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is a constructor/property and the other is not + /// (Originally from ..\FSComp.txt:118) + static member ValueNotContainedMutabilityOneIsConstructor(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOneIsConstructor",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled representation of this method is as a static member but the signature indicates its compiled representation is as an instance member + /// (Originally from ..\FSComp.txt:119) + static member ValueNotContainedMutabilityStaticButInstance(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityStaticButInstance",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled representation of this method is as an instance member, but the signature indicates its compiled representation is as a static member + /// (Originally from ..\FSComp.txt:120) + static member ValueNotContainedMutabilityInstanceButStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityInstanceButStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions in the signature and implementation are not compatible because the names differ. The type is called '%s' in the signature file but '%s' in implementation. + /// (Originally from ..\FSComp.txt:121) + static member DefinitionsInSigAndImplNotCompatibleNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (290, GetStringFunc("DefinitionsInSigAndImplNotCompatibleNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the respective type parameter counts differ + /// (Originally from ..\FSComp.txt:122) + static member DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer(a0 : System.String, a1 : System.String) = (291, GetStringFunc("DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the accessibility specified in the signature is more than that specified in the implementation + /// (Originally from ..\FSComp.txt:123) + static member DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer(a0 : System.String, a1 : System.String) = (292, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature requires that the type supports the interface %s but the interface has not been implemented + /// (Originally from ..\FSComp.txt:124) + static member DefinitionsInSigAndImplNotCompatibleMissingInterface(a0 : System.String, a1 : System.String, a2 : System.String) = (293, GetStringFunc("DefinitionsInSigAndImplNotCompatibleMissingInterface",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation says this type may use nulls as a representation but the signature does not + /// (Originally from ..\FSComp.txt:125) + static member DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(a0 : System.String, a1 : System.String) = (294, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation says this type may use nulls as an extra value but the signature does not + /// (Originally from ..\FSComp.txt:126) + static member DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(a0 : System.String, a1 : System.String) = (294, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature says this type may use nulls as a representation but the implementation does not + /// (Originally from ..\FSComp.txt:127) + static member DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(a0 : System.String, a1 : System.String) = (295, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature says this type may use nulls as an extra value but the implementation does not + /// (Originally from ..\FSComp.txt:128) + static member DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(a0 : System.String, a1 : System.String) = (295, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation type is sealed but the signature implies it is not. Consider adding the [] attribute to the signature. + /// (Originally from ..\FSComp.txt:129) + static member DefinitionsInSigAndImplNotCompatibleImplementationSealed(a0 : System.String, a1 : System.String) = (296, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSealed",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation type is not sealed but signature implies it is. Consider adding the [] attribute to the implementation. + /// (Originally from ..\FSComp.txt:130) + static member DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(a0 : System.String, a1 : System.String) = (297, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation is an abstract class but the signature is not. Consider adding the [] attribute to the signature. + /// (Originally from ..\FSComp.txt:131) + static member DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(a0 : System.String, a1 : System.String) = (298, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature is an abstract class but the implementation is not. Consider adding the [] attribute to the implementation. + /// (Originally from ..\FSComp.txt:132) + static member DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(a0 : System.String, a1 : System.String) = (299, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the types have different base types + /// (Originally from ..\FSComp.txt:133) + static member DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(a0 : System.String, a1 : System.String) = (300, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the number of %ss differ + /// (Originally from ..\FSComp.txt:134) + static member DefinitionsInSigAndImplNotCompatibleNumbersDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (301, GetStringFunc("DefinitionsInSigAndImplNotCompatibleNumbersDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature defines the %s '%s' but the implementation does not (or does, but not in the same order) + /// (Originally from ..\FSComp.txt:135) + static member DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (302, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation defines the %s '%s' but the signature does not (or does, but not in the same order) + /// (Originally from ..\FSComp.txt:136) + static member DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (303, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation defines a struct but the signature defines a type with a hidden representation + /// (Originally from ..\FSComp.txt:137) + static member DefinitionsInSigAndImplNotCompatibleImplDefinesStruct(a0 : System.String, a1 : System.String) = (304, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplDefinesStruct",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because a CLI type representation is being hidden by a signature + /// (Originally from ..\FSComp.txt:138) + static member DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden(a0 : System.String, a1 : System.String) = (305, GetStringFunc("DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because a type representation is being hidden by a signature + /// (Originally from ..\FSComp.txt:139) + static member DefinitionsInSigAndImplNotCompatibleTypeIsHidden(a0 : System.String, a1 : System.String) = (306, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypeIsHidden",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the types are of different kinds + /// (Originally from ..\FSComp.txt:140) + static member DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind(a0 : System.String, a1 : System.String) = (307, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the IL representations differ + /// (Originally from ..\FSComp.txt:141) + static member DefinitionsInSigAndImplNotCompatibleILDiffer(a0 : System.String, a1 : System.String) = (308, GetStringFunc("DefinitionsInSigAndImplNotCompatibleILDiffer",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the representations differ + /// (Originally from ..\FSComp.txt:142) + static member DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(a0 : System.String, a1 : System.String) = (309, GetStringFunc("DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field %s was present in the implementation but not in the signature + /// (Originally from ..\FSComp.txt:143) + static member DefinitionsInSigAndImplNotCompatibleFieldWasPresent(a0 : System.String, a1 : System.String, a2 : System.String) = (311, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldWasPresent",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the order of the fields is different in the signature and implementation + /// (Originally from ..\FSComp.txt:144) + static member DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(a0 : System.String, a1 : System.String) = (312, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field %s was required by the signature but was not specified by the implementation + /// (Originally from ..\FSComp.txt:145) + static member DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(a0 : System.String, a1 : System.String, a2 : System.String) = (313, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field '%s' was present in the implementation but not in the signature. Struct types must now reveal their fields in the signature for the type, though the fields may still be labelled 'private' or 'internal'. + /// (Originally from ..\FSComp.txt:146) + static member DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(a0 : System.String, a1 : System.String, a2 : System.String) = (314, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was required by the signature but was not specified by the implementation + /// (Originally from ..\FSComp.txt:147) + static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(a0 : System.String, a1 : System.String, a2 : System.String) = (315, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was present in the implementation but not in the signature + /// (Originally from ..\FSComp.txt:148) + static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(a0 : System.String, a1 : System.String, a2 : System.String) = (316, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature declares a %s while the implementation declares a %s + /// (Originally from ..\FSComp.txt:149) + static member DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (317, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abbreviations differ: %s versus %s + /// (Originally from ..\FSComp.txt:150) + static member DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (318, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. + /// (Originally from ..\FSComp.txt:151) + static member DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(a0 : System.String, a1 : System.String) = (319, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig",",,,%s,,,%s,,,") a0 a1) + /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature has an abbreviation while the implementation does not + /// (Originally from ..\FSComp.txt:152) + static member DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(a0 : System.String, a1 : System.String) = (320, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation",",,,%s,,,%s,,,") a0 a1) + /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe names differ + /// (Originally from ..\FSComp.txt:153) + static member ModuleContainsConstructorButNamesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButNamesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe respective number of data fields differ + /// (Originally from ..\FSComp.txt:154) + static member ModuleContainsConstructorButDataFieldsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButDataFieldsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe types of the fields differ + /// (Originally from ..\FSComp.txt:155) + static member ModuleContainsConstructorButTypesOfFieldsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButTypesOfFieldsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nthe accessibility specified in the signature is more than that specified in the implementation + /// (Originally from ..\FSComp.txt:156) + static member ModuleContainsConstructorButAccessibilityDiffers(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButAccessibilityDiffers",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe names differ + /// (Originally from ..\FSComp.txt:157) + static member FieldNotContainedNamesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedNamesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nthe accessibility specified in the signature is more than that specified in the implementation + /// (Originally from ..\FSComp.txt:158) + static member FieldNotContainedAccessibilitiesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedAccessibilitiesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'static' modifiers differ + /// (Originally from ..\FSComp.txt:159) + static member FieldNotContainedStaticsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedStaticsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'mutable' modifiers differ + /// (Originally from ..\FSComp.txt:160) + static member FieldNotContainedMutablesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedMutablesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'literal' modifiers differ + /// (Originally from ..\FSComp.txt:161) + static member FieldNotContainedLiteralsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedLiteralsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe types differ + /// (Originally from ..\FSComp.txt:162) + static member FieldNotContainedTypesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedTypesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The implicit instantiation of a generic construct at or near this point could not be resolved because it could resolve to multiple unrelated types, e.g. '%s' and '%s'. Consider using type annotations to resolve the ambiguity + /// (Originally from ..\FSComp.txt:163) + static member typrelCannotResolveImplicitGenericInstantiation(a0 : System.String, a1 : System.String) = (331, GetStringFunc("typrelCannotResolveImplicitGenericInstantiation",",,,%s,,,%s,,,") a0 a1) + /// Could not resolve the ambiguity inherent in the use of the operator '%s' at or near this program point. Consider using type annotations to resolve the ambiguity. + /// (Originally from ..\FSComp.txt:164) + static member typrelCannotResolveAmbiguityInOverloadedOperator(a0 : System.String) = (332, GetStringFunc("typrelCannotResolveAmbiguityInOverloadedOperator",",,,%s,,,") a0) + /// Could not resolve the ambiguity inherent in the use of a 'printf'-style format string + /// (Originally from ..\FSComp.txt:165) + static member typrelCannotResolveAmbiguityInPrintf() = (333, GetStringFunc("typrelCannotResolveAmbiguityInPrintf",",,,") ) + /// Could not resolve the ambiguity in the use of a generic construct with an 'enum' constraint at or near this position + /// (Originally from ..\FSComp.txt:166) + static member typrelCannotResolveAmbiguityInEnum() = (334, GetStringFunc("typrelCannotResolveAmbiguityInEnum",",,,") ) + /// Could not resolve the ambiguity in the use of a generic construct with a 'delegate' constraint at or near this position + /// (Originally from ..\FSComp.txt:167) + static member typrelCannotResolveAmbiguityInDelegate() = (335, GetStringFunc("typrelCannotResolveAmbiguityInDelegate",",,,") ) + /// Invalid value + /// (Originally from ..\FSComp.txt:168) + static member typrelInvalidValue() = (337, GetStringFunc("typrelInvalidValue",",,,") ) + /// The signature and implementation are not compatible because the respective type parameter counts differ + /// (Originally from ..\FSComp.txt:169) + static member typrelSigImplNotCompatibleParamCountsDiffer() = (338, GetStringFunc("typrelSigImplNotCompatibleParamCountsDiffer",",,,") ) + /// The signature and implementation are not compatible because the type parameter in the class/signature has a different compile-time requirement to the one in the member/implementation + /// (Originally from ..\FSComp.txt:170) + static member typrelSigImplNotCompatibleCompileTimeRequirementsDiffer() = (339, GetStringFunc("typrelSigImplNotCompatibleCompileTimeRequirementsDiffer",",,,") ) + /// The signature and implementation are not compatible because the declaration of the type parameter '%s' requires a constraint of the form %s + /// (Originally from ..\FSComp.txt:171) + static member typrelSigImplNotCompatibleConstraintsDiffer(a0 : System.String, a1 : System.String) = (340, GetStringFunc("typrelSigImplNotCompatibleConstraintsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The signature and implementation are not compatible because the type parameter '%s' has a constraint of the form %s but the implementation does not. Either remove this constraint from the signature or add it to the implementation. + /// (Originally from ..\FSComp.txt:172) + static member typrelSigImplNotCompatibleConstraintsDifferRemove(a0 : System.String, a1 : System.String) = (341, GetStringFunc("typrelSigImplNotCompatibleConstraintsDifferRemove",",,,%s,,,%s,,,") a0 a1) + /// The type '%s' implements 'System.IComparable'. Consider also adding an explicit override for 'Object.Equals' + /// (Originally from ..\FSComp.txt:173) + static member typrelTypeImplementsIComparableShouldOverrideObjectEquals(a0 : System.String) = (342, GetStringFunc("typrelTypeImplementsIComparableShouldOverrideObjectEquals",",,,%s,,,") a0) + /// The type '%s' implements 'System.IComparable' explicitly but provides no corresponding override for 'Object.Equals'. An implementation of 'Object.Equals' has been automatically provided, implemented via 'System.IComparable'. Consider implementing the override 'Object.Equals' explicitly + /// (Originally from ..\FSComp.txt:174) + static member typrelTypeImplementsIComparableDefaultObjectEqualsProvided(a0 : System.String) = (343, GetStringFunc("typrelTypeImplementsIComparableDefaultObjectEqualsProvided",",,,%s,,,") a0) + /// The struct, record or union type '%s' has an explicit implementation of 'Object.GetHashCode' or 'Object.Equals'. You must apply the 'CustomEquality' attribute to the type + /// (Originally from ..\FSComp.txt:175) + static member typrelExplicitImplementationOfGetHashCodeOrEquals(a0 : System.String) = (344, GetStringFunc("typrelExplicitImplementationOfGetHashCodeOrEquals",",,,%s,,,") a0) + /// The struct, record or union type '%s' has an explicit implementation of 'Object.GetHashCode'. Consider implementing a matching override for 'Object.Equals(obj)' + /// (Originally from ..\FSComp.txt:176) + static member typrelExplicitImplementationOfGetHashCode(a0 : System.String) = (345, GetStringFunc("typrelExplicitImplementationOfGetHashCode",",,,%s,,,") a0) + /// The struct, record or union type '%s' has an explicit implementation of 'Object.Equals'. Consider implementing a matching override for 'Object.GetHashCode()' + /// (Originally from ..\FSComp.txt:177) + static member typrelExplicitImplementationOfEquals(a0 : System.String) = (346, GetStringFunc("typrelExplicitImplementationOfEquals",",,,%s,,,") a0) + /// The exception definitions are not compatible because a CLI exception mapping is being hidden by a signature. The exception mapping must be visible to other modules. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s + /// (Originally from ..\FSComp.txt:178) + static member ExceptionDefsNotCompatibleHiddenBySignature(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleHiddenBySignature",",,,%s,,,%s,,,") a0 a1) + /// The exception definitions are not compatible because the CLI representations differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s + /// (Originally from ..\FSComp.txt:179) + static member ExceptionDefsNotCompatibleDotNetRepresentationsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleDotNetRepresentationsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The exception definitions are not compatible because the exception abbreviation is being hidden by the signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:180) + static member ExceptionDefsNotCompatibleAbbreviationHiddenBySignature(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleAbbreviationHiddenBySignature",",,,%s,,,%s,,,") a0 a1) + /// The exception definitions are not compatible because the exception abbreviations in the signature and implementation differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:181) + static member ExceptionDefsNotCompatibleSignaturesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleSignaturesDiffer",",,,%s,,,%s,,,") a0 a1) + /// The exception definitions are not compatible because the exception declarations differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:182) + static member ExceptionDefsNotCompatibleExceptionDeclarationsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleExceptionDeclarationsDiffer",",,,%s,,,%s,,,") a0 a1) + /// The exception definitions are not compatible because the field '%s' was required by the signature but was not specified by the implementation. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:183) + static member ExceptionDefsNotCompatibleFieldInSigButNotImpl(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldInSigButNotImpl",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The exception definitions are not compatible because the field '%s' was present in the implementation but not in the signature. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:184) + static member ExceptionDefsNotCompatibleFieldInImplButNotSig(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldInImplButNotSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The exception definitions are not compatible because the order of the fields is different in the signature and implementation. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. + /// (Originally from ..\FSComp.txt:185) + static member ExceptionDefsNotCompatibleFieldOrderDiffers(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldOrderDiffers",",,,%s,,,%s,,,") a0 a1) + /// The namespace or module attributes differ between signature and implementation + /// (Originally from ..\FSComp.txt:186) + static member typrelModuleNamespaceAttributesDifferInSigAndImpl() = (355, GetStringFunc("typrelModuleNamespaceAttributesDifferInSigAndImpl",",,,") ) + /// This method is over-constrained in its type parameters + /// (Originally from ..\FSComp.txt:187) + static member typrelMethodIsOverconstrained() = (356, GetStringFunc("typrelMethodIsOverconstrained",",,,") ) + /// No implementations of '%s' had the correct number of arguments and type parameters. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:188) + static member typrelOverloadNotFound(a0 : System.String, a1 : System.String) = (357, GetStringFunc("typrelOverloadNotFound",",,,%s,,,%s,,,") a0 a1) + /// The override for '%s' was ambiguous + /// (Originally from ..\FSComp.txt:189) + static member typrelOverrideWasAmbiguous(a0 : System.String) = (358, GetStringFunc("typrelOverrideWasAmbiguous",",,,%s,,,") a0) + /// More than one override implements '%s' + /// (Originally from ..\FSComp.txt:190) + static member typrelMoreThenOneOverride(a0 : System.String) = (359, GetStringFunc("typrelMoreThenOneOverride",",,,%s,,,") a0) + /// The method '%s' is sealed and cannot be overridden + /// (Originally from ..\FSComp.txt:191) + static member typrelMethodIsSealed(a0 : System.String) = (360, GetStringFunc("typrelMethodIsSealed",",,,%s,,,") a0) + /// The override '%s' implements more than one abstract slot, e.g. '%s' and '%s' + /// (Originally from ..\FSComp.txt:192) + static member typrelOverrideImplementsMoreThenOneSlot(a0 : System.String, a1 : System.String, a2 : System.String) = (361, GetStringFunc("typrelOverrideImplementsMoreThenOneSlot",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Duplicate or redundant interface + /// (Originally from ..\FSComp.txt:193) + static member typrelDuplicateInterface() = (362, GetStringFunc("typrelDuplicateInterface",",,,") ) + /// The interface '%s' is included in multiple explicitly implemented interface types. Add an explicit implementation of this interface. + /// (Originally from ..\FSComp.txt:194) + static member typrelNeedExplicitImplementation(a0 : System.String) = (363, GetStringFunc("typrelNeedExplicitImplementation",",,,%s,,,") a0) + /// A named argument has been assigned more than one value + /// (Originally from ..\FSComp.txt:195) + static member typrelNamedArgumentHasBeenAssignedMoreThenOnce() = (364, GetStringFunc("typrelNamedArgumentHasBeenAssignedMoreThenOnce",",,,") ) + /// No implementation was given for '%s' + /// (Originally from ..\FSComp.txt:196) + static member typrelNoImplementationGiven(a0 : System.String) = (365, GetStringFunc("typrelNoImplementationGiven",",,,%s,,,") a0) + /// No implementation was given for '%s'. Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'. + /// (Originally from ..\FSComp.txt:197) + static member typrelNoImplementationGivenWithSuggestion(a0 : System.String) = (366, GetStringFunc("typrelNoImplementationGivenWithSuggestion",",,,%s,,,") a0) + /// The member '%s' does not have the correct number of arguments. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:198) + static member typrelMemberDoesNotHaveCorrectNumberOfArguments(a0 : System.String, a1 : System.String) = (367, GetStringFunc("typrelMemberDoesNotHaveCorrectNumberOfArguments",",,,%s,,,%s,,,") a0 a1) + /// The member '%s' does not have the correct number of method type parameters. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:199) + static member typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(a0 : System.String, a1 : System.String) = (368, GetStringFunc("typrelMemberDoesNotHaveCorrectNumberOfTypeParameters",",,,%s,,,%s,,,") a0 a1) + /// The member '%s' does not have the correct kinds of generic parameters. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:200) + static member typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(a0 : System.String, a1 : System.String) = (369, GetStringFunc("typrelMemberDoesNotHaveCorrectKindsOfGenericParameters",",,,%s,,,%s,,,") a0 a1) + /// The member '%s' cannot be used to implement '%s'. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:201) + static member typrelMemberCannotImplement(a0 : System.String, a1 : System.String, a2 : System.String) = (370, GetStringFunc("typrelMemberCannotImplement",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Error while parsing embedded IL + /// (Originally from ..\FSComp.txt:202) + static member astParseEmbeddedILError() = (371, GetStringFunc("astParseEmbeddedILError",",,,") ) + /// Error while parsing embedded IL type + /// (Originally from ..\FSComp.txt:203) + static member astParseEmbeddedILTypeError() = (372, GetStringFunc("astParseEmbeddedILTypeError",",,,") ) + /// This indexer notation has been removed from the F# language + /// (Originally from ..\FSComp.txt:204) + static member astDeprecatedIndexerNotation() = (GetStringFunc("astDeprecatedIndexerNotation",",,,") ) + /// Invalid expression on left of assignment + /// (Originally from ..\FSComp.txt:205) + static member astInvalidExprLeftHandOfAssignment() = (374, GetStringFunc("astInvalidExprLeftHandOfAssignment",",,,") ) + /// The 'ReferenceEquality' attribute cannot be used on structs. Consider using the 'StructuralEquality' attribute instead, or implement an override for 'System.Object.Equals(obj)'. + /// (Originally from ..\FSComp.txt:206) + static member augNoRefEqualsOnStruct() = (376, GetStringFunc("augNoRefEqualsOnStruct",",,,") ) + /// This type uses an invalid mix of the attributes 'NoEquality', 'ReferenceEquality', 'StructuralEquality', 'NoComparison' and 'StructuralComparison' + /// (Originally from ..\FSComp.txt:207) + static member augInvalidAttrs() = (377, GetStringFunc("augInvalidAttrs",",,,") ) + /// The 'NoEquality' attribute must be used in conjunction with the 'NoComparison' attribute + /// (Originally from ..\FSComp.txt:208) + static member augNoEqualityNeedsNoComparison() = (378, GetStringFunc("augNoEqualityNeedsNoComparison",",,,") ) + /// The 'StructuralComparison' attribute must be used in conjunction with the 'StructuralEquality' attribute + /// (Originally from ..\FSComp.txt:209) + static member augStructCompNeedsStructEquality() = (379, GetStringFunc("augStructCompNeedsStructEquality",",,,") ) + /// The 'StructuralEquality' attribute must be used in conjunction with the 'NoComparison' or 'StructuralComparison' attributes + /// (Originally from ..\FSComp.txt:210) + static member augStructEqNeedsNoCompOrStructComp() = (380, GetStringFunc("augStructEqNeedsNoCompOrStructComp",",,,") ) + /// A type cannot have both the 'ReferenceEquality' and 'StructuralEquality' or 'StructuralComparison' attributes + /// (Originally from ..\FSComp.txt:211) + static member augTypeCantHaveRefEqAndStructAttrs() = (381, GetStringFunc("augTypeCantHaveRefEqAndStructAttrs",",,,") ) + /// Only record, union, exception and struct types may be augmented with the 'ReferenceEquality', 'StructuralEquality' and 'StructuralComparison' attributes + /// (Originally from ..\FSComp.txt:212) + static member augOnlyCertainTypesCanHaveAttrs() = (382, GetStringFunc("augOnlyCertainTypesCanHaveAttrs",",,,") ) + /// A type with attribute 'ReferenceEquality' cannot have an explicit implementation of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' + /// (Originally from ..\FSComp.txt:213) + static member augRefEqCantHaveObjEquals() = (383, GetStringFunc("augRefEqCantHaveObjEquals",",,,") ) + /// A type with attribute 'CustomEquality' must have an explicit implementation of at least one of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' + /// (Originally from ..\FSComp.txt:214) + static member augCustomEqNeedsObjEquals() = (384, GetStringFunc("augCustomEqNeedsObjEquals",",,,") ) + /// A type with attribute 'CustomComparison' must have an explicit implementation of at least one of 'System.IComparable' or 'System.Collections.IStructuralComparable' + /// (Originally from ..\FSComp.txt:215) + static member augCustomCompareNeedsIComp() = (385, GetStringFunc("augCustomCompareNeedsIComp",",,,") ) + /// A type with attribute 'NoEquality' should not usually have an explicit implementation of 'Object.Equals(obj)'. Disable this warning if this is intentional for interoperability purposes + /// (Originally from ..\FSComp.txt:216) + static member augNoEqNeedsNoObjEquals() = (386, GetStringFunc("augNoEqNeedsNoObjEquals",",,,") ) + /// A type with attribute 'NoComparison' should not usually have an explicit implementation of 'System.IComparable', 'System.IComparable<_>' or 'System.Collections.IStructuralComparable'. Disable this warning if this is intentional for interoperability purposes + /// (Originally from ..\FSComp.txt:217) + static member augNoCompCantImpIComp() = (386, GetStringFunc("augNoCompCantImpIComp",",,,") ) + /// The 'CustomEquality' attribute must be used in conjunction with the 'NoComparison' or 'CustomComparison' attributes + /// (Originally from ..\FSComp.txt:218) + static member augCustomEqNeedsNoCompOrCustomComp() = (387, GetStringFunc("augCustomEqNeedsNoCompOrCustomComp",",,,") ) + /// Positional specifiers are not permitted in format strings + /// (Originally from ..\FSComp.txt:219) + static member forPositionalSpecifiersNotPermitted() = (GetStringFunc("forPositionalSpecifiersNotPermitted",",,,") ) + /// Missing format specifier + /// (Originally from ..\FSComp.txt:220) + static member forMissingFormatSpecifier() = (GetStringFunc("forMissingFormatSpecifier",",,,") ) + /// '%s' flag set twice + /// (Originally from ..\FSComp.txt:221) + static member forFlagSetTwice(a0 : System.String) = (GetStringFunc("forFlagSetTwice",",,,%s,,,") a0) + /// Prefix flag (' ' or '+') set twice + /// (Originally from ..\FSComp.txt:222) + static member forPrefixFlagSpacePlusSetTwice() = (GetStringFunc("forPrefixFlagSpacePlusSetTwice",",,,") ) + /// The # formatting modifier is invalid in F# + /// (Originally from ..\FSComp.txt:223) + static member forHashSpecifierIsInvalid() = (GetStringFunc("forHashSpecifierIsInvalid",",,,") ) + /// Bad precision in format specifier + /// (Originally from ..\FSComp.txt:224) + static member forBadPrecision() = (GetStringFunc("forBadPrecision",",,,") ) + /// Bad width in format specifier + /// (Originally from ..\FSComp.txt:225) + static member forBadWidth() = (GetStringFunc("forBadWidth",",,,") ) + /// '%s' format does not support '0' flag + /// (Originally from ..\FSComp.txt:226) + static member forDoesNotSupportZeroFlag(a0 : System.String) = (GetStringFunc("forDoesNotSupportZeroFlag",",,,%s,,,") a0) + /// Precision missing after the '.' + /// (Originally from ..\FSComp.txt:227) + static member forPrecisionMissingAfterDot() = (GetStringFunc("forPrecisionMissingAfterDot",",,,") ) + /// '%s' format does not support precision + /// (Originally from ..\FSComp.txt:228) + static member forFormatDoesntSupportPrecision(a0 : System.String) = (GetStringFunc("forFormatDoesntSupportPrecision",",,,%s,,,") a0) + /// Bad format specifier (after l or L): Expected ld,li,lo,lu,lx or lX. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. + /// (Originally from ..\FSComp.txt:229) + static member forBadFormatSpecifier() = (GetStringFunc("forBadFormatSpecifier",",,,") ) + /// The 'l' or 'L' in this format specifier is unnecessary. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. + /// (Originally from ..\FSComp.txt:230) + static member forLIsUnnecessary() = (GetStringFunc("forLIsUnnecessary",",,,") ) + /// The 'h' or 'H' in this format specifier is unnecessary. You can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. + /// (Originally from ..\FSComp.txt:231) + static member forHIsUnnecessary() = (GetStringFunc("forHIsUnnecessary",",,,") ) + /// '%s' does not support prefix '%s' flag + /// (Originally from ..\FSComp.txt:232) + static member forDoesNotSupportPrefixFlag(a0 : System.String, a1 : System.String) = (GetStringFunc("forDoesNotSupportPrefixFlag",",,,%s,,,%s,,,") a0 a1) + /// Bad format specifier: '%s' + /// (Originally from ..\FSComp.txt:233) + static member forBadFormatSpecifierGeneral(a0 : System.String) = (GetStringFunc("forBadFormatSpecifierGeneral",",,,%s,,,") a0) + /// System.Environment.Exit did not exit + /// (Originally from ..\FSComp.txt:234) + static member elSysEnvExitDidntExit() = (GetStringFunc("elSysEnvExitDidntExit",",,,") ) + /// The treatment of this operator is now handled directly by the F# compiler and its meaning cannot be redefined + /// (Originally from ..\FSComp.txt:235) + static member elDeprecatedOperator() = (GetStringFunc("elDeprecatedOperator",",,,") ) + /// A protected member is called or 'base' is being used. This is only allowed in the direct implementation of members since they could escape their object scope. + /// (Originally from ..\FSComp.txt:236) + static member chkProtectedOrBaseCalled() = (405, GetStringFunc("chkProtectedOrBaseCalled",",,,") ) + /// The byref-typed variable '%s' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. + /// (Originally from ..\FSComp.txt:237) + static member chkByrefUsedInInvalidWay(a0 : System.String) = (406, GetStringFunc("chkByrefUsedInInvalidWay",",,,%s,,,") a0) + /// The 'base' keyword is used in an invalid way. Base calls cannot be used in closures. Consider using a private member to make base calls. + /// (Originally from ..\FSComp.txt:238) + static member chkBaseUsedInInvalidWay() = (408, GetStringFunc("chkBaseUsedInInvalidWay",",,,") ) + /// The variable '%s' is used in an invalid way + /// (Originally from ..\FSComp.txt:239) + static member chkVariableUsedInInvalidWay(a0 : System.String) = (GetStringFunc("chkVariableUsedInInvalidWay",",,,%s,,,") a0) + /// The type '%s' is less accessible than the value, member or type '%s' it is used in. + /// (Originally from ..\FSComp.txt:240) + static member chkTypeLessAccessibleThanType(a0 : System.String, a1 : System.String) = (410, GetStringFunc("chkTypeLessAccessibleThanType",",,,%s,,,%s,,,") a0 a1) + /// 'System.Void' can only be used as 'typeof' in F# + /// (Originally from ..\FSComp.txt:241) + static member chkSystemVoidOnlyInTypeof() = (411, GetStringFunc("chkSystemVoidOnlyInTypeof",",,,") ) + /// A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + /// (Originally from ..\FSComp.txt:242) + static member chkErrorUseOfByref() = (412, GetStringFunc("chkErrorUseOfByref",",,,") ) + /// Calls to 'reraise' may only occur directly in a handler of a try-with + /// (Originally from ..\FSComp.txt:243) + static member chkErrorContainsCallToRethrow() = (413, GetStringFunc("chkErrorContainsCallToRethrow",",,,") ) + /// Expression-splicing operators may only be used within quotations + /// (Originally from ..\FSComp.txt:244) + static member chkSplicingOnlyInQuotations() = (414, GetStringFunc("chkSplicingOnlyInQuotations",",,,") ) + /// First-class uses of the expression-splicing operator are not permitted + /// (Originally from ..\FSComp.txt:245) + static member chkNoFirstClassSplicing() = (415, GetStringFunc("chkNoFirstClassSplicing",",,,") ) + /// First-class uses of the address-of operators are not permitted + /// (Originally from ..\FSComp.txt:246) + static member chkNoFirstClassAddressOf() = (416, GetStringFunc("chkNoFirstClassAddressOf",",,,") ) + /// First-class uses of the 'reraise' function is not permitted + /// (Originally from ..\FSComp.txt:247) + static member chkNoFirstClassRethrow() = (417, GetStringFunc("chkNoFirstClassRethrow",",,,") ) + /// The byref typed value '%s' cannot be used at this point + /// (Originally from ..\FSComp.txt:248) + static member chkNoByrefAtThisPoint(a0 : System.String) = (418, GetStringFunc("chkNoByrefAtThisPoint",",,,%s,,,") a0) + /// 'base' values may only be used to make direct calls to the base implementations of overridden members + /// (Originally from ..\FSComp.txt:249) + static member chkLimitationsOfBaseKeyword() = (419, GetStringFunc("chkLimitationsOfBaseKeyword",",,,") ) + /// Object constructors cannot directly use try/with and try/finally prior to the initialization of the object. This includes constructs such as 'for x in ...' that may elaborate to uses of these constructs. This is a limitation imposed by Common IL. + /// (Originally from ..\FSComp.txt:250) + static member chkObjCtorsCantUseExceptionHandling() = (420, GetStringFunc("chkObjCtorsCantUseExceptionHandling",",,,") ) + /// The address of the variable '%s' cannot be used at this point + /// (Originally from ..\FSComp.txt:251) + static member chkNoAddressOfAtThisPoint(a0 : System.String) = (421, GetStringFunc("chkNoAddressOfAtThisPoint",",,,%s,,,") a0) + /// The address of the static field '%s' cannot be used at this point + /// (Originally from ..\FSComp.txt:252) + static member chkNoAddressStaticFieldAtThisPoint(a0 : System.String) = (422, GetStringFunc("chkNoAddressStaticFieldAtThisPoint",",,,%s,,,") a0) + /// The address of the field '%s' cannot be used at this point + /// (Originally from ..\FSComp.txt:253) + static member chkNoAddressFieldAtThisPoint(a0 : System.String) = (423, GetStringFunc("chkNoAddressFieldAtThisPoint",",,,%s,,,") a0) + /// The address of an array element cannot be used at this point + /// (Originally from ..\FSComp.txt:254) + static member chkNoAddressOfArrayElementAtThisPoint() = (424, GetStringFunc("chkNoAddressOfArrayElementAtThisPoint",",,,") ) + /// The type of a first-class function cannot contain byrefs + /// (Originally from ..\FSComp.txt:255) + static member chkFirstClassFuncNoByref() = (425, GetStringFunc("chkFirstClassFuncNoByref",",,,") ) + /// A method return type would contain byrefs which is not permitted + /// (Originally from ..\FSComp.txt:256) + static member chkReturnTypeNoByref() = (426, GetStringFunc("chkReturnTypeNoByref",",,,") ) + /// Invalid custom attribute value (not a constant or literal) + /// (Originally from ..\FSComp.txt:257) + static member chkInvalidCustAttrVal() = (428, GetStringFunc("chkInvalidCustAttrVal",",,,") ) + /// The attribute type '%s' has 'AllowMultiple=false'. Multiple instances of this attribute cannot be attached to a single language element. + /// (Originally from ..\FSComp.txt:258) + static member chkAttrHasAllowMultiFalse(a0 : System.String) = (429, GetStringFunc("chkAttrHasAllowMultiFalse",",,,%s,,,") a0) + /// The member '%s' is used in an invalid way. A use of '%s' has been inferred prior to its definition at or near '%s'. This is an invalid forward reference. + /// (Originally from ..\FSComp.txt:259) + static member chkMemberUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (430, GetStringFunc("chkMemberUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// A byref typed value would be stored here. Top-level let-bound byref values are not permitted. + /// (Originally from ..\FSComp.txt:260) + static member chkNoByrefAsTopValue() = (431, GetStringFunc("chkNoByrefAsTopValue",",,,") ) + /// [] terms cannot contain uses of the prefix splice operator '%%' + /// (Originally from ..\FSComp.txt:261) + static member chkReflectedDefCantSplice() = (432, GetStringFunc("chkReflectedDefCantSplice",",,,") ) + /// A function labeled with the 'EntryPointAttribute' attribute must be the last declaration in the last file in the compilation sequence. + /// (Originally from ..\FSComp.txt:262) + static member chkEntryPointUsage() = (433, GetStringFunc("chkEntryPointUsage",",,,") ) + /// compiled form of the union case + /// (Originally from ..\FSComp.txt:263) + static member chkUnionCaseCompiledForm() = (GetStringFunc("chkUnionCaseCompiledForm",",,,") ) + /// default augmentation of the union case + /// (Originally from ..\FSComp.txt:264) + static member chkUnionCaseDefaultAugmentation() = (GetStringFunc("chkUnionCaseDefaultAugmentation",",,,") ) + /// The property '%s' has the same name as a method in type '%s'. + /// (Originally from ..\FSComp.txt:265) + static member chkPropertySameNameMethod(a0 : System.String, a1 : System.String) = (434, GetStringFunc("chkPropertySameNameMethod",",,,%s,,,%s,,,") a0 a1) + /// The property '%s' of type '%s' has a getter and a setter that do not match. If one is abstract then the other must be as well. + /// (Originally from ..\FSComp.txt:266) + static member chkGetterSetterDoNotMatchAbstract(a0 : System.String, a1 : System.String) = (435, GetStringFunc("chkGetterSetterDoNotMatchAbstract",",,,%s,,,%s,,,") a0 a1) + /// The property '%s' has the same name as another property in type '%s', but one takes indexer arguments and the other does not. You may be missing an indexer argument to one of your properties. + /// (Originally from ..\FSComp.txt:267) + static member chkPropertySameNameIndexer(a0 : System.String, a1 : System.String) = (436, GetStringFunc("chkPropertySameNameIndexer",",,,%s,,,%s,,,") a0 a1) + /// A type would store a byref typed value. This is not permitted by Common IL. + /// (Originally from ..\FSComp.txt:268) + static member chkCantStoreByrefValue() = (437, GetStringFunc("chkCantStoreByrefValue",",,,") ) + /// Duplicate method. The method '%s' has the same name and signature as another method in type '%s'. + /// (Originally from ..\FSComp.txt:270) + static member chkDuplicateMethod(a0 : System.String, a1 : System.String) = (438, GetStringFunc("chkDuplicateMethod",",,,%s,,,%s,,,") a0 a1) + /// Duplicate method. The method '%s' has the same name and signature as another method in type '%s' once tuples, functions, units of measure and/or provided types are erased. + /// (Originally from ..\FSComp.txt:271) + static member chkDuplicateMethodWithSuffix(a0 : System.String, a1 : System.String) = (438, GetStringFunc("chkDuplicateMethodWithSuffix",",,,%s,,,%s,,,") a0 a1) + /// The method '%s' has curried arguments but has the same name as another method in type '%s'. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. + /// (Originally from ..\FSComp.txt:272) + static member chkDuplicateMethodCurried(a0 : System.String, a1 : System.String) = (439, GetStringFunc("chkDuplicateMethodCurried",",,,%s,,,%s,,,") a0 a1) + /// Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments + /// (Originally from ..\FSComp.txt:273) + static member chkCurriedMethodsCantHaveOutParams() = (440, GetStringFunc("chkCurriedMethodsCantHaveOutParams",",,,") ) + /// Duplicate property. The property '%s' has the same name and signature as another property in type '%s'. + /// (Originally from ..\FSComp.txt:274) + static member chkDuplicateProperty(a0 : System.String, a1 : System.String) = (441, GetStringFunc("chkDuplicateProperty",",,,%s,,,%s,,,") a0 a1) + /// Duplicate property. The property '%s' has the same name and signature as another property in type '%s' once tuples, functions, units of measure and/or provided types are erased. + /// (Originally from ..\FSComp.txt:275) + static member chkDuplicatePropertyWithSuffix(a0 : System.String, a1 : System.String) = (441, GetStringFunc("chkDuplicatePropertyWithSuffix",",,,%s,,,%s,,,") a0 a1) + /// Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type. + /// (Originally from ..\FSComp.txt:276) + static member chkDuplicateMethodInheritedType(a0 : System.String) = (442, GetStringFunc("chkDuplicateMethodInheritedType",",,,%s,,,") a0) + /// Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type once tuples, functions, units of measure and/or provided types are erased. + /// (Originally from ..\FSComp.txt:277) + static member chkDuplicateMethodInheritedTypeWithSuffix(a0 : System.String) = (442, GetStringFunc("chkDuplicateMethodInheritedTypeWithSuffix",",,,%s,,,") a0) + /// This type implements the same interface at different generic instantiations '%s' and '%s'. This is not permitted in this version of F#. + /// (Originally from ..\FSComp.txt:278) + static member chkMultipleGenericInterfaceInstantiations(a0 : System.String, a1 : System.String) = (443, GetStringFunc("chkMultipleGenericInterfaceInstantiations",",,,%s,,,%s,,,") a0 a1) + /// The type of a field using the 'DefaultValue' attribute must admit default initialization, i.e. have 'null' as a proper value or be a struct type whose fields all admit default initialization. You can use 'DefaultValue(false)' to disable this check + /// (Originally from ..\FSComp.txt:279) + static member chkValueWithDefaultValueMustHaveDefaultValue() = (444, GetStringFunc("chkValueWithDefaultValueMustHaveDefaultValue",",,,") ) + /// The type abbreviation contains byrefs. This is not permitted by F#. + /// (Originally from ..\FSComp.txt:280) + static member chkNoByrefInTypeAbbrev() = (445, GetStringFunc("chkNoByrefInTypeAbbrev",",,,") ) + /// The variable '%s' is bound in a quotation but is used as part of a spliced expression. This is not permitted since it may escape its scope. + /// (Originally from ..\FSComp.txt:281) + static member crefBoundVarUsedInSplice(a0 : System.String) = (446, GetStringFunc("crefBoundVarUsedInSplice",",,,%s,,,") a0) + /// Quotations cannot contain uses of generic expressions + /// (Originally from ..\FSComp.txt:282) + static member crefQuotationsCantContainGenericExprs() = (447, GetStringFunc("crefQuotationsCantContainGenericExprs",",,,") ) + /// Quotations cannot contain function definitions that are inferred or declared to be generic. Consider adding some type constraints to make this a valid quoted expression. + /// (Originally from ..\FSComp.txt:283) + static member crefQuotationsCantContainGenericFunctions() = (448, GetStringFunc("crefQuotationsCantContainGenericFunctions",",,,") ) + /// Quotations cannot contain object expressions + /// (Originally from ..\FSComp.txt:284) + static member crefQuotationsCantContainObjExprs() = (449, GetStringFunc("crefQuotationsCantContainObjExprs",",,,") ) + /// Quotations cannot contain expressions that take the address of a field + /// (Originally from ..\FSComp.txt:285) + static member crefQuotationsCantContainAddressOf() = (450, GetStringFunc("crefQuotationsCantContainAddressOf",",,,") ) + /// Quotations cannot contain expressions that fetch static fields + /// (Originally from ..\FSComp.txt:286) + static member crefQuotationsCantContainStaticFieldRef() = (451, GetStringFunc("crefQuotationsCantContainStaticFieldRef",",,,") ) + /// Quotations cannot contain inline assembly code or pattern matching on arrays + /// (Originally from ..\FSComp.txt:287) + static member crefQuotationsCantContainInlineIL() = (452, GetStringFunc("crefQuotationsCantContainInlineIL",",,,") ) + /// Quotations cannot contain descending for loops + /// (Originally from ..\FSComp.txt:288) + static member crefQuotationsCantContainDescendingForLoops() = (453, GetStringFunc("crefQuotationsCantContainDescendingForLoops",",,,") ) + /// Quotations cannot contain expressions that fetch union case indexes + /// (Originally from ..\FSComp.txt:289) + static member crefQuotationsCantFetchUnionIndexes() = (454, GetStringFunc("crefQuotationsCantFetchUnionIndexes",",,,") ) + /// Quotations cannot contain expressions that set union case fields + /// (Originally from ..\FSComp.txt:290) + static member crefQuotationsCantSetUnionFields() = (455, GetStringFunc("crefQuotationsCantSetUnionFields",",,,") ) + /// Quotations cannot contain expressions that set fields in exception values + /// (Originally from ..\FSComp.txt:291) + static member crefQuotationsCantSetExceptionFields() = (456, GetStringFunc("crefQuotationsCantSetExceptionFields",",,,") ) + /// Quotations cannot contain expressions that require byref pointers + /// (Originally from ..\FSComp.txt:292) + static member crefQuotationsCantRequireByref() = (457, GetStringFunc("crefQuotationsCantRequireByref",",,,") ) + /// Quotations cannot contain expressions that make member constraint calls, or uses of operators that implicitly resolve to a member constraint call + /// (Originally from ..\FSComp.txt:293) + static member crefQuotationsCantCallTraitMembers() = (458, GetStringFunc("crefQuotationsCantCallTraitMembers",",,,") ) + /// Quotations cannot contain this kind of constant + /// (Originally from ..\FSComp.txt:294) + static member crefQuotationsCantContainThisConstant() = (459, GetStringFunc("crefQuotationsCantContainThisConstant",",,,") ) + /// Quotations cannot contain this kind of pattern match + /// (Originally from ..\FSComp.txt:295) + static member crefQuotationsCantContainThisPatternMatch() = (460, GetStringFunc("crefQuotationsCantContainThisPatternMatch",",,,") ) + /// Quotations cannot contain array pattern matching + /// (Originally from ..\FSComp.txt:296) + static member crefQuotationsCantContainArrayPatternMatching() = (461, GetStringFunc("crefQuotationsCantContainArrayPatternMatching",",,,") ) + /// Quotations cannot contain this kind of type + /// (Originally from ..\FSComp.txt:297) + static member crefQuotationsCantContainThisType() = (462, GetStringFunc("crefQuotationsCantContainThisType",",,,") ) + /// The declared type parameter '%s' cannot be used here since the type parameter cannot be resolved at compile time + /// (Originally from ..\FSComp.txt:298) + static member csTypeCannotBeResolvedAtCompileTime(a0 : System.String) = (GetStringFunc("csTypeCannotBeResolvedAtCompileTime",",,,%s,,,") a0) + /// This code is less generic than indicated by its annotations. A unit-of-measure specified using '_' has been determined to be '1', i.e. dimensionless. Consider making the code generic, or removing the use of '_'. + /// (Originally from ..\FSComp.txt:299) + static member csCodeLessGeneric() = (464, GetStringFunc("csCodeLessGeneric",",,,") ) + /// Type inference problem too complicated (maximum iteration depth reached). Consider adding further type annotations. + /// (Originally from ..\FSComp.txt:300) + static member csTypeInferenceMaxDepth() = (465, GetStringFunc("csTypeInferenceMaxDepth",",,,") ) + /// Expected arguments to an instance member + /// (Originally from ..\FSComp.txt:301) + static member csExpectedArguments() = (GetStringFunc("csExpectedArguments",",,,") ) + /// This indexer expects %d arguments but is here given %d + /// (Originally from ..\FSComp.txt:302) + static member csIndexArgumentMismatch(a0 : System.Int32, a1 : System.Int32) = (GetStringFunc("csIndexArgumentMismatch",",,,%d,,,%d,,,") a0 a1) + /// Expecting a type supporting the operator '%s' but given a function type. You may be missing an argument to a function. + /// (Originally from ..\FSComp.txt:303) + static member csExpectTypeWithOperatorButGivenFunction(a0 : System.String) = (GetStringFunc("csExpectTypeWithOperatorButGivenFunction",",,,%s,,,") a0) + /// Expecting a type supporting the operator '%s' but given a tuple type + /// (Originally from ..\FSComp.txt:304) + static member csExpectTypeWithOperatorButGivenTuple(a0 : System.String) = (GetStringFunc("csExpectTypeWithOperatorButGivenTuple",",,,%s,,,") a0) + /// None of the types '%s' support the operator '%s' + /// (Originally from ..\FSComp.txt:305) + static member csTypesDoNotSupportOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypesDoNotSupportOperator",",,,%s,,,%s,,,") a0 a1) + /// The type '%s' does not support the operator '%s' + /// (Originally from ..\FSComp.txt:306) + static member csTypeDoesNotSupportOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportOperator",",,,%s,,,%s,,,") a0 a1) + /// None of the types '%s' support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + /// (Originally from ..\FSComp.txt:307) + static member csTypesDoNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypesDoNotSupportOperatorNullable",",,,%s,,,%s,,,") a0 a1) + /// The type '%s' does not support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + /// (Originally from ..\FSComp.txt:308) + static member csTypeDoesNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportOperatorNullable",",,,%s,,,%s,,,") a0 a1) + /// The type '%s' does not support a conversion to the type '%s' + /// (Originally from ..\FSComp.txt:309) + static member csTypeDoesNotSupportConversion(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportConversion",",,,%s,,,%s,,,") a0 a1) + /// The type '%s' has a method '%s' (full name '%s'), but the method is static + /// (Originally from ..\FSComp.txt:310) + static member csMethodFoundButIsStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMethodFoundButIsStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The type '%s' has a method '%s' (full name '%s'), but the method is not static + /// (Originally from ..\FSComp.txt:311) + static member csMethodFoundButIsNotStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMethodFoundButIsNotStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The constraints 'struct' and 'not struct' are inconsistent + /// (Originally from ..\FSComp.txt:312) + static member csStructConstraintInconsistent() = (472, GetStringFunc("csStructConstraintInconsistent",",,,") ) + /// The type '%s' does not have 'null' as a proper value + /// (Originally from ..\FSComp.txt:313) + static member csTypeDoesNotHaveNull(a0 : System.String) = (GetStringFunc("csTypeDoesNotHaveNull",",,,%s,,,") a0) + /// The type '%s' does not have 'null' as a proper value. To create a null value for a Nullable type use 'System.Nullable()'. + /// (Originally from ..\FSComp.txt:314) + static member csNullableTypeDoesNotHaveNull(a0 : System.String) = (GetStringFunc("csNullableTypeDoesNotHaveNull",",,,%s,,,") a0) + /// The type '%s' does not support the 'comparison' constraint because it has the 'NoComparison' attribute + /// (Originally from ..\FSComp.txt:315) + static member csTypeDoesNotSupportComparison1(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison1",",,,%s,,,") a0) + /// The type '%s' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + /// (Originally from ..\FSComp.txt:316) + static member csTypeDoesNotSupportComparison2(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison2",",,,%s,,,") a0) + /// The type '%s' does not support the 'comparison' constraint because it is a record, union or struct with one or more structural element types which do not support the 'comparison' constraint. Either avoid the use of comparison with this type, or add the 'StructuralComparison' attribute to the type to determine which field type does not support comparison + /// (Originally from ..\FSComp.txt:317) + static member csTypeDoesNotSupportComparison3(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison3",",,,%s,,,") a0) + /// The type '%s' does not support the 'equality' constraint because it has the 'NoEquality' attribute + /// (Originally from ..\FSComp.txt:318) + static member csTypeDoesNotSupportEquality1(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality1",",,,%s,,,") a0) + /// The type '%s' does not support the 'equality' constraint because it is a function type + /// (Originally from ..\FSComp.txt:319) + static member csTypeDoesNotSupportEquality2(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality2",",,,%s,,,") a0) + /// The type '%s' does not support the 'equality' constraint because it is a record, union or struct with one or more structural element types which do not support the 'equality' constraint. Either avoid the use of equality with this type, or add the 'StructuralEquality' attribute to the type to determine which field type does not support equality + /// (Originally from ..\FSComp.txt:320) + static member csTypeDoesNotSupportEquality3(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality3",",,,%s,,,") a0) + /// The type '%s' is not a CLI enum type + /// (Originally from ..\FSComp.txt:321) + static member csTypeIsNotEnumType(a0 : System.String) = (GetStringFunc("csTypeIsNotEnumType",",,,%s,,,") a0) + /// The type '%s' has a non-standard delegate type + /// (Originally from ..\FSComp.txt:322) + static member csTypeHasNonStandardDelegateType(a0 : System.String) = (GetStringFunc("csTypeHasNonStandardDelegateType",",,,%s,,,") a0) + /// The type '%s' is not a CLI delegate type + /// (Originally from ..\FSComp.txt:323) + static member csTypeIsNotDelegateType(a0 : System.String) = (GetStringFunc("csTypeIsNotDelegateType",",,,%s,,,") a0) + /// This type parameter cannot be instantiated to 'Nullable'. This is a restriction imposed in order to ensure the meaning of 'null' in some CLI languages is not confusing when used in conjunction with 'Nullable' values. + /// (Originally from ..\FSComp.txt:324) + static member csTypeParameterCannotBeNullable() = (GetStringFunc("csTypeParameterCannotBeNullable",",,,") ) + /// A generic construct requires that the type '%s' is a CLI or F# struct type + /// (Originally from ..\FSComp.txt:325) + static member csGenericConstructRequiresStructType(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresStructType",",,,%s,,,") a0) + /// A generic construct requires that the type '%s' is an unmanaged type + /// (Originally from ..\FSComp.txt:326) + static member csGenericConstructRequiresUnmanagedType(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresUnmanagedType",",,,%s,,,") a0) + /// The type '%s' is not compatible with any of the types %s, arising from the use of a printf-style format string + /// (Originally from ..\FSComp.txt:327) + static member csTypeNotCompatibleBecauseOfPrintf(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeNotCompatibleBecauseOfPrintf",",,,%s,,,%s,,,") a0 a1) + /// A generic construct requires that the type '%s' have reference semantics, but it does not, i.e. it is a struct + /// (Originally from ..\FSComp.txt:328) + static member csGenericConstructRequiresReferenceSemantics(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresReferenceSemantics",",,,%s,,,") a0) + /// A generic construct requires that the type '%s' be non-abstract + /// (Originally from ..\FSComp.txt:329) + static member csGenericConstructRequiresNonAbstract(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresNonAbstract",",,,%s,,,") a0) + /// A generic construct requires that the type '%s' have a public default constructor + /// (Originally from ..\FSComp.txt:330) + static member csGenericConstructRequiresPublicDefaultConstructor(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresPublicDefaultConstructor",",,,%s,,,") a0) + /// Type instantiation length mismatch + /// (Originally from ..\FSComp.txt:331) + static member csTypeInstantiationLengthMismatch() = (483, GetStringFunc("csTypeInstantiationLengthMismatch",",,,") ) + /// Optional arguments not permitted here + /// (Originally from ..\FSComp.txt:332) + static member csOptionalArgumentNotPermittedHere() = (484, GetStringFunc("csOptionalArgumentNotPermittedHere",",,,") ) + /// %s is not a static member + /// (Originally from ..\FSComp.txt:333) + static member csMemberIsNotStatic(a0 : System.String) = (485, GetStringFunc("csMemberIsNotStatic",",,,%s,,,") a0) + /// %s is not an instance member + /// (Originally from ..\FSComp.txt:334) + static member csMemberIsNotInstance(a0 : System.String) = (486, GetStringFunc("csMemberIsNotInstance",",,,%s,,,") a0) + /// Argument length mismatch + /// (Originally from ..\FSComp.txt:335) + static member csArgumentLengthMismatch() = (487, GetStringFunc("csArgumentLengthMismatch",",,,") ) + /// The argument types don't match + /// (Originally from ..\FSComp.txt:336) + static member csArgumentTypesDoNotMatch() = (488, GetStringFunc("csArgumentTypesDoNotMatch",",,,") ) + /// This method expects a CLI 'params' parameter in this position. 'params' is a way of passing a variable number of arguments to a method in languages such as C#. Consider passing an array for this argument + /// (Originally from ..\FSComp.txt:337) + static member csMethodExpectsParams() = (489, GetStringFunc("csMethodExpectsParams",",,,") ) + /// The member or object constructor '%s' is not %s + /// (Originally from ..\FSComp.txt:338) + static member csMemberIsNotAccessible(a0 : System.String, a1 : System.String) = (490, GetStringFunc("csMemberIsNotAccessible",",,,%s,,,%s,,,") a0 a1) + /// The member or object constructor '%s' is not %s. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions. + /// (Originally from ..\FSComp.txt:339) + static member csMemberIsNotAccessible2(a0 : System.String, a1 : System.String) = (491, GetStringFunc("csMemberIsNotAccessible2",",,,%s,,,%s,,,") a0 a1) + /// %s is not a static method + /// (Originally from ..\FSComp.txt:340) + static member csMethodIsNotAStaticMethod(a0 : System.String) = (492, GetStringFunc("csMethodIsNotAStaticMethod",",,,%s,,,") a0) + /// %s is not an instance method + /// (Originally from ..\FSComp.txt:341) + static member csMethodIsNotAnInstanceMethod(a0 : System.String) = (493, GetStringFunc("csMethodIsNotAnInstanceMethod",",,,%s,,,") a0) + /// The member or object constructor '%s' has no argument or settable return property '%s'. %s. + /// (Originally from ..\FSComp.txt:342) + static member csMemberHasNoArgumentOrReturnProperty(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMemberHasNoArgumentOrReturnProperty",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The object constructor '%s' has no argument or settable return property '%s'. %s. + /// (Originally from ..\FSComp.txt:343) + static member csCtorHasNoArgumentOrReturnProperty(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csCtorHasNoArgumentOrReturnProperty",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The required signature is %s + /// (Originally from ..\FSComp.txt:344) + static member csRequiredSignatureIs(a0 : System.String) = (495, GetStringFunc("csRequiredSignatureIs",",,,%s,,,") a0) + /// The member or object constructor '%s' requires %d argument(s). The required signature is '%s'. + /// (Originally from ..\FSComp.txt:345) + static member csMemberSignatureMismatch(a0 : System.String, a1 : System.Int32, a2 : System.String) = (496, GetStringFunc("csMemberSignatureMismatch",",,,%s,,,%d,,,%s,,,") a0 a1 a2) + /// The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'. + /// (Originally from ..\FSComp.txt:346) + static member csMemberSignatureMismatch2(a0 : System.String, a1 : System.Int32, a2 : System.String) = (497, GetStringFunc("csMemberSignatureMismatch2",",,,%s,,,%d,,,%s,,,") a0 a1 a2) + /// The member or object constructor '%s' requires %d argument(s). The required signature is '%s'. Some names for missing arguments are %s. + /// (Originally from ..\FSComp.txt:347) + static member csMemberSignatureMismatch3(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.String) = (498, GetStringFunc("csMemberSignatureMismatch3",",,,%s,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'. Some names for missing arguments are %s. + /// (Originally from ..\FSComp.txt:348) + static member csMemberSignatureMismatch4(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.String) = (499, GetStringFunc("csMemberSignatureMismatch4",",,,%s,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3) + /// The member or object constructor '%s' requires %d argument(s) but is here given %d unnamed and %d named argument(s). The required signature is '%s'. + /// (Originally from ..\FSComp.txt:349) + static member csMemberSignatureMismatchArityNamed(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.Int32, a4 : System.String) = (500, GetStringFunc("csMemberSignatureMismatchArityNamed",",,,%s,,,%d,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3 a4) + /// The member or object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:350) + static member csMemberSignatureMismatchArity(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csMemberSignatureMismatchArity",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) + /// The object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:351) + static member csCtorSignatureMismatchArity(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csCtorSignatureMismatchArity",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) + /// The object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. If some of the arguments are meant to assign values to properties, consider separating those arguments with a comma (','). + /// (Originally from ..\FSComp.txt:352) + static member csCtorSignatureMismatchArityProp(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csCtorSignatureMismatchArityProp",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) + /// The member or object constructor '%s' takes %d type argument(s) but is here given %d. The required signature is '%s'. + /// (Originally from ..\FSComp.txt:353) + static member csMemberSignatureMismatchArityType(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (502, GetStringFunc("csMemberSignatureMismatchArityType",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) + /// A member or object constructor '%s' taking %d arguments is not accessible from this code location. All accessible versions of method '%s' take %d arguments. + /// (Originally from ..\FSComp.txt:354) + static member csMemberNotAccessible(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.Int32) = (503, GetStringFunc("csMemberNotAccessible",",,,%s,,,%d,,,%s,,,%d,,,") a0 a1 a2 a3) + /// Incorrect generic instantiation. No %s member named '%s' takes %d generic arguments. + /// (Originally from ..\FSComp.txt:355) + static member csIncorrectGenericInstantiation(a0 : System.String, a1 : System.String, a2 : System.Int32) = (504, GetStringFunc("csIncorrectGenericInstantiation",",,,%s,,,%s,,,%d,,,") a0 a1 a2) + /// The member or object constructor '%s' does not take %d argument(s). An overload was found taking %d arguments. + /// (Originally from ..\FSComp.txt:356) + static member csMemberOverloadArityMismatch(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (505, GetStringFunc("csMemberOverloadArityMismatch",",,,%s,,,%d,,,%d,,,") a0 a1 a2) + /// No %s member or object constructor named '%s' takes %d arguments + /// (Originally from ..\FSComp.txt:357) + static member csNoMemberTakesTheseArguments(a0 : System.String, a1 : System.String, a2 : System.Int32) = (506, GetStringFunc("csNoMemberTakesTheseArguments",",,,%s,,,%s,,,%d,,,") a0 a1 a2) + /// No %s member or object constructor named '%s' takes %d arguments. Note the call to this member also provides %d named arguments. + /// (Originally from ..\FSComp.txt:358) + static member csNoMemberTakesTheseArguments2(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.Int32) = (507, GetStringFunc("csNoMemberTakesTheseArguments2",",,,%s,,,%s,,,%d,,,%d,,,") a0 a1 a2 a3) + /// No %s member or object constructor named '%s' takes %d arguments. The named argument '%s' doesn't correspond to any argument or settable return property for any overload. + /// (Originally from ..\FSComp.txt:359) + static member csNoMemberTakesTheseArguments3(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.String) = (508, GetStringFunc("csNoMemberTakesTheseArguments3",",,,%s,,,%s,,,%d,,,%s,,,") a0 a1 a2 a3) + /// Method or object constructor '%s' not found + /// (Originally from ..\FSComp.txt:360) + static member csMethodNotFound(a0 : System.String) = (509, GetStringFunc("csMethodNotFound",",,,%s,,,") a0) + /// No overloads match for method '%s'. + /// (Originally from ..\FSComp.txt:361) + static member csNoOverloadsFound(a0 : System.String) = (GetStringFunc("csNoOverloadsFound",",,,%s,,,") a0) + /// A unique overload for method '%s' could not be determined based on type information prior to this program point. A type annotation may be needed. + /// (Originally from ..\FSComp.txt:362) + static member csMethodIsOverloaded(a0 : System.String) = (GetStringFunc("csMethodIsOverloaded",",,,%s,,,") a0) + /// Candidates: %s + /// (Originally from ..\FSComp.txt:363) + static member csCandidates(a0 : System.String) = (GetStringFunc("csCandidates",",,,%s,,,") a0) + /// The available overloads are shown below. + /// (Originally from ..\FSComp.txt:364) + static member csSeeAvailableOverloads() = (GetStringFunc("csSeeAvailableOverloads",",,,") ) + /// Accessibility modifiers are not permitted on 'do' bindings, but '%s' was given. + /// (Originally from ..\FSComp.txt:365) + static member parsDoCannotHaveVisibilityDeclarations(a0 : System.String) = (512, GetStringFunc("parsDoCannotHaveVisibilityDeclarations",",,,%s,,,") a0) + /// End of file in #if section begun at or after here + /// (Originally from ..\FSComp.txt:366) + static member parsEofInHashIf() = (513, GetStringFunc("parsEofInHashIf",",,,") ) + /// End of file in string begun at or before here + /// (Originally from ..\FSComp.txt:367) + static member parsEofInString() = (514, GetStringFunc("parsEofInString",",,,") ) + /// End of file in verbatim string begun at or before here + /// (Originally from ..\FSComp.txt:368) + static member parsEofInVerbatimString() = (515, GetStringFunc("parsEofInVerbatimString",",,,") ) + /// End of file in comment begun at or before here + /// (Originally from ..\FSComp.txt:369) + static member parsEofInComment() = (516, GetStringFunc("parsEofInComment",",,,") ) + /// End of file in string embedded in comment begun at or before here + /// (Originally from ..\FSComp.txt:370) + static member parsEofInStringInComment() = (517, GetStringFunc("parsEofInStringInComment",",,,") ) + /// End of file in verbatim string embedded in comment begun at or before here + /// (Originally from ..\FSComp.txt:371) + static member parsEofInVerbatimStringInComment() = (518, GetStringFunc("parsEofInVerbatimStringInComment",",,,") ) + /// End of file in IF-OCAML section begun at or before here + /// (Originally from ..\FSComp.txt:372) + static member parsEofInIfOcaml() = (519, GetStringFunc("parsEofInIfOcaml",",,,") ) + /// End of file in directive begun at or before here + /// (Originally from ..\FSComp.txt:373) + static member parsEofInDirective() = (520, GetStringFunc("parsEofInDirective",",,,") ) + /// No #endif found for #if or #else + /// (Originally from ..\FSComp.txt:374) + static member parsNoHashEndIfFound() = (521, GetStringFunc("parsNoHashEndIfFound",",,,") ) + /// Attributes have been ignored in this construct + /// (Originally from ..\FSComp.txt:375) + static member parsAttributesIgnored() = (522, GetStringFunc("parsAttributesIgnored",",,,") ) + /// 'use' bindings are not permitted in primary constructors + /// (Originally from ..\FSComp.txt:376) + static member parsUseBindingsIllegalInImplicitClassConstructors() = (523, GetStringFunc("parsUseBindingsIllegalInImplicitClassConstructors",",,,") ) + /// 'use' bindings are not permitted in modules and are treated as 'let' bindings + /// (Originally from ..\FSComp.txt:377) + static member parsUseBindingsIllegalInModules() = (524, GetStringFunc("parsUseBindingsIllegalInModules",",,,") ) + /// An integer for loop must use a simple identifier + /// (Originally from ..\FSComp.txt:378) + static member parsIntegerForLoopRequiresSimpleIdentifier() = (525, GetStringFunc("parsIntegerForLoopRequiresSimpleIdentifier",",,,") ) + /// At most one 'with' augmentation is permitted + /// (Originally from ..\FSComp.txt:379) + static member parsOnlyOneWithAugmentationAllowed() = (526, GetStringFunc("parsOnlyOneWithAugmentationAllowed",",,,") ) + /// A semicolon is not expected at this point + /// (Originally from ..\FSComp.txt:380) + static member parsUnexpectedSemicolon() = (527, GetStringFunc("parsUnexpectedSemicolon",",,,") ) + /// Unexpected end of input + /// (Originally from ..\FSComp.txt:381) + static member parsUnexpectedEndOfFile() = (528, GetStringFunc("parsUnexpectedEndOfFile",",,,") ) + /// Accessibility modifiers are not permitted here, but '%s' was given. + /// (Originally from ..\FSComp.txt:382) + static member parsUnexpectedVisibilityDeclaration(a0 : System.String) = (529, GetStringFunc("parsUnexpectedVisibilityDeclaration",",,,%s,,,") a0) + /// Only '#' compiler directives may occur prior to the first 'namespace' declaration + /// (Originally from ..\FSComp.txt:383) + static member parsOnlyHashDirectivesAllowed() = (530, GetStringFunc("parsOnlyHashDirectivesAllowed",",,,") ) + /// Accessibility modifiers should come immediately prior to the identifier naming a construct + /// (Originally from ..\FSComp.txt:384) + static member parsVisibilityDeclarationsShouldComePriorToIdentifier() = (531, GetStringFunc("parsVisibilityDeclarationsShouldComePriorToIdentifier",",,,") ) + /// Files should begin with either a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule', but not both. To define a module within a namespace use 'module SomeModule = ...' + /// (Originally from ..\FSComp.txt:385) + static member parsNamespaceOrModuleNotBoth() = (532, GetStringFunc("parsNamespaceOrModuleNotBoth",",,,") ) + /// A module abbreviation must be a simple name, not a path + /// (Originally from ..\FSComp.txt:386) + static member parsModuleAbbreviationMustBeSimpleName() = (534, GetStringFunc("parsModuleAbbreviationMustBeSimpleName",",,,") ) + /// Ignoring attributes on module abbreviation + /// (Originally from ..\FSComp.txt:387) + static member parsIgnoreAttributesOnModuleAbbreviation() = (535, GetStringFunc("parsIgnoreAttributesOnModuleAbbreviation",",,,") ) + /// The '%s' accessibility attribute is not allowed on module abbreviation. Module abbreviations are always private. + /// (Originally from ..\FSComp.txt:388) + static member parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate(a0 : System.String) = (536, GetStringFunc("parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate",",,,%s,,,") a0) + /// The '%s' visibility attribute is not allowed on module abbreviation. Module abbreviations are always private. + /// (Originally from ..\FSComp.txt:389) + static member parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate(a0 : System.String) = (537, GetStringFunc("parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate",",,,%s,,,") a0) + /// Unclosed block + /// (Originally from ..\FSComp.txt:390) + static member parsUnClosedBlockInHashLight() = (538, GetStringFunc("parsUnClosedBlockInHashLight",",,,") ) + /// Unmatched 'begin' or 'struct' + /// (Originally from ..\FSComp.txt:391) + static member parsUnmatchedBeginOrStruct() = (539, GetStringFunc("parsUnmatchedBeginOrStruct",",,,") ) + /// A module name must be a simple name, not a path + /// (Originally from ..\FSComp.txt:392) + static member parsModuleDefnMustBeSimpleName() = (541, GetStringFunc("parsModuleDefnMustBeSimpleName",",,,") ) + /// Unexpected empty type moduleDefn list + /// (Originally from ..\FSComp.txt:393) + static member parsUnexpectedEmptyModuleDefn() = (542, GetStringFunc("parsUnexpectedEmptyModuleDefn",",,,") ) + /// Attributes should be placed before 'val' + /// (Originally from ..\FSComp.txt:394) + static member parsAttributesMustComeBeforeVal() = (GetStringFunc("parsAttributesMustComeBeforeVal",",,,") ) + /// Attributes are not permitted on interface implementations + /// (Originally from ..\FSComp.txt:395) + static member parsAttributesAreNotPermittedOnInterfaceImplementations() = (543, GetStringFunc("parsAttributesAreNotPermittedOnInterfaceImplementations",",,,") ) + /// Syntax error + /// (Originally from ..\FSComp.txt:396) + static member parsSyntaxError() = (544, GetStringFunc("parsSyntaxError",",,,") ) + /// Augmentations are not permitted on delegate type moduleDefns + /// (Originally from ..\FSComp.txt:397) + static member parsAugmentationsIllegalOnDelegateType() = (545, GetStringFunc("parsAugmentationsIllegalOnDelegateType",",,,") ) + /// Unmatched 'class', 'interface' or 'struct' + /// (Originally from ..\FSComp.txt:398) + static member parsUnmatchedClassInterfaceOrStruct() = (546, GetStringFunc("parsUnmatchedClassInterfaceOrStruct",",,,") ) + /// A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. + /// (Originally from ..\FSComp.txt:399) + static member parsEmptyTypeDefinition() = (547, GetStringFunc("parsEmptyTypeDefinition",",,,") ) + /// Unmatched 'with' or badly formatted 'with' block + /// (Originally from ..\FSComp.txt:400) + static member parsUnmatchedWith() = (550, GetStringFunc("parsUnmatchedWith",",,,") ) + /// 'get', 'set' or 'get,set' required + /// (Originally from ..\FSComp.txt:401) + static member parsGetOrSetRequired() = (551, GetStringFunc("parsGetOrSetRequired",",,,") ) + /// Only class types may take value arguments + /// (Originally from ..\FSComp.txt:402) + static member parsOnlyClassCanTakeValueArguments() = (552, GetStringFunc("parsOnlyClassCanTakeValueArguments",",,,") ) + /// Unmatched 'begin' + /// (Originally from ..\FSComp.txt:403) + static member parsUnmatchedBegin() = (553, GetStringFunc("parsUnmatchedBegin",",,,") ) + /// Invalid declaration syntax + /// (Originally from ..\FSComp.txt:404) + static member parsInvalidDeclarationSyntax() = (554, GetStringFunc("parsInvalidDeclarationSyntax",",,,") ) + /// 'get' and/or 'set' required + /// (Originally from ..\FSComp.txt:405) + static member parsGetAndOrSetRequired() = (555, GetStringFunc("parsGetAndOrSetRequired",",,,") ) + /// Type annotations on property getters and setters must be given after the 'get()' or 'set(v)', e.g. 'with get() : string = ...' + /// (Originally from ..\FSComp.txt:406) + static member parsTypeAnnotationsOnGetSet() = (556, GetStringFunc("parsTypeAnnotationsOnGetSet",",,,") ) + /// A getter property is expected to be a function, e.g. 'get() = ...' or 'get(index) = ...' + /// (Originally from ..\FSComp.txt:407) + static member parsGetterMustHaveAtLeastOneArgument() = (557, GetStringFunc("parsGetterMustHaveAtLeastOneArgument",",,,") ) + /// Multiple accessibilities given for property getter or setter + /// (Originally from ..\FSComp.txt:408) + static member parsMultipleAccessibilitiesForGetSet() = (558, GetStringFunc("parsMultipleAccessibilitiesForGetSet",",,,") ) + /// Property setters must be defined using 'set value = ', 'set idx value = ' or 'set (idx1,...,idxN) value = ... ' + /// (Originally from ..\FSComp.txt:409) + static member parsSetSyntax() = (559, GetStringFunc("parsSetSyntax",",,,") ) + /// Interfaces always have the same visibility as the enclosing type + /// (Originally from ..\FSComp.txt:410) + static member parsInterfacesHaveSameVisibilityAsEnclosingType() = (560, GetStringFunc("parsInterfacesHaveSameVisibilityAsEnclosingType",",,,") ) + /// Accessibility modifiers are not allowed on this member. Abstract slots always have the same visibility as the enclosing type. + /// (Originally from ..\FSComp.txt:411) + static member parsAccessibilityModsIllegalForAbstract() = (561, GetStringFunc("parsAccessibilityModsIllegalForAbstract",",,,") ) + /// Attributes are not permitted on 'inherit' declarations + /// (Originally from ..\FSComp.txt:412) + static member parsAttributesIllegalOnInherit() = (562, GetStringFunc("parsAttributesIllegalOnInherit",",,,") ) + /// Accessibility modifiers are not permitted on an 'inherits' declaration + /// (Originally from ..\FSComp.txt:413) + static member parsVisibilityIllegalOnInherit() = (563, GetStringFunc("parsVisibilityIllegalOnInherit",",,,") ) + /// 'inherit' declarations cannot have 'as' bindings. To access members of the base class when overriding a method, the syntax 'base.SomeMember' may be used; 'base' is a keyword. Remove this 'as' binding. + /// (Originally from ..\FSComp.txt:414) + static member parsInheritDeclarationsCannotHaveAsBindings() = (564, GetStringFunc("parsInheritDeclarationsCannotHaveAsBindings",",,,") ) + /// Attributes are not allowed here + /// (Originally from ..\FSComp.txt:415) + static member parsAttributesIllegalHere() = (565, GetStringFunc("parsAttributesIllegalHere",",,,") ) + /// Accessibility modifiers are not permitted in this position for type abbreviations + /// (Originally from ..\FSComp.txt:416) + static member parsTypeAbbreviationsCannotHaveVisibilityDeclarations() = (566, GetStringFunc("parsTypeAbbreviationsCannotHaveVisibilityDeclarations",",,,") ) + /// Accessibility modifiers are not permitted in this position for enum types + /// (Originally from ..\FSComp.txt:417) + static member parsEnumTypesCannotHaveVisibilityDeclarations() = (567, GetStringFunc("parsEnumTypesCannotHaveVisibilityDeclarations",",,,") ) + /// All enum fields must be given values + /// (Originally from ..\FSComp.txt:418) + static member parsAllEnumFieldsRequireValues() = (568, GetStringFunc("parsAllEnumFieldsRequireValues",",,,") ) + /// Accessibility modifiers are not permitted on inline assembly code types + /// (Originally from ..\FSComp.txt:419) + static member parsInlineAssemblyCannotHaveVisibilityDeclarations() = (569, GetStringFunc("parsInlineAssemblyCannotHaveVisibilityDeclarations",",,,") ) + /// Unexpected identifier: '%s' + /// (Originally from ..\FSComp.txt:420) + static member parsUnexpectedIdentifier(a0 : System.String) = (571, GetStringFunc("parsUnexpectedIdentifier",",,,%s,,,") a0) + /// Accessibility modifiers are not permitted on union cases. Use 'type U = internal ...' or 'type U = private ...' to give an accessibility to the whole representation. + /// (Originally from ..\FSComp.txt:421) + static member parsUnionCasesCannotHaveVisibilityDeclarations() = (572, GetStringFunc("parsUnionCasesCannotHaveVisibilityDeclarations",",,,") ) + /// Accessibility modifiers are not permitted on enumeration fields + /// (Originally from ..\FSComp.txt:422) + static member parsEnumFieldsCannotHaveVisibilityDeclarations() = (573, GetStringFunc("parsEnumFieldsCannotHaveVisibilityDeclarations",",,,") ) + /// Consider using a separate record type instead + /// (Originally from ..\FSComp.txt:423) + static member parsConsiderUsingSeparateRecordType() = (GetStringFunc("parsConsiderUsingSeparateRecordType",",,,") ) + /// Accessibility modifiers are not permitted on record fields. Use 'type R = internal ...' or 'type R = private ...' to give an accessibility to the whole representation. + /// (Originally from ..\FSComp.txt:424) + static member parsRecordFieldsCannotHaveVisibilityDeclarations() = (575, GetStringFunc("parsRecordFieldsCannotHaveVisibilityDeclarations",",,,") ) + /// The declaration form 'let ... and ...' for non-recursive bindings is not used in F# code. Consider using a sequence of 'let' bindings + /// (Originally from ..\FSComp.txt:425) + static member parsLetAndForNonRecBindings() = (576, GetStringFunc("parsLetAndForNonRecBindings",",,,") ) + /// Unmatched '(' + /// (Originally from ..\FSComp.txt:426) + static member parsUnmatchedParen() = (583, GetStringFunc("parsUnmatchedParen",",,,") ) + /// Successive patterns should be separated by spaces or tupled + /// (Originally from ..\FSComp.txt:427) + static member parsSuccessivePatternsShouldBeSpacedOrTupled() = (584, GetStringFunc("parsSuccessivePatternsShouldBeSpacedOrTupled",",,,") ) + /// No matching 'in' found for this 'let' + /// (Originally from ..\FSComp.txt:428) + static member parsNoMatchingInForLet() = (586, GetStringFunc("parsNoMatchingInForLet",",,,") ) + /// Error in the return expression for this 'let'. Possible incorrect indentation. + /// (Originally from ..\FSComp.txt:429) + static member parsErrorInReturnForLetIncorrectIndentation() = (587, GetStringFunc("parsErrorInReturnForLetIncorrectIndentation",",,,") ) + /// The block following this '%s' is unfinished. Every code block is an expression and must have a result. '%s' cannot be the final code element in a block. Consider giving this block an explicit result. + /// (Originally from ..\FSComp.txt:430) + static member parsExpectedExpressionAfterLet(a0 : System.String, a1 : System.String) = (588, GetStringFunc("parsExpectedExpressionAfterLet",",,,%s,,,%s,,,") a0 a1) + /// Incomplete conditional. Expected 'if then ' or 'if then else '. + /// (Originally from ..\FSComp.txt:431) + static member parsIncompleteIf() = (589, GetStringFunc("parsIncompleteIf",",,,") ) + /// 'assert' may not be used as a first class value. Use 'assert ' instead. + /// (Originally from ..\FSComp.txt:432) + static member parsAssertIsNotFirstClassValue() = (590, GetStringFunc("parsAssertIsNotFirstClassValue",",,,") ) + /// Identifier expected + /// (Originally from ..\FSComp.txt:433) + static member parsIdentifierExpected() = (594, GetStringFunc("parsIdentifierExpected",",,,") ) + /// 'in' or '=' expected + /// (Originally from ..\FSComp.txt:434) + static member parsInOrEqualExpected() = (595, GetStringFunc("parsInOrEqualExpected",",,,") ) + /// The use of '->' in sequence and computation expressions is limited to the form 'for pat in expr -> expr'. Use the syntax 'for ... in ... do ... yield...' to generate elements in more complex sequence expressions. + /// (Originally from ..\FSComp.txt:435) + static member parsArrowUseIsLimited() = (596, GetStringFunc("parsArrowUseIsLimited",",,,") ) + /// Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized + /// (Originally from ..\FSComp.txt:436) + static member parsSuccessiveArgsShouldBeSpacedOrTupled() = (597, GetStringFunc("parsSuccessiveArgsShouldBeSpacedOrTupled",",,,") ) + /// Unmatched '[' + /// (Originally from ..\FSComp.txt:437) + static member parsUnmatchedBracket() = (598, GetStringFunc("parsUnmatchedBracket",",,,") ) + /// Missing qualification after '.' + /// (Originally from ..\FSComp.txt:438) + static member parsMissingQualificationAfterDot() = (599, GetStringFunc("parsMissingQualificationAfterDot",",,,") ) + /// In F# code you may use 'expr.[expr]'. A type annotation may be required to indicate the first expression is an array + /// (Originally from ..\FSComp.txt:439) + static member parsParenFormIsForML() = (GetStringFunc("parsParenFormIsForML",",,,") ) + /// Mismatched quotation, beginning with '%s' + /// (Originally from ..\FSComp.txt:440) + static member parsMismatchedQuote(a0 : System.String) = (601, GetStringFunc("parsMismatchedQuote",",,,%s,,,") a0) + /// Unmatched '%s' + /// (Originally from ..\FSComp.txt:441) + static member parsUnmatched(a0 : System.String) = (602, GetStringFunc("parsUnmatched",",,,%s,,,") a0) + /// Unmatched '[|' + /// (Originally from ..\FSComp.txt:442) + static member parsUnmatchedBracketBar() = (603, GetStringFunc("parsUnmatchedBracketBar",",,,") ) + /// Unmatched '{' + /// (Originally from ..\FSComp.txt:443) + static member parsUnmatchedBrace() = (604, GetStringFunc("parsUnmatchedBrace",",,,") ) + /// Field bindings must have the form 'id = expr;' + /// (Originally from ..\FSComp.txt:444) + static member parsFieldBinding() = (609, GetStringFunc("parsFieldBinding",",,,") ) + /// This member is not permitted in an object implementation + /// (Originally from ..\FSComp.txt:445) + static member parsMemberIllegalInObjectImplementation() = (610, GetStringFunc("parsMemberIllegalInObjectImplementation",",,,") ) + /// Missing function body + /// (Originally from ..\FSComp.txt:446) + static member parsMissingFunctionBody() = (611, GetStringFunc("parsMissingFunctionBody",",,,") ) + /// Syntax error in labelled type argument + /// (Originally from ..\FSComp.txt:447) + static member parsSyntaxErrorInLabeledType() = (613, GetStringFunc("parsSyntaxErrorInLabeledType",",,,") ) + /// Unexpected infix operator in type expression + /// (Originally from ..\FSComp.txt:448) + static member parsUnexpectedInfixOperator() = (615, GetStringFunc("parsUnexpectedInfixOperator",",,,") ) + /// The syntax '(typ,...,typ) ident' is not used in F# code. Consider using 'ident' instead + /// (Originally from ..\FSComp.txt:449) + static member parsMultiArgumentGenericTypeFormDeprecated() = (GetStringFunc("parsMultiArgumentGenericTypeFormDeprecated",",,,") ) + /// Invalid literal in type + /// (Originally from ..\FSComp.txt:450) + static member parsInvalidLiteralInType() = (618, GetStringFunc("parsInvalidLiteralInType",",,,") ) + /// Unexpected infix operator in unit-of-measure expression. Legal operators are '*', '/' and '^'. + /// (Originally from ..\FSComp.txt:451) + static member parsUnexpectedOperatorForUnitOfMeasure() = (619, GetStringFunc("parsUnexpectedOperatorForUnitOfMeasure",",,,") ) + /// Unexpected integer literal in unit-of-measure expression + /// (Originally from ..\FSComp.txt:452) + static member parsUnexpectedIntegerLiteralForUnitOfMeasure() = (620, GetStringFunc("parsUnexpectedIntegerLiteralForUnitOfMeasure",",,,") ) + /// Syntax error: unexpected type parameter specification + /// (Originally from ..\FSComp.txt:453) + static member parsUnexpectedTypeParameter() = (621, GetStringFunc("parsUnexpectedTypeParameter",",,,") ) + /// Mismatched quotation operator name, beginning with '%s' + /// (Originally from ..\FSComp.txt:454) + static member parsMismatchedQuotationName(a0 : System.String) = (622, GetStringFunc("parsMismatchedQuotationName",",,,%s,,,") a0) + /// Active pattern case identifiers must begin with an uppercase letter + /// (Originally from ..\FSComp.txt:455) + static member parsActivePatternCaseMustBeginWithUpperCase() = (623, GetStringFunc("parsActivePatternCaseMustBeginWithUpperCase",",,,") ) + /// The '|' character is not permitted in active pattern case identifiers + /// (Originally from ..\FSComp.txt:456) + static member parsActivePatternCaseContainsPipe() = (624, GetStringFunc("parsActivePatternCaseContainsPipe",",,,") ) + /// Denominator must not be 0 in unit-of-measure exponent + /// (Originally from ..\FSComp.txt:457) + static member parsIllegalDenominatorForMeasureExponent() = (625, GetStringFunc("parsIllegalDenominatorForMeasureExponent",",,,") ) + /// No '=' symbol should follow a 'namespace' declaration + /// (Originally from ..\FSComp.txt:458) + static member parsNoEqualShouldFollowNamespace() = (GetStringFunc("parsNoEqualShouldFollowNamespace",",,,") ) + /// The syntax 'module ... = struct .. end' is not used in F# code. Consider using 'module ... = begin .. end' + /// (Originally from ..\FSComp.txt:459) + static member parsSyntaxModuleStructEndDeprecated() = (GetStringFunc("parsSyntaxModuleStructEndDeprecated",",,,") ) + /// The syntax 'module ... : sig .. end' is not used in F# code. Consider using 'module ... = begin .. end' + /// (Originally from ..\FSComp.txt:460) + static member parsSyntaxModuleSigEndDeprecated() = (GetStringFunc("parsSyntaxModuleSigEndDeprecated",",,,") ) + /// A static field was used where an instance field is expected + /// (Originally from ..\FSComp.txt:461) + static member tcStaticFieldUsedWhenInstanceFieldExpected() = (627, GetStringFunc("tcStaticFieldUsedWhenInstanceFieldExpected",",,,") ) + /// Method '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:462) + static member tcMethodNotAccessible(a0 : System.String) = (629, GetStringFunc("tcMethodNotAccessible",",,,%s,,,") a0) + /// Implicit product of measures following / + /// (Originally from ..\FSComp.txt:464) + static member tcImplicitMeasureFollowingSlash() = (632, GetStringFunc("tcImplicitMeasureFollowingSlash",",,,") ) + /// Unexpected SynMeasure.Anon + /// (Originally from ..\FSComp.txt:465) + static member tcUnexpectedMeasureAnon() = (633, GetStringFunc("tcUnexpectedMeasureAnon",",,,") ) + /// Non-zero constants cannot have generic units. For generic zero, write 0.0<_>. + /// (Originally from ..\FSComp.txt:466) + static member tcNonZeroConstantCannotHaveGenericUnit() = (634, GetStringFunc("tcNonZeroConstantCannotHaveGenericUnit",",,,") ) + /// In sequence expressions, results are generated using 'yield' + /// (Originally from ..\FSComp.txt:467) + static member tcSeqResultsUseYield() = (635, GetStringFunc("tcSeqResultsUseYield",",,,") ) + /// Unexpected big rational constant + /// (Originally from ..\FSComp.txt:468) + static member tcUnexpectedBigRationalConstant() = (GetStringFunc("tcUnexpectedBigRationalConstant",",,,") ) + /// Units-of-measure supported only on float, float32, decimal and signed integer types + /// (Originally from ..\FSComp.txt:469) + static member tcInvalidTypeForUnitsOfMeasure() = (636, GetStringFunc("tcInvalidTypeForUnitsOfMeasure",",,,") ) + /// Unexpected Const_uint16array + /// (Originally from ..\FSComp.txt:470) + static member tcUnexpectedConstUint16Array() = (GetStringFunc("tcUnexpectedConstUint16Array",",,,") ) + /// Unexpected Const_bytearray + /// (Originally from ..\FSComp.txt:471) + static member tcUnexpectedConstByteArray() = (GetStringFunc("tcUnexpectedConstByteArray",",,,") ) + /// A parameter with attributes must also be given a name, e.g. '[] Name : Type' + /// (Originally from ..\FSComp.txt:472) + static member tcParameterRequiresName() = (640, GetStringFunc("tcParameterRequiresName",",,,") ) + /// Return values cannot have names + /// (Originally from ..\FSComp.txt:473) + static member tcReturnValuesCannotHaveNames() = (641, GetStringFunc("tcReturnValuesCannotHaveNames",",,,") ) + /// MemberKind.PropertyGetSet only expected in parse trees + /// (Originally from ..\FSComp.txt:474) + static member tcMemberKindPropertyGetSetNotExpected() = (GetStringFunc("tcMemberKindPropertyGetSetNotExpected",",,,") ) + /// Namespaces cannot contain values. Consider using a module to hold your value declarations. + /// (Originally from ..\FSComp.txt:475) + static member tcNamespaceCannotContainValues() = (201, GetStringFunc("tcNamespaceCannotContainValues",",,,") ) + /// Namespaces cannot contain extension members except in the same file and namespace declaration group where the type is defined. Consider using a module to hold declarations of extension members. + /// (Originally from ..\FSComp.txt:476) + static member tcNamespaceCannotContainExtensionMembers() = (644, GetStringFunc("tcNamespaceCannotContainExtensionMembers",",,,") ) + /// Multiple visibility attributes have been specified for this identifier + /// (Originally from ..\FSComp.txt:477) + static member tcMultipleVisibilityAttributes() = (645, GetStringFunc("tcMultipleVisibilityAttributes",",,,") ) + /// Multiple visibility attributes have been specified for this identifier. 'let' bindings in classes are always private, as are any 'let' bindings inside expressions. + /// (Originally from ..\FSComp.txt:478) + static member tcMultipleVisibilityAttributesWithLet() = (646, GetStringFunc("tcMultipleVisibilityAttributesWithLet",",,,") ) + /// The name '(%s)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name '%s' instead. + /// (Originally from ..\FSComp.txt:479) + static member tcInvalidMethodNameForRelationalOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForRelationalOperator",",,,%s,,,%s,,,") a0 a1) + /// The name '(%s)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name '%s' instead. + /// (Originally from ..\FSComp.txt:480) + static member tcInvalidMethodNameForEquality(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForEquality",",,,%s,,,%s,,,") a0 a1) + /// The name '(%s)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name '%s' instead. + /// (Originally from ..\FSComp.txt:481) + static member tcInvalidMemberName(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMemberName",",,,%s,,,%s,,,") a0 a1) + /// The name '(%s)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + /// (Originally from ..\FSComp.txt:482) + static member tcInvalidMemberNameFixedTypes(a0 : System.String) = (GetStringFunc("tcInvalidMemberNameFixedTypes",",,,%s,,,") a0) + /// The '%s' operator should not normally be redefined. To define overloaded comparison semantics for a particular type, implement the 'System.IComparable' interface in the definition of that type. + /// (Originally from ..\FSComp.txt:483) + static member tcInvalidOperatorDefinitionRelational(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionRelational",",,,%s,,,") a0) + /// The '%s' operator should not normally be redefined. To define equality semantics for a type, override the 'Object.Equals' member in the definition of that type. + /// (Originally from ..\FSComp.txt:484) + static member tcInvalidOperatorDefinitionEquality(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionEquality",",,,%s,,,") a0) + /// The '%s' operator should not normally be redefined. Consider using a different operator name + /// (Originally from ..\FSComp.txt:485) + static member tcInvalidOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinition",",,,%s,,,") a0) + /// The '%s' operator cannot be redefined. Consider using a different operator name + /// (Originally from ..\FSComp.txt:486) + static member tcInvalidIndexOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidIndexOperatorDefinition",",,,%s,,,") a0) + /// Expected module or namespace parent %s + /// (Originally from ..\FSComp.txt:487) + static member tcExpectModuleOrNamespaceParent(a0 : System.String) = (GetStringFunc("tcExpectModuleOrNamespaceParent",",,,%s,,,") a0) + /// The struct, record or union type '%s' implements the interface 'System.IComparable' explicitly. You must apply the 'CustomComparison' attribute to the type. + /// (Originally from ..\FSComp.txt:488) + static member tcImplementsIComparableExplicitly(a0 : System.String) = (647, GetStringFunc("tcImplementsIComparableExplicitly",",,,%s,,,") a0) + /// The struct, record or union type '%s' implements the interface 'System.IComparable<_>' explicitly. You must apply the 'CustomComparison' attribute to the type, and should also provide a consistent implementation of the non-generic interface System.IComparable. + /// (Originally from ..\FSComp.txt:489) + static member tcImplementsGenericIComparableExplicitly(a0 : System.String) = (648, GetStringFunc("tcImplementsGenericIComparableExplicitly",",,,%s,,,") a0) + /// The struct, record or union type '%s' implements the interface 'System.IStructuralComparable' explicitly. Apply the 'CustomComparison' attribute to the type. + /// (Originally from ..\FSComp.txt:490) + static member tcImplementsIStructuralComparableExplicitly(a0 : System.String) = (649, GetStringFunc("tcImplementsIStructuralComparableExplicitly",",,,%s,,,") a0) + /// This record contains fields from inconsistent types + /// (Originally from ..\FSComp.txt:491) + static member tcRecordFieldInconsistentTypes() = (656, GetStringFunc("tcRecordFieldInconsistentTypes",",,,") ) + /// DLLImport stubs cannot be inlined + /// (Originally from ..\FSComp.txt:492) + static member tcDllImportStubsCannotBeInlined() = (657, GetStringFunc("tcDllImportStubsCannotBeInlined",",,,") ) + /// Structs may only bind a 'this' parameter at member declarations + /// (Originally from ..\FSComp.txt:493) + static member tcStructsCanOnlyBindThisAtMemberDeclaration() = (658, GetStringFunc("tcStructsCanOnlyBindThisAtMemberDeclaration",",,,") ) + /// Unexpected expression at recursive inference point + /// (Originally from ..\FSComp.txt:494) + static member tcUnexpectedExprAtRecInfPoint() = (659, GetStringFunc("tcUnexpectedExprAtRecInfPoint",",,,") ) + /// This code is less generic than required by its annotations because the explicit type variable '%s' could not be generalized. It was constrained to be '%s'. + /// (Originally from ..\FSComp.txt:495) + static member tcLessGenericBecauseOfAnnotation(a0 : System.String, a1 : System.String) = (660, GetStringFunc("tcLessGenericBecauseOfAnnotation",",,,%s,,,%s,,,") a0 a1) + /// One or more of the explicit class or function type variables for this binding could not be generalized, because they were constrained to other types + /// (Originally from ..\FSComp.txt:496) + static member tcConstrainedTypeVariableCannotBeGeneralized() = (661, GetStringFunc("tcConstrainedTypeVariableCannotBeGeneralized",",,,") ) + /// A generic type parameter has been used in a way that constrains it to always be '%s' + /// (Originally from ..\FSComp.txt:497) + static member tcGenericParameterHasBeenConstrained(a0 : System.String) = (662, GetStringFunc("tcGenericParameterHasBeenConstrained",",,,%s,,,") a0) + /// This type parameter has been used in a way that constrains it to always be '%s' + /// (Originally from ..\FSComp.txt:498) + static member tcTypeParameterHasBeenConstrained(a0 : System.String) = (663, GetStringFunc("tcTypeParameterHasBeenConstrained",",,,%s,,,") a0) + /// The type parameters inferred for this value are not stable under the erasure of type abbreviations. This is due to the use of type abbreviations which drop or reorder type parameters, e.g. \n\ttype taggedInt<'a> = int or\n\ttype swap<'a,'b> = 'b * 'a.\nConsider declaring the type parameters for this value explicitly, e.g.\n\tlet f<'a,'b> ((x,y) : swap<'b,'a>) : swap<'a,'b> = (y,x). + /// (Originally from ..\FSComp.txt:499) + static member tcTypeParametersInferredAreNotStable() = (664, GetStringFunc("tcTypeParametersInferredAreNotStable",",,,") ) + /// Explicit type parameters may only be used on module or member bindings + /// (Originally from ..\FSComp.txt:500) + static member tcExplicitTypeParameterInvalid() = (665, GetStringFunc("tcExplicitTypeParameterInvalid",",,,") ) + /// You must explicitly declare either all or no type parameters when overriding a generic abstract method + /// (Originally from ..\FSComp.txt:501) + static member tcOverridingMethodRequiresAllOrNoTypeParameters() = (666, GetStringFunc("tcOverridingMethodRequiresAllOrNoTypeParameters",",,,") ) + /// The field labels and expected type of this record expression or pattern do not uniquely determine a corresponding record type + /// (Originally from ..\FSComp.txt:502) + static member tcFieldsDoNotDetermineUniqueRecordType() = (667, GetStringFunc("tcFieldsDoNotDetermineUniqueRecordType",",,,") ) + /// The field '%s' appears twice in this record expression or pattern + /// (Originally from ..\FSComp.txt:503) + static member tcFieldAppearsTwiceInRecord(a0 : System.String) = (668, GetStringFunc("tcFieldAppearsTwiceInRecord",",,,%s,,,") a0) + /// Unknown union case + /// (Originally from ..\FSComp.txt:504) + static member tcUnknownUnion() = (669, GetStringFunc("tcUnknownUnion",",,,") ) + /// This code is not sufficiently generic. The type variable %s could not be generalized because it would escape its scope. + /// (Originally from ..\FSComp.txt:505) + static member tcNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (670, GetStringFunc("tcNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) + /// A property cannot have explicit type parameters. Consider using a method instead. + /// (Originally from ..\FSComp.txt:506) + static member tcPropertyRequiresExplicitTypeParameters() = (671, GetStringFunc("tcPropertyRequiresExplicitTypeParameters",",,,") ) + /// A constructor cannot have explicit type parameters. Consider using a static construction method instead. + /// (Originally from ..\FSComp.txt:507) + static member tcConstructorCannotHaveTypeParameters() = (672, GetStringFunc("tcConstructorCannotHaveTypeParameters",",,,") ) + /// This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args) = ...'. + /// (Originally from ..\FSComp.txt:508) + static member tcInstanceMemberRequiresTarget() = (673, GetStringFunc("tcInstanceMemberRequiresTarget",",,,") ) + /// Unexpected source-level property specification in syntax tree + /// (Originally from ..\FSComp.txt:509) + static member tcUnexpectedPropertyInSyntaxTree() = (674, GetStringFunc("tcUnexpectedPropertyInSyntaxTree",",,,") ) + /// A static initializer requires an argument + /// (Originally from ..\FSComp.txt:510) + static member tcStaticInitializerRequiresArgument() = (675, GetStringFunc("tcStaticInitializerRequiresArgument",",,,") ) + /// An object constructor requires an argument + /// (Originally from ..\FSComp.txt:511) + static member tcObjectConstructorRequiresArgument() = (676, GetStringFunc("tcObjectConstructorRequiresArgument",",,,") ) + /// This static member should not have a 'this' parameter. Consider using the notation 'member Member(args) = ...'. + /// (Originally from ..\FSComp.txt:512) + static member tcStaticMemberShouldNotHaveThis() = (677, GetStringFunc("tcStaticMemberShouldNotHaveThis",",,,") ) + /// An explicit static initializer should use the syntax 'static new(args) = expr' + /// (Originally from ..\FSComp.txt:513) + static member tcExplicitStaticInitializerSyntax() = (678, GetStringFunc("tcExplicitStaticInitializerSyntax",",,,") ) + /// An explicit object constructor should use the syntax 'new(args) = expr' + /// (Originally from ..\FSComp.txt:514) + static member tcExplicitObjectConstructorSyntax() = (679, GetStringFunc("tcExplicitObjectConstructorSyntax",",,,") ) + /// Unexpected source-level property specification + /// (Originally from ..\FSComp.txt:515) + static member tcUnexpectedPropertySpec() = (680, GetStringFunc("tcUnexpectedPropertySpec",",,,") ) + /// This form of object expression is not used in F#. Use 'member this.MemberName ... = ...' to define member implementations in object expressions. + /// (Originally from ..\FSComp.txt:516) + static member tcObjectExpressionFormDeprecated() = (GetStringFunc("tcObjectExpressionFormDeprecated",",,,") ) + /// Invalid declaration + /// (Originally from ..\FSComp.txt:517) + static member tcInvalidDeclaration() = (682, GetStringFunc("tcInvalidDeclaration",",,,") ) + /// Attributes are not allowed within patterns + /// (Originally from ..\FSComp.txt:518) + static member tcAttributesInvalidInPatterns() = (683, GetStringFunc("tcAttributesInvalidInPatterns",",,,") ) + /// The generic function '%s' must be given explicit type argument(s) + /// (Originally from ..\FSComp.txt:519) + static member tcFunctionRequiresExplicitTypeArguments(a0 : System.String) = (685, GetStringFunc("tcFunctionRequiresExplicitTypeArguments",",,,%s,,,") a0) + /// The method or function '%s' should not be given explicit type argument(s) because it does not declare its type parameters explicitly + /// (Originally from ..\FSComp.txt:520) + static member tcDoesNotAllowExplicitTypeArguments(a0 : System.String) = (686, GetStringFunc("tcDoesNotAllowExplicitTypeArguments",",,,%s,,,") a0) + /// This value, type or method expects %d type parameter(s) but was given %d + /// (Originally from ..\FSComp.txt:521) + static member tcTypeParameterArityMismatch(a0 : System.Int32, a1 : System.Int32) = (687, GetStringFunc("tcTypeParameterArityMismatch",",,,%d,,,%d,,,") a0 a1) + /// The default, zero-initializing constructor of a struct type may only be used if all the fields of the struct type admit default initialization + /// (Originally from ..\FSComp.txt:522) + static member tcDefaultStructConstructorCall() = (688, GetStringFunc("tcDefaultStructConstructorCall",",,,") ) + /// Couldn't find Dispose on IDisposable, or it was overloaded + /// (Originally from ..\FSComp.txt:523) + static member tcCouldNotFindIDisposable() = (GetStringFunc("tcCouldNotFindIDisposable",",,,") ) + /// This value is not a literal and cannot be used in a pattern + /// (Originally from ..\FSComp.txt:524) + static member tcNonLiteralCannotBeUsedInPattern() = (689, GetStringFunc("tcNonLiteralCannotBeUsedInPattern",",,,") ) + /// This field is readonly + /// (Originally from ..\FSComp.txt:525) + static member tcFieldIsReadonly() = (690, GetStringFunc("tcFieldIsReadonly",",,,") ) + /// Named arguments must appear after all other arguments + /// (Originally from ..\FSComp.txt:526) + static member tcNameArgumentsMustAppearLast() = (691, GetStringFunc("tcNameArgumentsMustAppearLast",",,,") ) + /// This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking %d arguments. + /// (Originally from ..\FSComp.txt:527) + static member tcFunctionRequiresExplicitLambda(a0 : System.Int32) = (692, GetStringFunc("tcFunctionRequiresExplicitLambda",",,,%d,,,") a0) + /// The type '%s' is not a type whose values can be enumerated with this syntax, i.e. is not compatible with either seq<_>, IEnumerable<_> or IEnumerable and does not have a GetEnumerator method + /// (Originally from ..\FSComp.txt:528) + static member tcTypeCannotBeEnumerated(a0 : System.String) = (693, GetStringFunc("tcTypeCannotBeEnumerated",",,,%s,,,") a0) + /// This recursive binding uses an invalid mixture of recursive forms + /// (Originally from ..\FSComp.txt:529) + static member tcInvalidMixtureOfRecursiveForms() = (695, GetStringFunc("tcInvalidMixtureOfRecursiveForms",",,,") ) + /// This is not a valid object construction expression. Explicit object constructors must either call an alternate constructor or initialize all fields of the object and specify a call to a super class constructor. + /// (Originally from ..\FSComp.txt:530) + static member tcInvalidObjectConstructionExpression() = (696, GetStringFunc("tcInvalidObjectConstructionExpression",",,,") ) + /// Invalid constraint + /// (Originally from ..\FSComp.txt:531) + static member tcInvalidConstraint() = (697, GetStringFunc("tcInvalidConstraint",",,,") ) + /// Invalid constraint: the type used for the constraint is sealed, which means the constraint could only be satisfied by at most one solution + /// (Originally from ..\FSComp.txt:532) + static member tcInvalidConstraintTypeSealed() = (698, GetStringFunc("tcInvalidConstraintTypeSealed",",,,") ) + /// An 'enum' constraint must be of the form 'enum' + /// (Originally from ..\FSComp.txt:533) + static member tcInvalidEnumConstraint() = (699, GetStringFunc("tcInvalidEnumConstraint",",,,") ) + /// 'new' constraints must take one argument of type 'unit' and return the constructed type + /// (Originally from ..\FSComp.txt:534) + static member tcInvalidNewConstraint() = (700, GetStringFunc("tcInvalidNewConstraint",",,,") ) + /// This property has an invalid type. Properties taking multiple indexer arguments should have types of the form 'ty1 * ty2 -> ty3'. Properties returning functions should have types of the form '(ty1 -> ty2)'. + /// (Originally from ..\FSComp.txt:535) + static member tcInvalidPropertyType() = (701, GetStringFunc("tcInvalidPropertyType",",,,") ) + /// Expected unit-of-measure parameter, not type parameter. Explicit unit-of-measure parameters must be marked with the [] attribute. + /// (Originally from ..\FSComp.txt:536) + static member tcExpectedUnitOfMeasureMarkWithAttribute() = (702, GetStringFunc("tcExpectedUnitOfMeasureMarkWithAttribute",",,,") ) + /// Expected type parameter, not unit-of-measure parameter + /// (Originally from ..\FSComp.txt:537) + static member tcExpectedTypeParameter() = (703, GetStringFunc("tcExpectedTypeParameter",",,,") ) + /// Expected type, not unit-of-measure + /// (Originally from ..\FSComp.txt:538) + static member tcExpectedTypeNotUnitOfMeasure() = (704, GetStringFunc("tcExpectedTypeNotUnitOfMeasure",",,,") ) + /// Expected unit-of-measure, not type + /// (Originally from ..\FSComp.txt:539) + static member tcExpectedUnitOfMeasureNotType() = (705, GetStringFunc("tcExpectedUnitOfMeasureNotType",",,,") ) + /// Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets. + /// (Originally from ..\FSComp.txt:540) + static member tcInvalidUnitsOfMeasurePrefix() = (706, GetStringFunc("tcInvalidUnitsOfMeasurePrefix",",,,") ) + /// Unit-of-measure cannot be used in type constructor application + /// (Originally from ..\FSComp.txt:541) + static member tcUnitsOfMeasureInvalidInTypeConstructor() = (707, GetStringFunc("tcUnitsOfMeasureInvalidInTypeConstructor",",,,") ) + /// This control construct may only be used if the computation expression builder defines a '%s' method + /// (Originally from ..\FSComp.txt:542) + static member tcRequireBuilderMethod(a0 : System.String) = (708, GetStringFunc("tcRequireBuilderMethod",",,,%s,,,") a0) + /// This type has no nested types + /// (Originally from ..\FSComp.txt:543) + static member tcTypeHasNoNestedTypes() = (709, GetStringFunc("tcTypeHasNoNestedTypes",",,,") ) + /// Unexpected %s in type expression + /// (Originally from ..\FSComp.txt:544) + static member tcUnexpectedSymbolInTypeExpression(a0 : System.String) = (711, GetStringFunc("tcUnexpectedSymbolInTypeExpression",",,,%s,,,") a0) + /// Type parameter cannot be used as type constructor + /// (Originally from ..\FSComp.txt:545) + static member tcTypeParameterInvalidAsTypeConstructor() = (712, GetStringFunc("tcTypeParameterInvalidAsTypeConstructor",",,,") ) + /// Illegal syntax in type expression + /// (Originally from ..\FSComp.txt:546) + static member tcIllegalSyntaxInTypeExpression() = (713, GetStringFunc("tcIllegalSyntaxInTypeExpression",",,,") ) + /// Anonymous unit-of-measure cannot be nested inside another unit-of-measure expression + /// (Originally from ..\FSComp.txt:547) + static member tcAnonymousUnitsOfMeasureCannotBeNested() = (714, GetStringFunc("tcAnonymousUnitsOfMeasureCannotBeNested",",,,") ) + /// Anonymous type variables are not permitted in this declaration + /// (Originally from ..\FSComp.txt:548) + static member tcAnonymousTypeInvalidInDeclaration() = (715, GetStringFunc("tcAnonymousTypeInvalidInDeclaration",",,,") ) + /// Unexpected / in type + /// (Originally from ..\FSComp.txt:549) + static member tcUnexpectedSlashInType() = (716, GetStringFunc("tcUnexpectedSlashInType",",,,") ) + /// Unexpected type arguments + /// (Originally from ..\FSComp.txt:550) + static member tcUnexpectedTypeArguments() = (717, GetStringFunc("tcUnexpectedTypeArguments",",,,") ) + /// Optional arguments are only permitted on type members + /// (Originally from ..\FSComp.txt:551) + static member tcOptionalArgsOnlyOnMembers() = (718, GetStringFunc("tcOptionalArgsOnlyOnMembers",",,,") ) + /// Name '%s' not bound in pattern context + /// (Originally from ..\FSComp.txt:552) + static member tcNameNotBoundInPattern(a0 : System.String) = (719, GetStringFunc("tcNameNotBoundInPattern",",,,%s,,,") a0) + /// Non-primitive numeric literal constants cannot be used in pattern matches because they can be mapped to multiple different types through the use of a NumericLiteral module. Consider using replacing with a variable, and use 'when = ' at the end of the match clause. + /// (Originally from ..\FSComp.txt:553) + static member tcInvalidNonPrimitiveLiteralInPatternMatch() = (720, GetStringFunc("tcInvalidNonPrimitiveLiteralInPatternMatch",",,,") ) + /// Type arguments cannot be specified here + /// (Originally from ..\FSComp.txt:554) + static member tcInvalidTypeArgumentUsage() = (721, GetStringFunc("tcInvalidTypeArgumentUsage",",,,") ) + /// Only active patterns returning exactly one result may accept arguments + /// (Originally from ..\FSComp.txt:555) + static member tcRequireActivePatternWithOneResult() = (722, GetStringFunc("tcRequireActivePatternWithOneResult",",,,") ) + /// Invalid argument to parameterized pattern label + /// (Originally from ..\FSComp.txt:556) + static member tcInvalidArgForParameterizedPattern() = (723, GetStringFunc("tcInvalidArgForParameterizedPattern",",,,") ) + /// Internal error. Invalid index into active pattern array + /// (Originally from ..\FSComp.txt:557) + static member tcInvalidIndexIntoActivePatternArray() = (724, GetStringFunc("tcInvalidIndexIntoActivePatternArray",",,,") ) + /// This union case does not take arguments + /// (Originally from ..\FSComp.txt:558) + static member tcUnionCaseDoesNotTakeArguments() = (725, GetStringFunc("tcUnionCaseDoesNotTakeArguments",",,,") ) + /// This union case takes one argument + /// (Originally from ..\FSComp.txt:559) + static member tcUnionCaseRequiresOneArgument() = (726, GetStringFunc("tcUnionCaseRequiresOneArgument",",,,") ) + /// This union case expects %d arguments in tupled form + /// (Originally from ..\FSComp.txt:560) + static member tcUnionCaseExpectsTupledArguments(a0 : System.Int32) = (727, GetStringFunc("tcUnionCaseExpectsTupledArguments",",,,%d,,,") a0) + /// Field '%s' is not static + /// (Originally from ..\FSComp.txt:561) + static member tcFieldIsNotStatic(a0 : System.String) = (728, GetStringFunc("tcFieldIsNotStatic",",,,%s,,,") a0) + /// This field is not a literal and cannot be used in a pattern + /// (Originally from ..\FSComp.txt:562) + static member tcFieldNotLiteralCannotBeUsedInPattern() = (729, GetStringFunc("tcFieldNotLiteralCannotBeUsedInPattern",",,,") ) + /// This is not a variable, constant, active recognizer or literal + /// (Originally from ..\FSComp.txt:563) + static member tcRequireVarConstRecogOrLiteral() = (730, GetStringFunc("tcRequireVarConstRecogOrLiteral",",,,") ) + /// This is not a valid pattern + /// (Originally from ..\FSComp.txt:564) + static member tcInvalidPattern() = (731, GetStringFunc("tcInvalidPattern",",,,") ) + /// Character range matches have been removed in F#. Consider using a 'when' pattern guard instead. + /// (Originally from ..\FSComp.txt:565) + static member tcUseWhenPatternGuard() = (GetStringFunc("tcUseWhenPatternGuard",",,,") ) + /// Illegal pattern + /// (Originally from ..\FSComp.txt:566) + static member tcIllegalPattern() = (733, GetStringFunc("tcIllegalPattern",",,,") ) + /// Syntax error - unexpected '?' symbol + /// (Originally from ..\FSComp.txt:567) + static member tcSyntaxErrorUnexpectedQMark() = (734, GetStringFunc("tcSyntaxErrorUnexpectedQMark",",,,") ) + /// Expected %d expressions, got %d + /// (Originally from ..\FSComp.txt:568) + static member tcExpressionCountMisMatch(a0 : System.Int32, a1 : System.Int32) = (735, GetStringFunc("tcExpressionCountMisMatch",",,,%d,,,%d,,,") a0 a1) + /// TcExprUndelayed: delayed + /// (Originally from ..\FSComp.txt:569) + static member tcExprUndelayed() = (736, GetStringFunc("tcExprUndelayed",",,,") ) + /// This expression form may only be used in sequence and computation expressions + /// (Originally from ..\FSComp.txt:570) + static member tcExpressionRequiresSequence() = (737, GetStringFunc("tcExpressionRequiresSequence",",,,") ) + /// Invalid object expression. Objects without overrides or interfaces should use the expression form 'new Type(args)' without braces. + /// (Originally from ..\FSComp.txt:571) + static member tcInvalidObjectExpressionSyntaxForm() = (738, GetStringFunc("tcInvalidObjectExpressionSyntaxForm",",,,") ) + /// Invalid object, sequence or record expression + /// (Originally from ..\FSComp.txt:572) + static member tcInvalidObjectSequenceOrRecordExpression() = (739, GetStringFunc("tcInvalidObjectSequenceOrRecordExpression",",,,") ) + /// Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq { ... }' + /// (Originally from ..\FSComp.txt:573) + static member tcInvalidSequenceExpressionSyntaxForm() = (740, GetStringFunc("tcInvalidSequenceExpressionSyntaxForm",",,,") ) + /// This list or array expression includes an element of the form 'if ... then ... else'. Parenthesize this expression to indicate it is an individual element of the list or array, to disambiguate this from a list generated using a sequence expression + /// (Originally from ..\FSComp.txt:574) + static member tcExpressionWithIfRequiresParenthesis() = (GetStringFunc("tcExpressionWithIfRequiresParenthesis",",,,") ) + /// Unable to parse format string '%s' + /// (Originally from ..\FSComp.txt:575) + static member tcUnableToParseFormatString(a0 : System.String) = (741, GetStringFunc("tcUnableToParseFormatString",",,,%s,,,") a0) + /// This list expression exceeds the maximum size for list literals. Use an array for larger literals and call Array.ToList. + /// (Originally from ..\FSComp.txt:576) + static member tcListLiteralMaxSize() = (742, GetStringFunc("tcListLiteralMaxSize",",,,") ) + /// The expression form 'expr then expr' may only be used as part of an explicit object constructor + /// (Originally from ..\FSComp.txt:577) + static member tcExpressionFormRequiresObjectConstructor() = (743, GetStringFunc("tcExpressionFormRequiresObjectConstructor",",,,") ) + /// Named arguments cannot be given to member trait calls + /// (Originally from ..\FSComp.txt:578) + static member tcNamedArgumentsCannotBeUsedInMemberTraits() = (744, GetStringFunc("tcNamedArgumentsCannotBeUsedInMemberTraits",",,,") ) + /// This is not a valid name for an enumeration case + /// (Originally from ..\FSComp.txt:579) + static member tcNotValidEnumCaseName() = (745, GetStringFunc("tcNotValidEnumCaseName",",,,") ) + /// This field is not mutable + /// (Originally from ..\FSComp.txt:580) + static member tcFieldIsNotMutable() = (746, GetStringFunc("tcFieldIsNotMutable",",,,") ) + /// This construct may only be used within list, array and sequence expressions, e.g. expressions of the form 'seq { ... }', '[ ... ]' or '[| ... |]'. These use the syntax 'for ... in ... do ... yield...' to generate elements + /// (Originally from ..\FSComp.txt:581) + static member tcConstructRequiresListArrayOrSequence() = (747, GetStringFunc("tcConstructRequiresListArrayOrSequence",",,,") ) + /// This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. + /// (Originally from ..\FSComp.txt:582) + static member tcConstructRequiresComputationExpressions() = (748, GetStringFunc("tcConstructRequiresComputationExpressions",",,,") ) + /// This construct may only be used within sequence or computation expressions + /// (Originally from ..\FSComp.txt:583) + static member tcConstructRequiresSequenceOrComputations() = (749, GetStringFunc("tcConstructRequiresSequenceOrComputations",",,,") ) + /// This construct may only be used within computation expressions + /// (Originally from ..\FSComp.txt:584) + static member tcConstructRequiresComputationExpression() = (750, GetStringFunc("tcConstructRequiresComputationExpression",",,,") ) + /// Invalid indexer expression + /// (Originally from ..\FSComp.txt:585) + static member tcInvalidIndexerExpression() = (751, GetStringFunc("tcInvalidIndexerExpression",",,,") ) + /// The operator 'expr.[idx]' has been used on an object of indeterminate type based on information prior to this program point. Consider adding further type constraints + /// (Originally from ..\FSComp.txt:586) + static member tcObjectOfIndeterminateTypeUsedRequireTypeConstraint() = (752, GetStringFunc("tcObjectOfIndeterminateTypeUsedRequireTypeConstraint",",,,") ) + /// Cannot inherit from a variable type + /// (Originally from ..\FSComp.txt:587) + static member tcCannotInheritFromVariableType() = (753, GetStringFunc("tcCannotInheritFromVariableType",",,,") ) + /// Calls to object constructors on type parameters cannot be given arguments + /// (Originally from ..\FSComp.txt:588) + static member tcObjectConstructorsOnTypeParametersCannotTakeArguments() = (754, GetStringFunc("tcObjectConstructorsOnTypeParametersCannotTakeArguments",",,,") ) + /// The 'CompiledName' attribute cannot be used with this language element + /// (Originally from ..\FSComp.txt:589) + static member tcCompiledNameAttributeMisused() = (755, GetStringFunc("tcCompiledNameAttributeMisused",",,,") ) + /// '%s' may only be used with named types + /// (Originally from ..\FSComp.txt:590) + static member tcNamedTypeRequired(a0 : System.String) = (756, GetStringFunc("tcNamedTypeRequired",",,,%s,,,") a0) + /// 'inherit' cannot be used on interface types. Consider implementing the interface by using 'interface ... with ... end' instead. + /// (Originally from ..\FSComp.txt:591) + static member tcInheritCannotBeUsedOnInterfaceType() = (757, GetStringFunc("tcInheritCannotBeUsedOnInterfaceType",",,,") ) + /// 'new' cannot be used on interface types. Consider using an object expression '{ new ... with ... }' instead. + /// (Originally from ..\FSComp.txt:592) + static member tcNewCannotBeUsedOnInterfaceType() = (758, GetStringFunc("tcNewCannotBeUsedOnInterfaceType",",,,") ) + /// Instances of this type cannot be created since it has been marked abstract or not all methods have been given implementations. Consider using an object expression '{ new ... with ... }' instead. + /// (Originally from ..\FSComp.txt:593) + static member tcAbstractTypeCannotBeInstantiated() = (759, GetStringFunc("tcAbstractTypeCannotBeInstantiated",",,,") ) + /// It is recommended that objects supporting the IDisposable interface are created using the syntax 'new Type(args)', rather than 'Type(args)' or 'Type' as a function value representing the constructor, to indicate that resources may be owned by the generated value + /// (Originally from ..\FSComp.txt:594) + static member tcIDisposableTypeShouldUseNew() = (760, GetStringFunc("tcIDisposableTypeShouldUseNew",",,,") ) + /// '%s' may only be used to construct object types + /// (Originally from ..\FSComp.txt:595) + static member tcSyntaxCanOnlyBeUsedToCreateObjectTypes(a0 : System.String) = (761, GetStringFunc("tcSyntaxCanOnlyBeUsedToCreateObjectTypes",",,,%s,,,") a0) + /// Constructors for the type '%s' must directly or indirectly call its implicit object constructor. Use a call to the implicit object constructor instead of a record expression. + /// (Originally from ..\FSComp.txt:596) + static member tcConstructorRequiresCall(a0 : System.String) = (762, GetStringFunc("tcConstructorRequiresCall",",,,%s,,,") a0) + /// The field '%s' has been given a value, but is not present in the type '%s' + /// (Originally from ..\FSComp.txt:597) + static member tcUndefinedField(a0 : System.String, a1 : System.String) = (763, GetStringFunc("tcUndefinedField",",,,%s,,,%s,,,") a0 a1) + /// No assignment given for field '%s' of type '%s' + /// (Originally from ..\FSComp.txt:598) + static member tcFieldRequiresAssignment(a0 : System.String, a1 : System.String) = (764, GetStringFunc("tcFieldRequiresAssignment",",,,%s,,,%s,,,") a0 a1) + /// Extraneous fields have been given values + /// (Originally from ..\FSComp.txt:599) + static member tcExtraneousFieldsGivenValues() = (765, GetStringFunc("tcExtraneousFieldsGivenValues",",,,") ) + /// Only overrides of abstract and virtual members may be specified in object expressions + /// (Originally from ..\FSComp.txt:600) + static member tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual() = (766, GetStringFunc("tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual",",,,") ) + /// The member '%s' does not correspond to any abstract or virtual method available to override or implement. + /// (Originally from ..\FSComp.txt:601) + static member tcNoAbstractOrVirtualMemberFound(a0 : System.String) = (767, GetStringFunc("tcNoAbstractOrVirtualMemberFound",",,,%s,,,") a0) + /// The type %s contains the member '%s' but it is not a virtual or abstract method that is available to override or implement. + /// (Originally from ..\FSComp.txt:602) + static member tcMemberFoundIsNotAbstractOrVirtual(a0 : System.String, a1 : System.String) = (767, GetStringFunc("tcMemberFoundIsNotAbstractOrVirtual",",,,%s,,,%s,,,") a0 a1) + /// The member '%s' does not accept the correct number of arguments. %d argument(s) are expected, but %d were given. The required signature is '%s'.%s + /// (Originally from ..\FSComp.txt:603) + static member tcArgumentArityMismatch(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (768, GetStringFunc("tcArgumentArityMismatch",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) + /// The member '%s' does not accept the correct number of arguments. One overload accepts %d arguments, but %d were given. The required signature is '%s'.%s + /// (Originally from ..\FSComp.txt:604) + static member tcArgumentArityMismatchOneOverload(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (769, GetStringFunc("tcArgumentArityMismatchOneOverload",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) + /// A simple method name is required here + /// (Originally from ..\FSComp.txt:605) + static member tcSimpleMethodNameRequired() = (770, GetStringFunc("tcSimpleMethodNameRequired",",,,") ) + /// The types System.ValueType, System.Enum, System.Delegate, System.MulticastDelegate and System.Array cannot be used as super types in an object expression or class + /// (Originally from ..\FSComp.txt:606) + static member tcPredefinedTypeCannotBeUsedAsSuperType() = (771, GetStringFunc("tcPredefinedTypeCannotBeUsedAsSuperType",",,,") ) + /// 'new' must be used with a named type + /// (Originally from ..\FSComp.txt:607) + static member tcNewMustBeUsedWithNamedType() = (772, GetStringFunc("tcNewMustBeUsedWithNamedType",",,,") ) + /// Cannot create an extension of a sealed type + /// (Originally from ..\FSComp.txt:608) + static member tcCannotCreateExtensionOfSealedType() = (773, GetStringFunc("tcCannotCreateExtensionOfSealedType",",,,") ) + /// No arguments may be given when constructing a record value + /// (Originally from ..\FSComp.txt:609) + static member tcNoArgumentsForRecordValue() = (774, GetStringFunc("tcNoArgumentsForRecordValue",",,,") ) + /// Interface implementations cannot be given on construction expressions + /// (Originally from ..\FSComp.txt:610) + static member tcNoInterfaceImplementationForConstructionExpression() = (775, GetStringFunc("tcNoInterfaceImplementationForConstructionExpression",",,,") ) + /// Object construction expressions may only be used to implement constructors in class types + /// (Originally from ..\FSComp.txt:611) + static member tcObjectConstructionCanOnlyBeUsedInClassTypes() = (776, GetStringFunc("tcObjectConstructionCanOnlyBeUsedInClassTypes",",,,") ) + /// Only simple bindings of the form 'id = expr' can be used in construction expressions + /// (Originally from ..\FSComp.txt:612) + static member tcOnlySimpleBindingsCanBeUsedInConstructionExpressions() = (777, GetStringFunc("tcOnlySimpleBindingsCanBeUsedInConstructionExpressions",",,,") ) + /// Objects must be initialized by an object construction expression that calls an inherited object constructor and assigns a value to each field + /// (Originally from ..\FSComp.txt:613) + static member tcObjectsMustBeInitializedWithObjectExpression() = (778, GetStringFunc("tcObjectsMustBeInitializedWithObjectExpression",",,,") ) + /// Expected an interface type + /// (Originally from ..\FSComp.txt:614) + static member tcExpectedInterfaceType() = (779, GetStringFunc("tcExpectedInterfaceType",",,,") ) + /// Constructor expressions for interfaces do not take arguments + /// (Originally from ..\FSComp.txt:615) + static member tcConstructorForInterfacesDoNotTakeArguments() = (780, GetStringFunc("tcConstructorForInterfacesDoNotTakeArguments",",,,") ) + /// This object constructor requires arguments + /// (Originally from ..\FSComp.txt:616) + static member tcConstructorRequiresArguments() = (781, GetStringFunc("tcConstructorRequiresArguments",",,,") ) + /// 'new' may only be used with object constructors + /// (Originally from ..\FSComp.txt:617) + static member tcNewRequiresObjectConstructor() = (782, GetStringFunc("tcNewRequiresObjectConstructor",",,,") ) + /// At least one override did not correctly implement its corresponding abstract member + /// (Originally from ..\FSComp.txt:618) + static member tcAtLeastOneOverrideIsInvalid() = (783, GetStringFunc("tcAtLeastOneOverrideIsInvalid",",,,") ) + /// This numeric literal requires that a module '%s' defining functions FromZero, FromOne, FromInt32, FromInt64 and FromString be in scope + /// (Originally from ..\FSComp.txt:619) + static member tcNumericLiteralRequiresModule(a0 : System.String) = (784, GetStringFunc("tcNumericLiteralRequiresModule",",,,%s,,,") a0) + /// Invalid record construction + /// (Originally from ..\FSComp.txt:620) + static member tcInvalidRecordConstruction() = (785, GetStringFunc("tcInvalidRecordConstruction",",,,") ) + /// The expression form { expr with ... } may only be used with record types. To build object types use { new Type(...) with ... } + /// (Originally from ..\FSComp.txt:621) + static member tcExpressionFormRequiresRecordTypes() = (786, GetStringFunc("tcExpressionFormRequiresRecordTypes",",,,") ) + /// The inherited type is not an object model type + /// (Originally from ..\FSComp.txt:622) + static member tcInheritedTypeIsNotObjectModelType() = (787, GetStringFunc("tcInheritedTypeIsNotObjectModelType",",,,") ) + /// Object construction expressions (i.e. record expressions with inheritance specifications) may only be used to implement constructors in object model types. Use 'new ObjectType(args)' to construct instances of object model types outside of constructors + /// (Originally from ..\FSComp.txt:623) + static member tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes() = (788, GetStringFunc("tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes",",,,") ) + /// '{ }' is not a valid expression. Records must include at least one field. Empty sequences are specified by using Seq.empty or an empty list '[]'. + /// (Originally from ..\FSComp.txt:624) + static member tcEmptyRecordInvalid() = (789, GetStringFunc("tcEmptyRecordInvalid",",,,") ) + /// This type is not a record type. Values of class and struct types must be created using calls to object constructors. + /// (Originally from ..\FSComp.txt:625) + static member tcTypeIsNotARecordTypeNeedConstructor() = (790, GetStringFunc("tcTypeIsNotARecordTypeNeedConstructor",",,,") ) + /// This type is not a record type + /// (Originally from ..\FSComp.txt:626) + static member tcTypeIsNotARecordType() = (791, GetStringFunc("tcTypeIsNotARecordType",",,,") ) + /// This construct is ambiguous as part of a computation expression. Nested expressions may be written using 'let _ = (...)' and nested computations using 'let! res = builder { ... }'. + /// (Originally from ..\FSComp.txt:627) + static member tcConstructIsAmbiguousInComputationExpression() = (792, GetStringFunc("tcConstructIsAmbiguousInComputationExpression",",,,") ) + /// This construct is ambiguous as part of a sequence expression. Nested expressions may be written using 'let _ = (...)' and nested sequences using 'yield! seq {... }'. + /// (Originally from ..\FSComp.txt:628) + static member tcConstructIsAmbiguousInSequenceExpression() = (793, GetStringFunc("tcConstructIsAmbiguousInSequenceExpression",",,,") ) + /// 'do!' cannot be used within sequence expressions + /// (Originally from ..\FSComp.txt:629) + static member tcDoBangIllegalInSequenceExpression() = (794, GetStringFunc("tcDoBangIllegalInSequenceExpression",",,,") ) + /// The use of 'let! x = coll' in sequence expressions is not permitted. Use 'for x in coll' instead. + /// (Originally from ..\FSComp.txt:630) + static member tcUseForInSequenceExpression() = (795, GetStringFunc("tcUseForInSequenceExpression",",,,") ) + /// 'try'/'with' cannot be used within sequence expressions + /// (Originally from ..\FSComp.txt:631) + static member tcTryIllegalInSequenceExpression() = (796, GetStringFunc("tcTryIllegalInSequenceExpression",",,,") ) + /// In sequence expressions, multiple results are generated using 'yield!' + /// (Originally from ..\FSComp.txt:632) + static member tcUseYieldBangForMultipleResults() = (797, GetStringFunc("tcUseYieldBangForMultipleResults",",,,") ) + /// Invalid assignment + /// (Originally from ..\FSComp.txt:633) + static member tcInvalidAssignment() = (799, GetStringFunc("tcInvalidAssignment",",,,") ) + /// Invalid use of a type name + /// (Originally from ..\FSComp.txt:634) + static member tcInvalidUseOfTypeName() = (800, GetStringFunc("tcInvalidUseOfTypeName",",,,") ) + /// This type has no accessible object constructors + /// (Originally from ..\FSComp.txt:635) + static member tcTypeHasNoAccessibleConstructor() = (801, GetStringFunc("tcTypeHasNoAccessibleConstructor",",,,") ) + /// Invalid use of an interface type + /// (Originally from ..\FSComp.txt:638) + static member tcInvalidUseOfInterfaceType() = (804, GetStringFunc("tcInvalidUseOfInterfaceType",",,,") ) + /// Invalid use of a delegate constructor. Use the syntax 'new Type(args)' or just 'Type(args)'. + /// (Originally from ..\FSComp.txt:639) + static member tcInvalidUseOfDelegate() = (805, GetStringFunc("tcInvalidUseOfDelegate",",,,") ) + /// Property '%s' is not static + /// (Originally from ..\FSComp.txt:640) + static member tcPropertyIsNotStatic(a0 : System.String) = (806, GetStringFunc("tcPropertyIsNotStatic",",,,%s,,,") a0) + /// Property '%s' is not readable + /// (Originally from ..\FSComp.txt:641) + static member tcPropertyIsNotReadable(a0 : System.String) = (807, GetStringFunc("tcPropertyIsNotReadable",",,,%s,,,") a0) + /// This lookup cannot be used here + /// (Originally from ..\FSComp.txt:642) + static member tcLookupMayNotBeUsedHere() = (808, GetStringFunc("tcLookupMayNotBeUsedHere",",,,") ) + /// Property '%s' is static + /// (Originally from ..\FSComp.txt:643) + static member tcPropertyIsStatic(a0 : System.String) = (809, GetStringFunc("tcPropertyIsStatic",",,,%s,,,") a0) + /// Property '%s' cannot be set + /// (Originally from ..\FSComp.txt:644) + static member tcPropertyCannotBeSet1(a0 : System.String) = (810, GetStringFunc("tcPropertyCannotBeSet1",",,,%s,,,") a0) + /// Constructors must be applied to arguments and cannot be used as first-class values. If necessary use an anonymous function '(fun arg1 ... argN -> new Type(arg1,...,argN))'. + /// (Originally from ..\FSComp.txt:645) + static member tcConstructorsCannotBeFirstClassValues() = (811, GetStringFunc("tcConstructorsCannotBeFirstClassValues",",,,") ) + /// The syntax 'expr.id' may only be used with record labels, properties and fields + /// (Originally from ..\FSComp.txt:646) + static member tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields() = (812, GetStringFunc("tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields",",,,") ) + /// Event '%s' is static + /// (Originally from ..\FSComp.txt:647) + static member tcEventIsStatic(a0 : System.String) = (813, GetStringFunc("tcEventIsStatic",",,,%s,,,") a0) + /// Event '%s' is not static + /// (Originally from ..\FSComp.txt:648) + static member tcEventIsNotStatic(a0 : System.String) = (814, GetStringFunc("tcEventIsNotStatic",",,,%s,,,") a0) + /// The named argument '%s' did not match any argument or mutable property + /// (Originally from ..\FSComp.txt:649) + static member tcNamedArgumentDidNotMatch(a0 : System.String) = (815, GetStringFunc("tcNamedArgumentDidNotMatch",",,,%s,,,") a0) + /// One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form. + /// (Originally from ..\FSComp.txt:650) + static member tcOverloadsCannotHaveCurriedArguments() = (816, GetStringFunc("tcOverloadsCannotHaveCurriedArguments",",,,") ) + /// The unnamed arguments do not form a prefix of the arguments of the method called + /// (Originally from ..\FSComp.txt:651) + static member tcUnnamedArgumentsDoNotFormPrefix() = (GetStringFunc("tcUnnamedArgumentsDoNotFormPrefix",",,,") ) + /// Static optimization conditionals are only for use within the F# library + /// (Originally from ..\FSComp.txt:652) + static member tcStaticOptimizationConditionalsOnlyForFSharpLibrary() = (817, GetStringFunc("tcStaticOptimizationConditionalsOnlyForFSharpLibrary",",,,") ) + /// The corresponding formal argument is not optional + /// (Originally from ..\FSComp.txt:653) + static member tcFormalArgumentIsNotOptional() = (818, GetStringFunc("tcFormalArgumentIsNotOptional",",,,") ) + /// Invalid optional assignment to a property or field + /// (Originally from ..\FSComp.txt:654) + static member tcInvalidOptionalAssignmentToPropertyOrField() = (819, GetStringFunc("tcInvalidOptionalAssignmentToPropertyOrField",",,,") ) + /// A delegate constructor must be passed a single function value + /// (Originally from ..\FSComp.txt:655) + static member tcDelegateConstructorMustBePassed() = (820, GetStringFunc("tcDelegateConstructorMustBePassed",",,,") ) + /// A binding cannot be marked both 'use' and 'rec' + /// (Originally from ..\FSComp.txt:656) + static member tcBindingCannotBeUseAndRec() = (821, GetStringFunc("tcBindingCannotBeUseAndRec",",,,") ) + /// The 'VolatileField' attribute may only be used on 'let' bindings in classes + /// (Originally from ..\FSComp.txt:657) + static member tcVolatileOnlyOnClassLetBindings() = (823, GetStringFunc("tcVolatileOnlyOnClassLetBindings",",,,") ) + /// Attributes are not permitted on 'let' bindings in expressions + /// (Originally from ..\FSComp.txt:658) + static member tcAttributesAreNotPermittedOnLetBindings() = (824, GetStringFunc("tcAttributesAreNotPermittedOnLetBindings",",,,") ) + /// The 'DefaultValue' attribute may only be used on 'val' declarations + /// (Originally from ..\FSComp.txt:659) + static member tcDefaultValueAttributeRequiresVal() = (825, GetStringFunc("tcDefaultValueAttributeRequiresVal",",,,") ) + /// The 'ConditionalAttribute' attribute may only be used on members + /// (Originally from ..\FSComp.txt:660) + static member tcConditionalAttributeRequiresMembers() = (826, GetStringFunc("tcConditionalAttributeRequiresMembers",",,,") ) + /// This is not a valid name for an active pattern + /// (Originally from ..\FSComp.txt:661) + static member tcInvalidActivePatternName() = (827, GetStringFunc("tcInvalidActivePatternName",",,,") ) + /// The 'EntryPointAttribute' attribute may only be used on function definitions in modules + /// (Originally from ..\FSComp.txt:662) + static member tcEntryPointAttributeRequiresFunctionInModule() = (828, GetStringFunc("tcEntryPointAttributeRequiresFunctionInModule",",,,") ) + /// Mutable values cannot be marked 'inline' + /// (Originally from ..\FSComp.txt:663) + static member tcMutableValuesCannotBeInline() = (829, GetStringFunc("tcMutableValuesCannotBeInline",",,,") ) + /// Mutable values cannot have generic parameters + /// (Originally from ..\FSComp.txt:664) + static member tcMutableValuesMayNotHaveGenericParameters() = (830, GetStringFunc("tcMutableValuesMayNotHaveGenericParameters",",,,") ) + /// Mutable function values should be written 'let mutable f = (fun args -> ...)' + /// (Originally from ..\FSComp.txt:665) + static member tcMutableValuesSyntax() = (831, GetStringFunc("tcMutableValuesSyntax",",,,") ) + /// Only functions may be marked 'inline' + /// (Originally from ..\FSComp.txt:666) + static member tcOnlyFunctionsCanBeInline() = (832, GetStringFunc("tcOnlyFunctionsCanBeInline",",,,") ) + /// A literal value cannot be given the [] or [] attributes + /// (Originally from ..\FSComp.txt:667) + static member tcIllegalAttributesForLiteral() = (833, GetStringFunc("tcIllegalAttributesForLiteral",",,,") ) + /// A literal value cannot be marked 'mutable' + /// (Originally from ..\FSComp.txt:668) + static member tcLiteralCannotBeMutable() = (834, GetStringFunc("tcLiteralCannotBeMutable",",,,") ) + /// A literal value cannot be marked 'inline' + /// (Originally from ..\FSComp.txt:669) + static member tcLiteralCannotBeInline() = (835, GetStringFunc("tcLiteralCannotBeInline",",,,") ) + /// Literal values cannot have generic parameters + /// (Originally from ..\FSComp.txt:670) + static member tcLiteralCannotHaveGenericParameters() = (836, GetStringFunc("tcLiteralCannotHaveGenericParameters",",,,") ) + /// This is not a valid constant expression + /// (Originally from ..\FSComp.txt:671) + static member tcInvalidConstantExpression() = (837, GetStringFunc("tcInvalidConstantExpression",",,,") ) + /// This type is not accessible from this code location + /// (Originally from ..\FSComp.txt:672) + static member tcTypeIsInaccessible() = (838, GetStringFunc("tcTypeIsInaccessible",",,,") ) + /// Unexpected condition in imported assembly: failed to decode AttributeUsage attribute + /// (Originally from ..\FSComp.txt:673) + static member tcUnexpectedConditionInImportedAssembly() = (839, GetStringFunc("tcUnexpectedConditionInImportedAssembly",",,,") ) + /// Unrecognized attribute target. Valid attribute targets are 'assembly', 'module', 'type', 'method', 'property', 'return', 'param', 'field', 'event', 'constructor'. + /// (Originally from ..\FSComp.txt:674) + static member tcUnrecognizedAttributeTarget() = (840, GetStringFunc("tcUnrecognizedAttributeTarget",",,,") ) + /// This attribute is not valid for use on this language element. Assembly attributes should be attached to a 'do ()' declaration, if necessary within an F# module. + /// (Originally from ..\FSComp.txt:675) + static member tcAttributeIsNotValidForLanguageElementUseDo() = (841, GetStringFunc("tcAttributeIsNotValidForLanguageElementUseDo",",,,") ) + /// This attribute is not valid for use on this language element + /// (Originally from ..\FSComp.txt:676) + static member tcAttributeIsNotValidForLanguageElement() = (842, GetStringFunc("tcAttributeIsNotValidForLanguageElement",",,,") ) + /// Optional arguments cannot be used in custom attributes + /// (Originally from ..\FSComp.txt:677) + static member tcOptionalArgumentsCannotBeUsedInCustomAttribute() = (843, GetStringFunc("tcOptionalArgumentsCannotBeUsedInCustomAttribute",",,,") ) + /// This property cannot be set + /// (Originally from ..\FSComp.txt:678) + static member tcPropertyCannotBeSet0() = (844, GetStringFunc("tcPropertyCannotBeSet0",",,,") ) + /// This property or field was not found on this custom attribute type + /// (Originally from ..\FSComp.txt:679) + static member tcPropertyOrFieldNotFoundInAttribute() = (845, GetStringFunc("tcPropertyOrFieldNotFoundInAttribute",",,,") ) + /// A custom attribute must be a reference type + /// (Originally from ..\FSComp.txt:680) + static member tcCustomAttributeMustBeReferenceType() = (846, GetStringFunc("tcCustomAttributeMustBeReferenceType",",,,") ) + /// The number of args for a custom attribute does not match the expected number of args for the attribute constructor + /// (Originally from ..\FSComp.txt:681) + static member tcCustomAttributeArgumentMismatch() = (847, GetStringFunc("tcCustomAttributeArgumentMismatch",",,,") ) + /// A custom attribute must invoke an object constructor + /// (Originally from ..\FSComp.txt:682) + static member tcCustomAttributeMustInvokeConstructor() = (848, GetStringFunc("tcCustomAttributeMustInvokeConstructor",",,,") ) + /// Attribute expressions must be calls to object constructors + /// (Originally from ..\FSComp.txt:683) + static member tcAttributeExpressionsMustBeConstructorCalls() = (849, GetStringFunc("tcAttributeExpressionsMustBeConstructorCalls",",,,") ) + /// This attribute cannot be used in this version of F# + /// (Originally from ..\FSComp.txt:684) + static member tcUnsupportedAttribute() = (850, GetStringFunc("tcUnsupportedAttribute",",,,") ) + /// Invalid inline specification + /// (Originally from ..\FSComp.txt:685) + static member tcInvalidInlineSpecification() = (851, GetStringFunc("tcInvalidInlineSpecification",",,,") ) + /// 'use' bindings must be of the form 'use = ' + /// (Originally from ..\FSComp.txt:686) + static member tcInvalidUseBinding() = (852, GetStringFunc("tcInvalidUseBinding",",,,") ) + /// Abstract members are not permitted in an augmentation - they must be defined as part of the type itself + /// (Originally from ..\FSComp.txt:687) + static member tcAbstractMembersIllegalInAugmentation() = (853, GetStringFunc("tcAbstractMembersIllegalInAugmentation",",,,") ) + /// Method overrides and interface implementations are not permitted here + /// (Originally from ..\FSComp.txt:688) + static member tcMethodOverridesIllegalHere() = (854, GetStringFunc("tcMethodOverridesIllegalHere",",,,") ) + /// No abstract or interface member was found that corresponds to this override + /// (Originally from ..\FSComp.txt:689) + static member tcNoMemberFoundForOverride() = (855, GetStringFunc("tcNoMemberFoundForOverride",",,,") ) + /// This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:%s + /// (Originally from ..\FSComp.txt:690) + static member tcOverrideArityMismatch(a0 : System.String) = (856, GetStringFunc("tcOverrideArityMismatch",",,,%s,,,") a0) + /// This method already has a default implementation + /// (Originally from ..\FSComp.txt:691) + static member tcDefaultImplementationAlreadyExists() = (857, GetStringFunc("tcDefaultImplementationAlreadyExists",",,,") ) + /// The method implemented by this default is ambiguous + /// (Originally from ..\FSComp.txt:692) + static member tcDefaultAmbiguous() = (858, GetStringFunc("tcDefaultAmbiguous",",,,") ) + /// No abstract property was found that corresponds to this override + /// (Originally from ..\FSComp.txt:693) + static member tcNoPropertyFoundForOverride() = (859, GetStringFunc("tcNoPropertyFoundForOverride",",,,") ) + /// This property overrides or implements an abstract property but the abstract property doesn't have a corresponding %s + /// (Originally from ..\FSComp.txt:694) + static member tcAbstractPropertyMissingGetOrSet(a0 : System.String) = (860, GetStringFunc("tcAbstractPropertyMissingGetOrSet",",,,%s,,,") a0) + /// Invalid signature for set member + /// (Originally from ..\FSComp.txt:695) + static member tcInvalidSignatureForSet() = (861, GetStringFunc("tcInvalidSignatureForSet",",,,") ) + /// This new member hides the abstract member '%s'. Rename the member or use 'override' instead. + /// (Originally from ..\FSComp.txt:696) + static member tcNewMemberHidesAbstractMember(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMember",",,,%s,,,") a0) + /// This new member hides the abstract member '%s' once tuples, functions, units of measure and/or provided types are erased. Rename the member or use 'override' instead. + /// (Originally from ..\FSComp.txt:697) + static member tcNewMemberHidesAbstractMemberWithSuffix(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMemberWithSuffix",",,,%s,,,") a0) + /// Interfaces cannot contain definitions of static initializers + /// (Originally from ..\FSComp.txt:698) + static member tcStaticInitializersIllegalInInterface() = (865, GetStringFunc("tcStaticInitializersIllegalInInterface",",,,") ) + /// Interfaces cannot contain definitions of object constructors + /// (Originally from ..\FSComp.txt:699) + static member tcObjectConstructorsIllegalInInterface() = (866, GetStringFunc("tcObjectConstructorsIllegalInInterface",",,,") ) + /// Interfaces cannot contain definitions of member overrides + /// (Originally from ..\FSComp.txt:700) + static member tcMemberOverridesIllegalInInterface() = (867, GetStringFunc("tcMemberOverridesIllegalInInterface",",,,") ) + /// Interfaces cannot contain definitions of concrete members. You may need to define a constructor on your type to indicate that the type is a class. + /// (Originally from ..\FSComp.txt:701) + static member tcConcreteMembersIllegalInInterface() = (868, GetStringFunc("tcConcreteMembersIllegalInInterface",",,,") ) + /// Constructors cannot be specified in exception augmentations + /// (Originally from ..\FSComp.txt:702) + static member tcConstructorsDisallowedInExceptionAugmentation() = (869, GetStringFunc("tcConstructorsDisallowedInExceptionAugmentation",",,,") ) + /// Structs cannot have an object constructor with no arguments. This is a restriction imposed on all CLI languages as structs automatically support a default constructor. + /// (Originally from ..\FSComp.txt:703) + static member tcStructsCannotHaveConstructorWithNoArguments() = (870, GetStringFunc("tcStructsCannotHaveConstructorWithNoArguments",",,,") ) + /// Constructors cannot be defined for this type + /// (Originally from ..\FSComp.txt:704) + static member tcConstructorsIllegalForThisType() = (871, GetStringFunc("tcConstructorsIllegalForThisType",",,,") ) + /// Recursive bindings that include member specifications can only occur as a direct augmentation of a type + /// (Originally from ..\FSComp.txt:705) + static member tcRecursiveBindingsWithMembersMustBeDirectAugmentation() = (872, GetStringFunc("tcRecursiveBindingsWithMembersMustBeDirectAugmentation",",,,") ) + /// Only simple variable patterns can be bound in 'let rec' constructs + /// (Originally from ..\FSComp.txt:706) + static member tcOnlySimplePatternsInLetRec() = (873, GetStringFunc("tcOnlySimplePatternsInLetRec",",,,") ) + /// Only record fields and simple, non-recursive 'let' bindings may be marked mutable + /// (Originally from ..\FSComp.txt:707) + static member tcOnlyRecordFieldsAndSimpleLetCanBeMutable() = (874, GetStringFunc("tcOnlyRecordFieldsAndSimpleLetCanBeMutable",",,,") ) + /// This member is not sufficiently generic + /// (Originally from ..\FSComp.txt:708) + static member tcMemberIsNotSufficientlyGeneric() = (875, GetStringFunc("tcMemberIsNotSufficientlyGeneric",",,,") ) + /// A declaration may only be the [] attribute if a constant value is also given, e.g. 'val x : int = 1' + /// (Originally from ..\FSComp.txt:709) + static member tcLiteralAttributeRequiresConstantValue() = (876, GetStringFunc("tcLiteralAttributeRequiresConstantValue",",,,") ) + /// A declaration may only be given a value in a signature if the declaration has the [] attribute + /// (Originally from ..\FSComp.txt:710) + static member tcValueInSignatureRequiresLiteralAttribute() = (877, GetStringFunc("tcValueInSignatureRequiresLiteralAttribute",",,,") ) + /// Thread-static and context-static variables must be static and given the [] attribute to indicate that the value is initialized to the default value on each new thread + /// (Originally from ..\FSComp.txt:711) + static member tcThreadStaticAndContextStaticMustBeStatic() = (878, GetStringFunc("tcThreadStaticAndContextStaticMustBeStatic",",,,") ) + /// Volatile fields must be marked 'mutable' and cannot be thread-static + /// (Originally from ..\FSComp.txt:712) + static member tcVolatileFieldsMustBeMutable() = (879, GetStringFunc("tcVolatileFieldsMustBeMutable",",,,") ) + /// Uninitialized 'val' fields must be mutable and marked with the '[]' attribute. Consider using a 'let' binding instead of a 'val' field. + /// (Originally from ..\FSComp.txt:713) + static member tcUninitializedValFieldsMustBeMutable() = (880, GetStringFunc("tcUninitializedValFieldsMustBeMutable",",,,") ) + /// Static 'val' fields in types must be mutable, private and marked with the '[]' attribute. They are initialized to the 'null' or 'zero' value for their type. Consider also using a 'static let mutable' binding in a class type. + /// (Originally from ..\FSComp.txt:714) + static member tcStaticValFieldsMustBeMutableAndPrivate() = (881, GetStringFunc("tcStaticValFieldsMustBeMutableAndPrivate",",,,") ) + /// This field requires a name + /// (Originally from ..\FSComp.txt:715) + static member tcFieldRequiresName() = (882, GetStringFunc("tcFieldRequiresName",",,,") ) + /// Invalid namespace, module, type or union case name + /// (Originally from ..\FSComp.txt:716) + static member tcInvalidNamespaceModuleTypeUnionName() = (883, GetStringFunc("tcInvalidNamespaceModuleTypeUnionName",",,,") ) + /// Explicit type declarations for constructors must be of the form 'ty1 * ... * tyN -> resTy'. Parentheses may be required around 'resTy' + /// (Originally from ..\FSComp.txt:717) + static member tcIllegalFormForExplicitTypeDeclaration() = (884, GetStringFunc("tcIllegalFormForExplicitTypeDeclaration",",,,") ) + /// Return types of union cases must be identical to the type being defined, up to abbreviations + /// (Originally from ..\FSComp.txt:718) + static member tcReturnTypesForUnionMustBeSameAsType() = (885, GetStringFunc("tcReturnTypesForUnionMustBeSameAsType",",,,") ) + /// This is not a valid value for an enumeration literal + /// (Originally from ..\FSComp.txt:719) + static member tcInvalidEnumerationLiteral() = (886, GetStringFunc("tcInvalidEnumerationLiteral",",,,") ) + /// The type '%s' is not an interface type + /// (Originally from ..\FSComp.txt:720) + static member tcTypeIsNotInterfaceType1(a0 : System.String) = (887, GetStringFunc("tcTypeIsNotInterfaceType1",",,,%s,,,") a0) + /// Duplicate specification of an interface + /// (Originally from ..\FSComp.txt:721) + static member tcDuplicateSpecOfInterface() = (888, GetStringFunc("tcDuplicateSpecOfInterface",",,,") ) + /// A field/val declaration is not permitted here + /// (Originally from ..\FSComp.txt:722) + static member tcFieldValIllegalHere() = (889, GetStringFunc("tcFieldValIllegalHere",",,,") ) + /// A inheritance declaration is not permitted here + /// (Originally from ..\FSComp.txt:723) + static member tcInheritIllegalHere() = (890, GetStringFunc("tcInheritIllegalHere",",,,") ) + /// This declaration opens the module '%s', which is marked as 'RequireQualifiedAccess'. Adjust your code to use qualified references to the elements of the module instead, e.g. 'List.map' instead of 'map'. This change will ensure that your code is robust as new constructs are added to libraries. + /// (Originally from ..\FSComp.txt:724) + static member tcModuleRequiresQualifiedAccess(a0 : System.String) = (892, GetStringFunc("tcModuleRequiresQualifiedAccess",",,,%s,,,") a0) + /// This declaration opens the namespace or module '%s' through a partially qualified path. Adjust this code to use the full path of the namespace. This change will make your code more robust as new constructs are added to the F# and CLI libraries. + /// (Originally from ..\FSComp.txt:725) + static member tcOpenUsedWithPartiallyQualifiedPath(a0 : System.String) = (893, GetStringFunc("tcOpenUsedWithPartiallyQualifiedPath",",,,%s,,,") a0) + /// Local class bindings cannot be marked inline. Consider lifting the definition out of the class or else do not mark it as inline. + /// (Originally from ..\FSComp.txt:726) + static member tcLocalClassBindingsCannotBeInline() = (894, GetStringFunc("tcLocalClassBindingsCannotBeInline",",,,") ) + /// Type abbreviations cannot have members + /// (Originally from ..\FSComp.txt:727) + static member tcTypeAbbreviationsMayNotHaveMembers() = (895, GetStringFunc("tcTypeAbbreviationsMayNotHaveMembers",",,,") ) + /// As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors. + /// (Originally from ..\FSComp.txt:728) + static member tcTypeAbbreviationsCheckedAtCompileTime() = (GetStringFunc("tcTypeAbbreviationsCheckedAtCompileTime",",,,") ) + /// Enumerations cannot have members + /// (Originally from ..\FSComp.txt:729) + static member tcEnumerationsMayNotHaveMembers() = (896, GetStringFunc("tcEnumerationsMayNotHaveMembers",",,,") ) + /// Measure declarations may have only static members + /// (Originally from ..\FSComp.txt:730) + static member tcMeasureDeclarationsRequireStaticMembers() = (897, GetStringFunc("tcMeasureDeclarationsRequireStaticMembers",",,,") ) + /// Structs cannot contain 'do' bindings because the default constructor for structs would not execute these bindings + /// (Originally from ..\FSComp.txt:731) + static member tcStructsMayNotContainDoBindings() = (GetStringFunc("tcStructsMayNotContainDoBindings",",,,") ) + /// Structs cannot contain value definitions because the default constructor for structs will not execute these bindings. Consider adding additional arguments to the primary constructor for the type. + /// (Originally from ..\FSComp.txt:732) + static member tcStructsMayNotContainLetBindings() = (901, GetStringFunc("tcStructsMayNotContainLetBindings",",,,") ) + /// Static value definitions may only be used in types with a primary constructor. Consider adding arguments to the type definition, e.g. 'type X(args) = ...'. + /// (Originally from ..\FSComp.txt:733) + static member tcStaticLetBindingsRequireClassesWithImplicitConstructors() = (902, GetStringFunc("tcStaticLetBindingsRequireClassesWithImplicitConstructors",",,,") ) + /// Measure declarations may have only static members: constructors are not available + /// (Originally from ..\FSComp.txt:734) + static member tcMeasureDeclarationsRequireStaticMembersNotConstructors() = (904, GetStringFunc("tcMeasureDeclarationsRequireStaticMembersNotConstructors",",,,") ) + /// A member and a local class binding both have the name '%s' + /// (Originally from ..\FSComp.txt:735) + static member tcMemberAndLocalClassBindingHaveSameName(a0 : System.String) = (905, GetStringFunc("tcMemberAndLocalClassBindingHaveSameName",",,,%s,,,") a0) + /// Type abbreviations cannot have interface declarations + /// (Originally from ..\FSComp.txt:736) + static member tcTypeAbbreviationsCannotHaveInterfaceDeclaration() = (906, GetStringFunc("tcTypeAbbreviationsCannotHaveInterfaceDeclaration",",,,") ) + /// Enumerations cannot have interface declarations + /// (Originally from ..\FSComp.txt:737) + static member tcEnumerationsCannotHaveInterfaceDeclaration() = (907, GetStringFunc("tcEnumerationsCannotHaveInterfaceDeclaration",",,,") ) + /// This type is not an interface type + /// (Originally from ..\FSComp.txt:738) + static member tcTypeIsNotInterfaceType0() = (908, GetStringFunc("tcTypeIsNotInterfaceType0",",,,") ) + /// All implemented interfaces should be declared on the initial declaration of the type + /// (Originally from ..\FSComp.txt:739) + static member tcAllImplementedInterfacesShouldBeDeclared() = (909, GetStringFunc("tcAllImplementedInterfacesShouldBeDeclared",",,,") ) + /// A default implementation of this interface has already been added because the explicit implementation of the interface was not specified at the definition of the type + /// (Originally from ..\FSComp.txt:740) + static member tcDefaultImplementationForInterfaceHasAlreadyBeenAdded() = (910, GetStringFunc("tcDefaultImplementationForInterfaceHasAlreadyBeenAdded",",,,") ) + /// This member is not permitted in an interface implementation + /// (Originally from ..\FSComp.txt:741) + static member tcMemberNotPermittedInInterfaceImplementation() = (911, GetStringFunc("tcMemberNotPermittedInInterfaceImplementation",",,,") ) + /// This declaration element is not permitted in an augmentation + /// (Originally from ..\FSComp.txt:742) + static member tcDeclarationElementNotPermittedInAugmentation() = (912, GetStringFunc("tcDeclarationElementNotPermittedInAugmentation",",,,") ) + /// Types cannot contain nested type definitions + /// (Originally from ..\FSComp.txt:743) + static member tcTypesCannotContainNestedTypes() = (913, GetStringFunc("tcTypesCannotContainNestedTypes",",,,") ) + /// type, exception or module + /// (Originally from ..\FSComp.txt:744) + static member tcTypeExceptionOrModule() = (GetStringFunc("tcTypeExceptionOrModule",",,,") ) + /// type or module + /// (Originally from ..\FSComp.txt:745) + static member tcTypeOrModule() = (GetStringFunc("tcTypeOrModule",",,,") ) + /// The struct, record or union type '%s' implements the interface 'System.IStructuralEquatable' explicitly. Apply the 'CustomEquality' attribute to the type. + /// (Originally from ..\FSComp.txt:746) + static member tcImplementsIStructuralEquatableExplicitly(a0 : System.String) = (914, GetStringFunc("tcImplementsIStructuralEquatableExplicitly",",,,%s,,,") a0) + /// The struct, record or union type '%s' implements the interface 'System.IEquatable<_>' explicitly. Apply the 'CustomEquality' attribute to the type and provide a consistent implementation of the non-generic override 'System.Object.Equals(obj)'. + /// (Originally from ..\FSComp.txt:747) + static member tcImplementsIEquatableExplicitly(a0 : System.String) = (915, GetStringFunc("tcImplementsIEquatableExplicitly",",,,%s,,,") a0) + /// Explicit type specifications cannot be used for exception constructors + /// (Originally from ..\FSComp.txt:748) + static member tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors() = (916, GetStringFunc("tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors",",,,") ) + /// Exception abbreviations should not have argument lists + /// (Originally from ..\FSComp.txt:749) + static member tcExceptionAbbreviationsShouldNotHaveArgumentList() = (917, GetStringFunc("tcExceptionAbbreviationsShouldNotHaveArgumentList",",,,") ) + /// Abbreviations for Common IL exceptions cannot take arguments + /// (Originally from ..\FSComp.txt:750) + static member tcAbbreviationsFordotNetExceptionsCannotTakeArguments() = (918, GetStringFunc("tcAbbreviationsFordotNetExceptionsCannotTakeArguments",",,,") ) + /// Exception abbreviations must refer to existing exceptions or F# types deriving from System.Exception + /// (Originally from ..\FSComp.txt:751) + static member tcExceptionAbbreviationsMustReferToValidExceptions() = (919, GetStringFunc("tcExceptionAbbreviationsMustReferToValidExceptions",",,,") ) + /// Abbreviations for Common IL exception types must have a matching object constructor + /// (Originally from ..\FSComp.txt:752) + static member tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor() = (920, GetStringFunc("tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor",",,,") ) + /// Not an exception + /// (Originally from ..\FSComp.txt:753) + static member tcNotAnException() = (921, GetStringFunc("tcNotAnException",",,,") ) + /// Invalid module name + /// (Originally from ..\FSComp.txt:755) + static member tcInvalidModuleName() = (924, GetStringFunc("tcInvalidModuleName",",,,") ) + /// Invalid type extension + /// (Originally from ..\FSComp.txt:756) + static member tcInvalidTypeExtension() = (925, GetStringFunc("tcInvalidTypeExtension",",,,") ) + /// The attributes of this type specify multiple kinds for the type + /// (Originally from ..\FSComp.txt:757) + static member tcAttributesOfTypeSpecifyMultipleKindsForType() = (926, GetStringFunc("tcAttributesOfTypeSpecifyMultipleKindsForType",",,,") ) + /// The kind of the type specified by its attributes does not match the kind implied by its definition + /// (Originally from ..\FSComp.txt:758) + static member tcKindOfTypeSpecifiedDoesNotMatchDefinition() = (927, GetStringFunc("tcKindOfTypeSpecifiedDoesNotMatchDefinition",",,,") ) + /// Measure definitions cannot have type parameters + /// (Originally from ..\FSComp.txt:759) + static member tcMeasureDefinitionsCannotHaveTypeParameters() = (928, GetStringFunc("tcMeasureDefinitionsCannotHaveTypeParameters",",,,") ) + /// This type requires a definition + /// (Originally from ..\FSComp.txt:760) + static member tcTypeRequiresDefinition() = (929, GetStringFunc("tcTypeRequiresDefinition",",,,") ) + /// This type abbreviation has one or more declared type parameters that do not appear in the type being abbreviated. Type abbreviations must use all declared type parameters in the type being abbreviated. Consider removing one or more type parameters, or use a concrete type definition that wraps an underlying type, such as 'type C<'a> = C of ...'. + /// (Originally from ..\FSComp.txt:761) + static member tcTypeAbbreviationHasTypeParametersMissingOnType() = (GetStringFunc("tcTypeAbbreviationHasTypeParametersMissingOnType",",,,") ) + /// Structs, interfaces, enums and delegates cannot inherit from other types + /// (Originally from ..\FSComp.txt:762) + static member tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes() = (931, GetStringFunc("tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes",",,,") ) + /// Types cannot inherit from multiple concrete types + /// (Originally from ..\FSComp.txt:763) + static member tcTypesCannotInheritFromMultipleConcreteTypes() = (932, GetStringFunc("tcTypesCannotInheritFromMultipleConcreteTypes",",,,") ) + /// Records, union, abbreviations and struct types cannot have the 'AllowNullLiteral' attribute + /// (Originally from ..\FSComp.txt:764) + static member tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute() = (934, GetStringFunc("tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute",",,,") ) + /// Types with the 'AllowNullLiteral' attribute may only inherit from or implement types which also allow the use of the null literal + /// (Originally from ..\FSComp.txt:765) + static member tcAllowNullTypesMayOnlyInheritFromAllowNullTypes() = (935, GetStringFunc("tcAllowNullTypesMayOnlyInheritFromAllowNullTypes",",,,") ) + /// Generic types cannot be given the 'StructLayout' attribute + /// (Originally from ..\FSComp.txt:766) + static member tcGenericTypesCannotHaveStructLayout() = (936, GetStringFunc("tcGenericTypesCannotHaveStructLayout",",,,") ) + /// Only structs and classes without primary constructors may be given the 'StructLayout' attribute + /// (Originally from ..\FSComp.txt:767) + static member tcOnlyStructsCanHaveStructLayout() = (937, GetStringFunc("tcOnlyStructsCanHaveStructLayout",",,,") ) + /// The representation of this type is hidden by the signature. It must be given an attribute such as [], [] or [] to indicate the characteristics of the type. + /// (Originally from ..\FSComp.txt:768) + static member tcRepresentationOfTypeHiddenBySignature() = (938, GetStringFunc("tcRepresentationOfTypeHiddenBySignature",",,,") ) + /// Only classes may be given the 'AbstractClass' attribute + /// (Originally from ..\FSComp.txt:769) + static member tcOnlyClassesCanHaveAbstract() = (939, GetStringFunc("tcOnlyClassesCanHaveAbstract",",,,") ) + /// Only types representing units-of-measure may be given the 'Measure' attribute + /// (Originally from ..\FSComp.txt:770) + static member tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure() = (940, GetStringFunc("tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure",",,,") ) + /// Accessibility modifiers are not permitted on overrides or interface implementations + /// (Originally from ..\FSComp.txt:771) + static member tcOverridesCannotHaveVisibilityDeclarations() = (941, GetStringFunc("tcOverridesCannotHaveVisibilityDeclarations",",,,") ) + /// Discriminated union types are always sealed + /// (Originally from ..\FSComp.txt:772) + static member tcTypesAreAlwaysSealedDU() = (942, GetStringFunc("tcTypesAreAlwaysSealedDU",",,,") ) + /// Record types are always sealed + /// (Originally from ..\FSComp.txt:773) + static member tcTypesAreAlwaysSealedRecord() = (942, GetStringFunc("tcTypesAreAlwaysSealedRecord",",,,") ) + /// Assembly code types are always sealed + /// (Originally from ..\FSComp.txt:774) + static member tcTypesAreAlwaysSealedAssemblyCode() = (942, GetStringFunc("tcTypesAreAlwaysSealedAssemblyCode",",,,") ) + /// Struct types are always sealed + /// (Originally from ..\FSComp.txt:775) + static member tcTypesAreAlwaysSealedStruct() = (942, GetStringFunc("tcTypesAreAlwaysSealedStruct",",,,") ) + /// Delegate types are always sealed + /// (Originally from ..\FSComp.txt:776) + static member tcTypesAreAlwaysSealedDelegate() = (942, GetStringFunc("tcTypesAreAlwaysSealedDelegate",",,,") ) + /// Enum types are always sealed + /// (Originally from ..\FSComp.txt:777) + static member tcTypesAreAlwaysSealedEnum() = (942, GetStringFunc("tcTypesAreAlwaysSealedEnum",",,,") ) + /// Interface types and delegate types cannot contain fields + /// (Originally from ..\FSComp.txt:778) + static member tcInterfaceTypesAndDelegatesCannotContainFields() = (943, GetStringFunc("tcInterfaceTypesAndDelegatesCannotContainFields",",,,") ) + /// Abbreviated types cannot be given the 'Sealed' attribute + /// (Originally from ..\FSComp.txt:779) + static member tcAbbreviatedTypesCannotBeSealed() = (944, GetStringFunc("tcAbbreviatedTypesCannotBeSealed",",,,") ) + /// Cannot inherit a sealed type + /// (Originally from ..\FSComp.txt:780) + static member tcCannotInheritFromSealedType() = (945, GetStringFunc("tcCannotInheritFromSealedType",",,,") ) + /// Cannot inherit from interface type. Use interface ... with instead. + /// (Originally from ..\FSComp.txt:781) + static member tcCannotInheritFromInterfaceType() = (946, GetStringFunc("tcCannotInheritFromInterfaceType",",,,") ) + /// Struct types cannot contain abstract members + /// (Originally from ..\FSComp.txt:782) + static member tcStructTypesCannotContainAbstractMembers() = (947, GetStringFunc("tcStructTypesCannotContainAbstractMembers",",,,") ) + /// Interface types cannot be sealed + /// (Originally from ..\FSComp.txt:783) + static member tcInterfaceTypesCannotBeSealed() = (948, GetStringFunc("tcInterfaceTypesCannotBeSealed",",,,") ) + /// Delegate specifications must be of the form 'typ -> typ' + /// (Originally from ..\FSComp.txt:784) + static member tcInvalidDelegateSpecification() = (949, GetStringFunc("tcInvalidDelegateSpecification",",,,") ) + /// Delegate specifications must not be curried types. Use 'typ * ... * typ -> typ' for multi-argument delegates, and 'typ -> (typ -> typ)' for delegates returning function values. + /// (Originally from ..\FSComp.txt:785) + static member tcDelegatesCannotBeCurried() = (950, GetStringFunc("tcDelegatesCannotBeCurried",",,,") ) + /// Literal enumerations must have type int, uint, int16, uint16, int64, uint64, byte, sbyte or char + /// (Originally from ..\FSComp.txt:786) + static member tcInvalidTypeForLiteralEnumeration() = (951, GetStringFunc("tcInvalidTypeForLiteralEnumeration",",,,") ) + /// This type definition involves an immediate cyclic reference through an abbreviation + /// (Originally from ..\FSComp.txt:788) + static member tcTypeDefinitionIsCyclic() = (953, GetStringFunc("tcTypeDefinitionIsCyclic",",,,") ) + /// This type definition involves an immediate cyclic reference through a struct field or inheritance relation + /// (Originally from ..\FSComp.txt:789) + static member tcTypeDefinitionIsCyclicThroughInheritance() = (954, GetStringFunc("tcTypeDefinitionIsCyclicThroughInheritance",",,,") ) + /// The syntax 'type X with ...' is reserved for augmentations. Types whose representations are hidden but which have members are now declared in signatures using 'type X = ...'. You may also need to add the '[] attribute to the type definition in the signature + /// (Originally from ..\FSComp.txt:790) + static member tcReservedSyntaxForAugmentation() = (GetStringFunc("tcReservedSyntaxForAugmentation",",,,") ) + /// Members that extend interface, delegate or enum types must be placed in a module separate to the definition of the type. This module must either have the AutoOpen attribute or be opened explicitly by client code to bring the extension members into scope. + /// (Originally from ..\FSComp.txt:791) + static member tcMembersThatExtendInterfaceMustBePlacedInSeparateModule() = (956, GetStringFunc("tcMembersThatExtendInterfaceMustBePlacedInSeparateModule",",,,") ) + /// One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '%s' + /// (Originally from ..\FSComp.txt:792) + static member tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(a0 : System.String) = (957, GetStringFunc("tcDeclaredTypeParametersForExtensionDoNotMatchOriginal",",,,%s,,,") a0) + /// Type definitions may only have one 'inherit' specification and it must be the first declaration + /// (Originally from ..\FSComp.txt:793) + static member tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit() = (959, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit",",,,") ) + /// 'let' and 'do' bindings must come before member and interface definitions in type definitions + /// (Originally from ..\FSComp.txt:794) + static member tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers() = (960, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers",",,,") ) + /// This 'inherit' declaration specifies the inherited type but no arguments. Consider supplying arguments, e.g. 'inherit BaseType(args)'. + /// (Originally from ..\FSComp.txt:795) + static member tcInheritDeclarationMissingArguments() = (961, GetStringFunc("tcInheritDeclarationMissingArguments",",,,") ) + /// This 'inherit' declaration has arguments, but is not in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + /// (Originally from ..\FSComp.txt:796) + static member tcInheritConstructionCallNotPartOfImplicitSequence() = (962, GetStringFunc("tcInheritConstructionCallNotPartOfImplicitSequence",",,,") ) + /// This definition may only be used in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + /// (Originally from ..\FSComp.txt:797) + static member tcLetAndDoRequiresImplicitConstructionSequence() = (963, GetStringFunc("tcLetAndDoRequiresImplicitConstructionSequence",",,,") ) + /// Type abbreviations cannot have augmentations + /// (Originally from ..\FSComp.txt:798) + static member tcTypeAbbreviationsCannotHaveAugmentations() = (964, GetStringFunc("tcTypeAbbreviationsCannotHaveAugmentations",",,,") ) + /// The path '%s' is a namespace. A module abbreviation may not abbreviate a namespace. + /// (Originally from ..\FSComp.txt:799) + static member tcModuleAbbreviationForNamespace(a0 : System.String) = (965, GetStringFunc("tcModuleAbbreviationForNamespace",",,,%s,,,") a0) + /// The type '%s' is used in an invalid way. A value prior to '%s' has an inferred type involving '%s', which is an invalid forward reference. + /// (Originally from ..\FSComp.txt:800) + static member tcTypeUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (966, GetStringFunc("tcTypeUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The member '%s' is used in an invalid way. A use of '%s' has been inferred prior to the definition of '%s', which is an invalid forward reference. + /// (Originally from ..\FSComp.txt:801) + static member tcMemberUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (967, GetStringFunc("tcMemberUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The attribute 'AutoOpen(\"%s\")' in the assembly '%s' did not refer to a valid module or namespace in that assembly and has been ignored + /// (Originally from ..\FSComp.txt:804) + static member tcAttributeAutoOpenWasIgnored(a0 : System.String, a1 : System.String) = (970, GetStringFunc("tcAttributeAutoOpenWasIgnored",",,,%s,,,%s,,,") a0 a1) + /// Undefined value '%s' + /// (Originally from ..\FSComp.txt:805) + static member ilUndefinedValue(a0 : System.String) = (971, GetStringFunc("ilUndefinedValue",",,,%s,,,") a0) + /// Label %s not found + /// (Originally from ..\FSComp.txt:806) + static member ilLabelNotFound(a0 : System.String) = (972, GetStringFunc("ilLabelNotFound",",,,%s,,,") a0) + /// Incorrect number of type arguments to local call + /// (Originally from ..\FSComp.txt:807) + static member ilIncorrectNumberOfTypeArguments() = (973, GetStringFunc("ilIncorrectNumberOfTypeArguments",",,,") ) + /// Dynamic invocation of %s is not supported + /// (Originally from ..\FSComp.txt:808) + static member ilDynamicInvocationNotSupported(a0 : System.String) = (GetStringFunc("ilDynamicInvocationNotSupported",",,,%s,,,") a0) + /// Taking the address of a literal field is invalid + /// (Originally from ..\FSComp.txt:809) + static member ilAddressOfLiteralFieldIsInvalid() = (975, GetStringFunc("ilAddressOfLiteralFieldIsInvalid",",,,") ) + /// This operation involves taking the address of a value '%s' represented using a local variable or other special representation. This is invalid. + /// (Originally from ..\FSComp.txt:810) + static member ilAddressOfValueHereIsInvalid(a0 : System.String) = (976, GetStringFunc("ilAddressOfValueHereIsInvalid",",,,%s,,,") a0) + /// Custom marshallers cannot be specified in F# code. Consider using a C# helper function. + /// (Originally from ..\FSComp.txt:811) + static member ilCustomMarshallersCannotBeUsedInFSharp() = (980, GetStringFunc("ilCustomMarshallersCannotBeUsedInFSharp",",,,") ) + /// The MarshalAs attribute could not be decoded + /// (Originally from ..\FSComp.txt:812) + static member ilMarshalAsAttributeCannotBeDecoded() = (981, GetStringFunc("ilMarshalAsAttributeCannotBeDecoded",",,,") ) + /// The signature for this external function contains type parameters. Constrain the argument and return types to indicate the types of the corresponding C function. + /// (Originally from ..\FSComp.txt:813) + static member ilSignatureForExternalFunctionContainsTypeParameters() = (982, GetStringFunc("ilSignatureForExternalFunctionContainsTypeParameters",",,,") ) + /// The DllImport attribute could not be decoded + /// (Originally from ..\FSComp.txt:814) + static member ilDllImportAttributeCouldNotBeDecoded() = (983, GetStringFunc("ilDllImportAttributeCouldNotBeDecoded",",,,") ) + /// Literal fields cannot be set + /// (Originally from ..\FSComp.txt:815) + static member ilLiteralFieldsCannotBeSet() = (984, GetStringFunc("ilLiteralFieldsCannotBeSet",",,,") ) + /// GenSetStorage: %s was represented as a static method but was not an appropriate lambda expression + /// (Originally from ..\FSComp.txt:816) + static member ilStaticMethodIsNotLambda(a0 : System.String) = (985, GetStringFunc("ilStaticMethodIsNotLambda",",,,%s,,,") a0) + /// Mutable variables cannot escape their method + /// (Originally from ..\FSComp.txt:817) + static member ilMutableVariablesCannotEscapeMethod() = (986, GetStringFunc("ilMutableVariablesCannotEscapeMethod",",,,") ) + /// Compiler error: unexpected unrealized value + /// (Originally from ..\FSComp.txt:818) + static member ilUnexpectedUnrealizedValue() = (987, GetStringFunc("ilUnexpectedUnrealizedValue",",,,") ) + /// Main module of program is empty: nothing will happen when it is run + /// (Originally from ..\FSComp.txt:819) + static member ilMainModuleEmpty() = (988, GetStringFunc("ilMainModuleEmpty",",,,") ) + /// This type cannot be used for a literal field + /// (Originally from ..\FSComp.txt:820) + static member ilTypeCannotBeUsedForLiteralField() = (989, GetStringFunc("ilTypeCannotBeUsedForLiteralField",",,,") ) + /// Unexpected GetSet annotation on a property + /// (Originally from ..\FSComp.txt:821) + static member ilUnexpectedGetSetAnnotation() = (990, GetStringFunc("ilUnexpectedGetSetAnnotation",",,,") ) + /// The FieldOffset attribute could not be decoded + /// (Originally from ..\FSComp.txt:822) + static member ilFieldOffsetAttributeCouldNotBeDecoded() = (991, GetStringFunc("ilFieldOffsetAttributeCouldNotBeDecoded",",,,") ) + /// The StructLayout attribute could not be decoded + /// (Originally from ..\FSComp.txt:823) + static member ilStructLayoutAttributeCouldNotBeDecoded() = (992, GetStringFunc("ilStructLayoutAttributeCouldNotBeDecoded",",,,") ) + /// The DefaultAugmentation attribute could not be decoded + /// (Originally from ..\FSComp.txt:824) + static member ilDefaultAugmentationAttributeCouldNotBeDecoded() = (993, GetStringFunc("ilDefaultAugmentationAttributeCouldNotBeDecoded",",,,") ) + /// Reflected definitions cannot contain uses of the prefix splice operator '%%' + /// (Originally from ..\FSComp.txt:825) + static member ilReflectedDefinitionsCannotUseSliceOperator() = (994, GetStringFunc("ilReflectedDefinitionsCannotUseSliceOperator",",,,") ) + /// Problem with codepage '%d': %s + /// (Originally from ..\FSComp.txt:826) + static member optsProblemWithCodepage(a0 : System.Int32, a1 : System.String) = (1000, GetStringFunc("optsProblemWithCodepage",",,,%d,,,%s,,,") a0 a1) + /// Copyright (c) Microsoft Corporation. All Rights Reserved. + /// (Originally from ..\FSComp.txt:827) + static member optsCopyright() = (GetStringFunc("optsCopyright",",,,") ) + /// Freely distributed under the MIT Open Source License. https://github.com/Microsoft/visualfsharp/blob/master/License.txt + /// (Originally from ..\FSComp.txt:828) + static member optsCopyrightCommunity() = (GetStringFunc("optsCopyrightCommunity",",,,") ) + /// Name of the output file (Short form: -o) + /// (Originally from ..\FSComp.txt:829) + static member optsNameOfOutputFile() = (GetStringFunc("optsNameOfOutputFile",",,,") ) + /// Build a console executable + /// (Originally from ..\FSComp.txt:830) + static member optsBuildConsole() = (GetStringFunc("optsBuildConsole",",,,") ) + /// Build a Windows executable + /// (Originally from ..\FSComp.txt:831) + static member optsBuildWindows() = (GetStringFunc("optsBuildWindows",",,,") ) + /// Build a library (Short form: -a) + /// (Originally from ..\FSComp.txt:832) + static member optsBuildLibrary() = (GetStringFunc("optsBuildLibrary",",,,") ) + /// Build a module that can be added to another assembly + /// (Originally from ..\FSComp.txt:833) + static member optsBuildModule() = (GetStringFunc("optsBuildModule",",,,") ) + /// Delay-sign the assembly using only the public portion of the strong name key + /// (Originally from ..\FSComp.txt:834) + static member optsDelaySign() = (GetStringFunc("optsDelaySign",",,,") ) + /// Public-sign the assembly using only the public portion of the strong name key, and mark the assembly as signed + /// (Originally from ..\FSComp.txt:835) + static member optsPublicSign() = (GetStringFunc("optsPublicSign",",,,") ) + /// Write the xmldoc of the assembly to the given file + /// (Originally from ..\FSComp.txt:836) + static member optsWriteXml() = (GetStringFunc("optsWriteXml",",,,") ) + /// Specify a strong name key file + /// (Originally from ..\FSComp.txt:837) + static member optsStrongKeyFile() = (GetStringFunc("optsStrongKeyFile",",,,") ) + /// Specify a strong name key container + /// (Originally from ..\FSComp.txt:838) + static member optsStrongKeyContainer() = (GetStringFunc("optsStrongKeyContainer",",,,") ) + /// Limit which platforms this code can run on: x86, Itanium, x64, anycpu32bitpreferred, or anycpu. The default is anycpu. + /// (Originally from ..\FSComp.txt:839) + static member optsPlatform() = (GetStringFunc("optsPlatform",",,,") ) + /// Only include optimization information essential for implementing inlined constructs. Inhibits cross-module inlining but improves binary compatibility. + /// (Originally from ..\FSComp.txt:840) + static member optsNoOpt() = (GetStringFunc("optsNoOpt",",,,") ) + /// Don't add a resource to the generated assembly containing F#-specific metadata + /// (Originally from ..\FSComp.txt:841) + static member optsNoInterface() = (GetStringFunc("optsNoInterface",",,,") ) + /// Print the inferred interface of the assembly to a file + /// (Originally from ..\FSComp.txt:842) + static member optsSig() = (GetStringFunc("optsSig",",,,") ) + /// Reference an assembly (Short form: -r) + /// (Originally from ..\FSComp.txt:843) + static member optsReference() = (GetStringFunc("optsReference",",,,") ) + /// Specify a Win32 resource file (.res) + /// (Originally from ..\FSComp.txt:844) + static member optsWin32res() = (GetStringFunc("optsWin32res",",,,") ) + /// Specify a Win32 manifest file + /// (Originally from ..\FSComp.txt:845) + static member optsWin32manifest() = (GetStringFunc("optsWin32manifest",",,,") ) + /// Do not include the default Win32 manifest + /// (Originally from ..\FSComp.txt:846) + static member optsNowin32manifest() = (GetStringFunc("optsNowin32manifest",",,,") ) + /// Embed all source files in the portable PDB file + /// (Originally from ..\FSComp.txt:847) + static member optsEmbedAllSource() = (GetStringFunc("optsEmbedAllSource",",,,") ) + /// Embed specific source files in the portable PDB file + /// (Originally from ..\FSComp.txt:848) + static member optsEmbedSource() = (GetStringFunc("optsEmbedSource",",,,") ) + /// Source link information file to embed in the portable PDB file + /// (Originally from ..\FSComp.txt:849) + static member optsSourceLink() = (GetStringFunc("optsSourceLink",",,,") ) + /// --embed switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) + /// (Originally from ..\FSComp.txt:850) + static member optsEmbeddedSourceRequirePortablePDBs() = (1501, GetStringFunc("optsEmbeddedSourceRequirePortablePDBs",",,,") ) + /// --sourcelink switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) + /// (Originally from ..\FSComp.txt:851) + static member optsSourceLinkRequirePortablePDBs() = (1502, GetStringFunc("optsSourceLinkRequirePortablePDBs",",,,") ) + /// Source file is too large to embed in a portable PDB + /// (Originally from ..\FSComp.txt:852) + static member srcFileTooLarge() = (GetStringFunc("srcFileTooLarge",",,,") ) + /// Embed the specified managed resource + /// (Originally from ..\FSComp.txt:853) + static member optsResource() = (GetStringFunc("optsResource",",,,") ) + /// Link the specified resource to this assembly where the resinfo format is [,[,public|private]] + /// (Originally from ..\FSComp.txt:854) + static member optsLinkresource() = (GetStringFunc("optsLinkresource",",,,") ) + /// Emit debug information (Short form: -g) + /// (Originally from ..\FSComp.txt:855) + static member optsDebugPM() = (GetStringFunc("optsDebugPM",",,,") ) + /// Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + /// (Originally from ..\FSComp.txt:856) + static member optsDebug(a0 : System.String) = (GetStringFunc("optsDebug",",,,%s,,,") a0) + /// Enable optimizations (Short form: -O) + /// (Originally from ..\FSComp.txt:857) + static member optsOptimize() = (GetStringFunc("optsOptimize",",,,") ) + /// Enable or disable tailcalls + /// (Originally from ..\FSComp.txt:858) + static member optsTailcalls() = (GetStringFunc("optsTailcalls",",,,") ) + /// Produce a deterministic assembly (including module version GUID and timestamp) + /// (Originally from ..\FSComp.txt:859) + static member optsDeterministic() = (GetStringFunc("optsDeterministic",",,,") ) + /// Enable or disable cross-module optimizations + /// (Originally from ..\FSComp.txt:860) + static member optsCrossoptimize() = (GetStringFunc("optsCrossoptimize",",,,") ) + /// Report all warnings as errors + /// (Originally from ..\FSComp.txt:861) + static member optsWarnaserrorPM() = (GetStringFunc("optsWarnaserrorPM",",,,") ) + /// Report specific warnings as errors + /// (Originally from ..\FSComp.txt:862) + static member optsWarnaserror() = (GetStringFunc("optsWarnaserror",",,,") ) + /// Set a warning level (0-5) + /// (Originally from ..\FSComp.txt:863) + static member optsWarn() = (GetStringFunc("optsWarn",",,,") ) + /// Disable specific warning messages + /// (Originally from ..\FSComp.txt:864) + static member optsNowarn() = (GetStringFunc("optsNowarn",",,,") ) + /// Enable specific warnings that may be off by default + /// (Originally from ..\FSComp.txt:865) + static member optsWarnOn() = (GetStringFunc("optsWarnOn",",,,") ) + /// Generate overflow checks + /// (Originally from ..\FSComp.txt:866) + static member optsChecked() = (GetStringFunc("optsChecked",",,,") ) + /// Define conditional compilation symbols (Short form: -d) + /// (Originally from ..\FSComp.txt:867) + static member optsDefine() = (GetStringFunc("optsDefine",",,,") ) + /// Ignore ML compatibility warnings + /// (Originally from ..\FSComp.txt:868) + static member optsMlcompatibility() = (GetStringFunc("optsMlcompatibility",",,,") ) + /// Suppress compiler copyright message + /// (Originally from ..\FSComp.txt:869) + static member optsNologo() = (GetStringFunc("optsNologo",",,,") ) + /// Display this usage message (Short form: -?) + /// (Originally from ..\FSComp.txt:870) + static member optsHelp() = (GetStringFunc("optsHelp",",,,") ) + /// Read response file for more options + /// (Originally from ..\FSComp.txt:871) + static member optsResponseFile() = (GetStringFunc("optsResponseFile",",,,") ) + /// Specify the codepage used to read source files + /// (Originally from ..\FSComp.txt:872) + static member optsCodepage() = (GetStringFunc("optsCodepage",",,,") ) + /// Output messages in UTF-8 encoding + /// (Originally from ..\FSComp.txt:873) + static member optsUtf8output() = (GetStringFunc("optsUtf8output",",,,") ) + /// Output messages with fully qualified paths + /// (Originally from ..\FSComp.txt:874) + static member optsFullpaths() = (GetStringFunc("optsFullpaths",",,,") ) + /// Specify a directory for the include path which is used to resolve source files and assemblies (Short form: -I) + /// (Originally from ..\FSComp.txt:875) + static member optsLib() = (GetStringFunc("optsLib",",,,") ) + /// Base address for the library to be built + /// (Originally from ..\FSComp.txt:876) + static member optsBaseaddress() = (GetStringFunc("optsBaseaddress",",,,") ) + /// Do not reference the default CLI assemblies by default + /// (Originally from ..\FSComp.txt:877) + static member optsNoframework() = (GetStringFunc("optsNoframework",",,,") ) + /// Statically link the F# library and all referenced DLLs that depend on it into the assembly being generated + /// (Originally from ..\FSComp.txt:878) + static member optsStandalone() = (GetStringFunc("optsStandalone",",,,") ) + /// Statically link the given assembly and all referenced DLLs that depend on this assembly. Use an assembly name e.g. mylib, not a DLL name. + /// (Originally from ..\FSComp.txt:879) + static member optsStaticlink() = (GetStringFunc("optsStaticlink",",,,") ) + /// Use a resident background compilation service to improve compiler startup times. + /// (Originally from ..\FSComp.txt:880) + static member optsResident() = (GetStringFunc("optsResident",",,,") ) + /// Name the output debug file + /// (Originally from ..\FSComp.txt:881) + static member optsPdb() = (GetStringFunc("optsPdb",",,,") ) + /// Resolve assembly references using directory-based rules rather than MSBuild resolution + /// (Originally from ..\FSComp.txt:882) + static member optsSimpleresolution() = (GetStringFunc("optsSimpleresolution",",,,") ) + /// Unrecognized target '%s', expected 'exe', 'winexe', 'library' or 'module' + /// (Originally from ..\FSComp.txt:883) + static member optsUnrecognizedTarget(a0 : System.String) = (1048, GetStringFunc("optsUnrecognizedTarget",",,,%s,,,") a0) + /// Unrecognized debug type '%s', expected 'pdbonly' or 'full' + /// (Originally from ..\FSComp.txt:884) + static member optsUnrecognizedDebugType(a0 : System.String) = (1049, GetStringFunc("optsUnrecognizedDebugType",",,,%s,,,") a0) + /// Invalid warning level '%d' + /// (Originally from ..\FSComp.txt:885) + static member optsInvalidWarningLevel(a0 : System.Int32) = (1050, GetStringFunc("optsInvalidWarningLevel",",,,%d,,,") a0) + /// Short form of '%s' + /// (Originally from ..\FSComp.txt:886) + static member optsShortFormOf(a0 : System.String) = (GetStringFunc("optsShortFormOf",",,,%s,,,") a0) + /// The command-line option '--cliroot' has been deprecated. Use an explicit reference to a specific copy of mscorlib.dll instead. + /// (Originally from ..\FSComp.txt:887) + static member optsClirootDeprecatedMsg() = (GetStringFunc("optsClirootDeprecatedMsg",",,,") ) + /// Use to override where the compiler looks for mscorlib.dll and framework components + /// (Originally from ..\FSComp.txt:888) + static member optsClirootDescription() = (GetStringFunc("optsClirootDescription",",,,") ) + /// - OUTPUT FILES - + /// (Originally from ..\FSComp.txt:889) + static member optsHelpBannerOutputFiles() = (GetStringFunc("optsHelpBannerOutputFiles",",,,") ) + /// - INPUT FILES - + /// (Originally from ..\FSComp.txt:890) + static member optsHelpBannerInputFiles() = (GetStringFunc("optsHelpBannerInputFiles",",,,") ) + /// - RESOURCES - + /// (Originally from ..\FSComp.txt:891) + static member optsHelpBannerResources() = (GetStringFunc("optsHelpBannerResources",",,,") ) + /// - CODE GENERATION - + /// (Originally from ..\FSComp.txt:892) + static member optsHelpBannerCodeGen() = (GetStringFunc("optsHelpBannerCodeGen",",,,") ) + /// - ADVANCED - + /// (Originally from ..\FSComp.txt:893) + static member optsHelpBannerAdvanced() = (GetStringFunc("optsHelpBannerAdvanced",",,,") ) + /// - MISCELLANEOUS - + /// (Originally from ..\FSComp.txt:894) + static member optsHelpBannerMisc() = (GetStringFunc("optsHelpBannerMisc",",,,") ) + /// - LANGUAGE - + /// (Originally from ..\FSComp.txt:895) + static member optsHelpBannerLanguage() = (GetStringFunc("optsHelpBannerLanguage",",,,") ) + /// - ERRORS AND WARNINGS - + /// (Originally from ..\FSComp.txt:896) + static member optsHelpBannerErrsAndWarns() = (GetStringFunc("optsHelpBannerErrsAndWarns",",,,") ) + /// Unknown --test argument: '%s' + /// (Originally from ..\FSComp.txt:897) + static member optsUnknownArgumentToTheTestSwitch(a0 : System.String) = (1063, GetStringFunc("optsUnknownArgumentToTheTestSwitch",",,,%s,,,") a0) + /// Unrecognized platform '%s', valid values are 'x86', 'x64', 'Itanium', 'anycpu32bitpreferred', and 'anycpu' + /// (Originally from ..\FSComp.txt:898) + static member optsUnknownPlatform(a0 : System.String) = (1064, GetStringFunc("optsUnknownPlatform",",,,%s,,,") a0) + /// The command-line option '%s' is for test purposes only + /// (Originally from ..\FSComp.txt:899) + static member optsInternalNoDescription(a0 : System.String) = (GetStringFunc("optsInternalNoDescription",",,,%s,,,") a0) + /// The command-line option '%s' has been deprecated + /// (Originally from ..\FSComp.txt:900) + static member optsDCLONoDescription(a0 : System.String) = (GetStringFunc("optsDCLONoDescription",",,,%s,,,") a0) + /// The command-line option '%s' has been deprecated. Use '%s' instead. + /// (Originally from ..\FSComp.txt:901) + static member optsDCLODeprecatedSuggestAlternative(a0 : System.String, a1 : System.String) = (GetStringFunc("optsDCLODeprecatedSuggestAlternative",",,,%s,,,%s,,,") a0 a1) + /// The command-line option '%s' has been deprecated. HTML document generation is now part of the F# Power Pack, via the tool FsHtmlDoc.exe. + /// (Originally from ..\FSComp.txt:902) + static member optsDCLOHtmlDoc(a0 : System.String) = (GetStringFunc("optsDCLOHtmlDoc",",,,%s,,,") a0) + /// Output warning and error messages in color + /// (Originally from ..\FSComp.txt:903) + static member optsConsoleColors() = (GetStringFunc("optsConsoleColors",",,,") ) + /// Enable high-entropy ASLR + /// (Originally from ..\FSComp.txt:904) + static member optsUseHighEntropyVA() = (GetStringFunc("optsUseHighEntropyVA",",,,") ) + /// Specify subsystem version of this assembly + /// (Originally from ..\FSComp.txt:905) + static member optsSubSystemVersion() = (GetStringFunc("optsSubSystemVersion",",,,") ) + /// Specify target framework profile of this assembly. Valid values are mscorlib, netcore or netstandard. Default - mscorlib + /// (Originally from ..\FSComp.txt:906) + static member optsTargetProfile() = (GetStringFunc("optsTargetProfile",",,,") ) + /// Emit debug information in quotations + /// (Originally from ..\FSComp.txt:907) + static member optsEmitDebugInfoInQuotations() = (GetStringFunc("optsEmitDebugInfoInQuotations",",,,") ) + /// Specify the preferred output language culture name (e.g. es-ES, ja-JP) + /// (Originally from ..\FSComp.txt:908) + static member optsPreferredUiLang() = (GetStringFunc("optsPreferredUiLang",",,,") ) + /// Don't copy FSharp.Core.dll along the produced binaries + /// (Originally from ..\FSComp.txt:909) + static member optsNoCopyFsharpCore() = (GetStringFunc("optsNoCopyFsharpCore",",,,") ) + /// Invalid version '%s' for '--subsystemversion'. The version must be 4.00 or greater. + /// (Originally from ..\FSComp.txt:910) + static member optsInvalidSubSystemVersion(a0 : System.String) = (1051, GetStringFunc("optsInvalidSubSystemVersion",",,,%s,,,") a0) + /// Invalid value '%s' for '--targetprofile', valid values are 'mscorlib', 'netcore' or 'netstandard'. + /// (Originally from ..\FSComp.txt:911) + static member optsInvalidTargetProfile(a0 : System.String) = (1052, GetStringFunc("optsInvalidTargetProfile",",,,%s,,,") a0) + /// Full name + /// (Originally from ..\FSComp.txt:912) + static member typeInfoFullName() = (GetStringFunc("typeInfoFullName",",,,") ) + /// and %d other overloads + /// (Originally from ..\FSComp.txt:916) + static member typeInfoOtherOverloads(a0 : System.Int32) = (GetStringFunc("typeInfoOtherOverloads",",,,%d,,,") a0) + /// union case + /// (Originally from ..\FSComp.txt:917) + static member typeInfoUnionCase() = (GetStringFunc("typeInfoUnionCase",",,,") ) + /// active pattern result + /// (Originally from ..\FSComp.txt:918) + static member typeInfoActivePatternResult() = (GetStringFunc("typeInfoActivePatternResult",",,,") ) + /// active recognizer + /// (Originally from ..\FSComp.txt:919) + static member typeInfoActiveRecognizer() = (GetStringFunc("typeInfoActiveRecognizer",",,,") ) + /// field + /// (Originally from ..\FSComp.txt:920) + static member typeInfoField() = (GetStringFunc("typeInfoField",",,,") ) + /// event + /// (Originally from ..\FSComp.txt:921) + static member typeInfoEvent() = (GetStringFunc("typeInfoEvent",",,,") ) + /// property + /// (Originally from ..\FSComp.txt:922) + static member typeInfoProperty() = (GetStringFunc("typeInfoProperty",",,,") ) + /// extension + /// (Originally from ..\FSComp.txt:923) + static member typeInfoExtension() = (GetStringFunc("typeInfoExtension",",,,") ) + /// custom operation + /// (Originally from ..\FSComp.txt:924) + static member typeInfoCustomOperation() = (GetStringFunc("typeInfoCustomOperation",",,,") ) + /// argument + /// (Originally from ..\FSComp.txt:925) + static member typeInfoArgument() = (GetStringFunc("typeInfoArgument",",,,") ) + /// patvar + /// (Originally from ..\FSComp.txt:926) + static member typeInfoPatternVariable() = (GetStringFunc("typeInfoPatternVariable",",,,") ) + /// namespace + /// (Originally from ..\FSComp.txt:927) + static member typeInfoNamespace() = (GetStringFunc("typeInfoNamespace",",,,") ) + /// module + /// (Originally from ..\FSComp.txt:928) + static member typeInfoModule() = (GetStringFunc("typeInfoModule",",,,") ) + /// namespace/module + /// (Originally from ..\FSComp.txt:929) + static member typeInfoNamespaceOrModule() = (GetStringFunc("typeInfoNamespaceOrModule",",,,") ) + /// from %s + /// (Originally from ..\FSComp.txt:930) + static member typeInfoFromFirst(a0 : System.String) = (GetStringFunc("typeInfoFromFirst",",,,%s,,,") a0) + /// also from %s + /// (Originally from ..\FSComp.txt:931) + static member typeInfoFromNext(a0 : System.String) = (GetStringFunc("typeInfoFromNext",",,,%s,,,") a0) + /// generated property + /// (Originally from ..\FSComp.txt:932) + static member typeInfoGeneratedProperty() = (GetStringFunc("typeInfoGeneratedProperty",",,,") ) + /// generated type + /// (Originally from ..\FSComp.txt:933) + static member typeInfoGeneratedType() = (GetStringFunc("typeInfoGeneratedType",",,,") ) + /// Found by AssemblyFolders registry key + /// (Originally from ..\FSComp.txt:934) + static member assemblyResolutionFoundByAssemblyFoldersKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersKey",",,,") ) + /// Found by AssemblyFoldersEx registry key + /// (Originally from ..\FSComp.txt:935) + static member assemblyResolutionFoundByAssemblyFoldersExKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersExKey",",,,") ) + /// .NET Framework + /// (Originally from ..\FSComp.txt:936) + static member assemblyResolutionNetFramework() = (GetStringFunc("assemblyResolutionNetFramework",",,,") ) + /// Global Assembly Cache + /// (Originally from ..\FSComp.txt:937) + static member assemblyResolutionGAC() = (GetStringFunc("assemblyResolutionGAC",",,,") ) + /// Recursive class hierarchy in type '%s' + /// (Originally from ..\FSComp.txt:938) + static member recursiveClassHierarchy(a0 : System.String) = (1089, GetStringFunc("recursiveClassHierarchy",",,,%s,,,") a0) + /// Invalid recursive reference to an abstract slot + /// (Originally from ..\FSComp.txt:939) + static member InvalidRecursiveReferenceToAbstractSlot() = (1090, GetStringFunc("InvalidRecursiveReferenceToAbstractSlot",",,,") ) + /// The event '%s' has a non-standard type. If this event is declared in another CLI language, you may need to access this event using the explicit %s and %s methods for the event. If this event is declared in F#, make the type of the event an instantiation of either 'IDelegateEvent<_>' or 'IEvent<_,_>'. + /// (Originally from ..\FSComp.txt:940) + static member eventHasNonStandardType(a0 : System.String, a1 : System.String, a2 : System.String) = (1091, GetStringFunc("eventHasNonStandardType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The type '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:941) + static member typeIsNotAccessible(a0 : System.String) = (1092, GetStringFunc("typeIsNotAccessible",",,,%s,,,") a0) + /// The union cases or fields of the type '%s' are not accessible from this code location + /// (Originally from ..\FSComp.txt:942) + static member unionCasesAreNotAccessible(a0 : System.String) = (1093, GetStringFunc("unionCasesAreNotAccessible",",,,%s,,,") a0) + /// The value '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:943) + static member valueIsNotAccessible(a0 : System.String) = (1094, GetStringFunc("valueIsNotAccessible",",,,%s,,,") a0) + /// The union case '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:944) + static member unionCaseIsNotAccessible(a0 : System.String) = (1095, GetStringFunc("unionCaseIsNotAccessible",",,,%s,,,") a0) + /// The record, struct or class field '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:945) + static member fieldIsNotAccessible(a0 : System.String) = (1096, GetStringFunc("fieldIsNotAccessible",",,,%s,,,") a0) + /// The struct or class field '%s' is not accessible from this code location + /// (Originally from ..\FSComp.txt:946) + static member structOrClassFieldIsNotAccessible(a0 : System.String) = (1097, GetStringFunc("structOrClassFieldIsNotAccessible",",,,%s,,,") a0) + /// This construct is experimental + /// (Originally from ..\FSComp.txt:947) + static member experimentalConstruct() = (GetStringFunc("experimentalConstruct",",,,") ) + /// No Invoke methods found for delegate type + /// (Originally from ..\FSComp.txt:948) + static member noInvokeMethodsFound() = (1099, GetStringFunc("noInvokeMethodsFound",",,,") ) + /// More than one Invoke method found for delegate type + /// (Originally from ..\FSComp.txt:949) + static member moreThanOneInvokeMethodFound() = (GetStringFunc("moreThanOneInvokeMethodFound",",,,") ) + /// Delegates are not allowed to have curried signatures + /// (Originally from ..\FSComp.txt:950) + static member delegatesNotAllowedToHaveCurriedSignatures() = (1101, GetStringFunc("delegatesNotAllowedToHaveCurriedSignatures",",,,") ) + /// Unexpected Expr.TyChoose + /// (Originally from ..\FSComp.txt:951) + static member tlrUnexpectedTExpr() = (1102, GetStringFunc("tlrUnexpectedTExpr",",,,") ) + /// Note: Lambda-lifting optimizations have not been applied because of the use of this local constrained generic function as a first class value. Adding type constraints may resolve this condition. + /// (Originally from ..\FSComp.txt:952) + static member tlrLambdaLiftingOptimizationsNotApplied() = (1103, GetStringFunc("tlrLambdaLiftingOptimizationsNotApplied",",,,") ) + /// Identifiers containing '@' are reserved for use in F# code generation + /// (Originally from ..\FSComp.txt:953) + static member lexhlpIdentifiersContainingAtSymbolReserved() = (1104, GetStringFunc("lexhlpIdentifiersContainingAtSymbolReserved",",,,") ) + /// The identifier '%s' is reserved for future use by F# + /// (Originally from ..\FSComp.txt:954) + static member lexhlpIdentifierReserved(a0 : System.String) = (GetStringFunc("lexhlpIdentifierReserved",",,,%s,,,") a0) + /// Missing variable '%s' + /// (Originally from ..\FSComp.txt:955) + static member patcMissingVariable(a0 : System.String) = (1106, GetStringFunc("patcMissingVariable",",,,%s,,,") a0) + /// Partial active patterns may only generate one result + /// (Originally from ..\FSComp.txt:956) + static member patcPartialActivePatternsGenerateOneResult() = (1107, GetStringFunc("patcPartialActivePatternsGenerateOneResult",",,,") ) + /// The type '%s' is required here and is unavailable. You must add a reference to assembly '%s'. + /// (Originally from ..\FSComp.txt:957) + static member impTypeRequiredUnavailable(a0 : System.String, a1 : System.String) = (1108, GetStringFunc("impTypeRequiredUnavailable",",,,%s,,,%s,,,") a0 a1) + /// A reference to the type '%s' in assembly '%s' was found, but the type could not be found in that assembly + /// (Originally from ..\FSComp.txt:958) + static member impReferencedTypeCouldNotBeFoundInAssembly(a0 : System.String, a1 : System.String) = (1109, GetStringFunc("impReferencedTypeCouldNotBeFoundInAssembly",",,,%s,,,%s,,,") a0 a1) + /// Internal error or badly formed metadata: not enough type parameters were in scope while importing + /// (Originally from ..\FSComp.txt:959) + static member impNotEnoughTypeParamsInScopeWhileImporting() = (1110, GetStringFunc("impNotEnoughTypeParamsInScopeWhileImporting",",,,") ) + /// A reference to the DLL %s is required by assembly %s. The imported type %s is located in the first assembly and could not be resolved. + /// (Originally from ..\FSComp.txt:960) + static member impReferenceToDllRequiredByAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (1111, GetStringFunc("impReferenceToDllRequiredByAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// An imported assembly uses the type '%s' but that type is not public + /// (Originally from ..\FSComp.txt:961) + static member impImportedAssemblyUsesNotPublicType(a0 : System.String) = (1112, GetStringFunc("impImportedAssemblyUsesNotPublicType",",,,%s,,,") a0) + /// The value '%s' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible + /// (Originally from ..\FSComp.txt:962) + static member optValueMarkedInlineButIncomplete(a0 : System.String) = (1113, GetStringFunc("optValueMarkedInlineButIncomplete",",,,%s,,,") a0) + /// The value '%s' was marked inline but was not bound in the optimization environment + /// (Originally from ..\FSComp.txt:963) + static member optValueMarkedInlineButWasNotBoundInTheOptEnv(a0 : System.String) = (1114, GetStringFunc("optValueMarkedInlineButWasNotBoundInTheOptEnv",",,,%s,,,") a0) + /// Local value %s not found during optimization + /// (Originally from ..\FSComp.txt:964) + static member optLocalValueNotFoundDuringOptimization(a0 : System.String) = (1115, GetStringFunc("optLocalValueNotFoundDuringOptimization",",,,%s,,,") a0) + /// A value marked as 'inline' has an unexpected value + /// (Originally from ..\FSComp.txt:965) + static member optValueMarkedInlineHasUnexpectedValue() = (1116, GetStringFunc("optValueMarkedInlineHasUnexpectedValue",",,,") ) + /// A value marked as 'inline' could not be inlined + /// (Originally from ..\FSComp.txt:966) + static member optValueMarkedInlineCouldNotBeInlined() = (1117, GetStringFunc("optValueMarkedInlineCouldNotBeInlined",",,,") ) + /// Failed to inline the value '%s' marked 'inline', perhaps because a recursive value was marked 'inline' + /// (Originally from ..\FSComp.txt:967) + static member optFailedToInlineValue(a0 : System.String) = (1118, GetStringFunc("optFailedToInlineValue",",,,%s,,,") a0) + /// Recursive ValValue %s + /// (Originally from ..\FSComp.txt:968) + static member optRecursiveValValue(a0 : System.String) = (1119, GetStringFunc("optRecursiveValValue",",,,%s,,,") a0) + /// The indentation of this 'in' token is incorrect with respect to the corresponding 'let' + /// (Originally from ..\FSComp.txt:969) + static member lexfltIncorrentIndentationOfIn() = (GetStringFunc("lexfltIncorrentIndentationOfIn",",,,") ) + /// Possible incorrect indentation: this token is offside of context started at position %s. Try indenting this token further or using standard formatting conventions. + /// (Originally from ..\FSComp.txt:970) + static member lexfltTokenIsOffsideOfContextStartedEarlier(a0 : System.String) = (GetStringFunc("lexfltTokenIsOffsideOfContextStartedEarlier",",,,%s,,,") a0) + /// The '|' tokens separating rules of this pattern match are misaligned by one column. Consider realigning your code or using further indentation. + /// (Originally from ..\FSComp.txt:971) + static member lexfltSeparatorTokensOfPatternMatchMisaligned() = (GetStringFunc("lexfltSeparatorTokensOfPatternMatchMisaligned",",,,") ) + /// Invalid module/expression/type + /// (Originally from ..\FSComp.txt:972) + static member nrInvalidModuleExprType() = (1123, GetStringFunc("nrInvalidModuleExprType",",,,") ) + /// Multiple types exist called '%s', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. '%s'. + /// (Originally from ..\FSComp.txt:973) + static member nrTypeInstantiationNeededToDisambiguateTypesWithSameName(a0 : System.String, a1 : System.String) = (1124, GetStringFunc("nrTypeInstantiationNeededToDisambiguateTypesWithSameName",",,,%s,,,%s,,,") a0 a1) + /// The instantiation of the generic type '%s' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. '%s'. + /// (Originally from ..\FSComp.txt:974) + static member nrTypeInstantiationIsMissingAndCouldNotBeInferred(a0 : System.String, a1 : System.String) = (1125, GetStringFunc("nrTypeInstantiationIsMissingAndCouldNotBeInferred",",,,%s,,,%s,,,") a0 a1) + /// 'global' may only be used as the first name in a qualified path + /// (Originally from ..\FSComp.txt:975) + static member nrGlobalUsedOnlyAsFirstName() = (1126, GetStringFunc("nrGlobalUsedOnlyAsFirstName",",,,") ) + /// This is not a constructor or literal, or a constructor is being used incorrectly + /// (Originally from ..\FSComp.txt:976) + static member nrIsNotConstructorOrLiteral() = (1127, GetStringFunc("nrIsNotConstructorOrLiteral",",,,") ) + /// Unexpected empty long identifier + /// (Originally from ..\FSComp.txt:977) + static member nrUnexpectedEmptyLongId() = (1128, GetStringFunc("nrUnexpectedEmptyLongId",",,,") ) + /// The record type '%s' does not contain a label '%s'. + /// (Originally from ..\FSComp.txt:978) + static member nrRecordDoesNotContainSuchLabel(a0 : System.String, a1 : System.String) = (1129, GetStringFunc("nrRecordDoesNotContainSuchLabel",",,,%s,,,%s,,,") a0 a1) + /// Invalid field label + /// (Originally from ..\FSComp.txt:979) + static member nrInvalidFieldLabel() = (1130, GetStringFunc("nrInvalidFieldLabel",",,,") ) + /// Invalid expression '%s' + /// (Originally from ..\FSComp.txt:980) + static member nrInvalidExpression(a0 : System.String) = (1132, GetStringFunc("nrInvalidExpression",",,,%s,,,") a0) + /// No constructors are available for the type '%s' + /// (Originally from ..\FSComp.txt:981) + static member nrNoConstructorsAvailableForType(a0 : System.String) = (1133, GetStringFunc("nrNoConstructorsAvailableForType",",,,%s,,,") a0) + /// The union type for union case '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the union type ('%s') in the name you are using. + /// (Originally from ..\FSComp.txt:982) + static member nrUnionTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1134, GetStringFunc("nrUnionTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) + /// The record type for the record field '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the record type ('%s') in the name you are using. + /// (Originally from ..\FSComp.txt:983) + static member nrRecordTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1135, GetStringFunc("nrRecordTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) + /// Unexpected error creating debug information file '%s' + /// (Originally from ..\FSComp.txt:984) + static member ilwriteErrorCreatingPdb(a0 : System.String) = (1136, GetStringFunc("ilwriteErrorCreatingPdb",",,,%s,,,") a0) + /// This number is outside the allowable range for this integer type + /// (Originally from ..\FSComp.txt:985) + static member lexOutsideIntegerRange() = (1138, GetStringFunc("lexOutsideIntegerRange",",,,") ) + /// '%s' is not permitted as a character in operator names and is reserved for future use + /// (Originally from ..\FSComp.txt:989) + static member lexCharNotAllowedInOperatorNames(a0 : System.String) = (GetStringFunc("lexCharNotAllowedInOperatorNames",",,,%s,,,") a0) + /// Unexpected character '%s' + /// (Originally from ..\FSComp.txt:990) + static member lexUnexpectedChar(a0 : System.String) = (GetStringFunc("lexUnexpectedChar",",,,%s,,,") a0) + /// This byte array literal contains characters that do not encode as a single byte + /// (Originally from ..\FSComp.txt:991) + static member lexByteArrayCannotEncode() = (1140, GetStringFunc("lexByteArrayCannotEncode",",,,") ) + /// Identifiers followed by '%s' are reserved for future use + /// (Originally from ..\FSComp.txt:992) + static member lexIdentEndInMarkReserved(a0 : System.String) = (1141, GetStringFunc("lexIdentEndInMarkReserved",",,,%s,,,") a0) + /// This number is outside the allowable range for 8-bit signed integers + /// (Originally from ..\FSComp.txt:993) + static member lexOutsideEightBitSigned() = (1142, GetStringFunc("lexOutsideEightBitSigned",",,,") ) + /// This number is outside the allowable range for hexadecimal 8-bit signed integers + /// (Originally from ..\FSComp.txt:994) + static member lexOutsideEightBitSignedHex() = (1143, GetStringFunc("lexOutsideEightBitSignedHex",",,,") ) + /// This number is outside the allowable range for 8-bit unsigned integers + /// (Originally from ..\FSComp.txt:995) + static member lexOutsideEightBitUnsigned() = (1144, GetStringFunc("lexOutsideEightBitUnsigned",",,,") ) + /// This number is outside the allowable range for 16-bit signed integers + /// (Originally from ..\FSComp.txt:996) + static member lexOutsideSixteenBitSigned() = (1145, GetStringFunc("lexOutsideSixteenBitSigned",",,,") ) + /// This number is outside the allowable range for 16-bit unsigned integers + /// (Originally from ..\FSComp.txt:997) + static member lexOutsideSixteenBitUnsigned() = (1146, GetStringFunc("lexOutsideSixteenBitUnsigned",",,,") ) + /// This number is outside the allowable range for 32-bit signed integers + /// (Originally from ..\FSComp.txt:998) + static member lexOutsideThirtyTwoBitSigned() = (1147, GetStringFunc("lexOutsideThirtyTwoBitSigned",",,,") ) + /// This number is outside the allowable range for 32-bit unsigned integers + /// (Originally from ..\FSComp.txt:999) + static member lexOutsideThirtyTwoBitUnsigned() = (1148, GetStringFunc("lexOutsideThirtyTwoBitUnsigned",",,,") ) + /// This number is outside the allowable range for 64-bit signed integers + /// (Originally from ..\FSComp.txt:1000) + static member lexOutsideSixtyFourBitSigned() = (1149, GetStringFunc("lexOutsideSixtyFourBitSigned",",,,") ) + /// This number is outside the allowable range for 64-bit unsigned integers + /// (Originally from ..\FSComp.txt:1001) + static member lexOutsideSixtyFourBitUnsigned() = (1150, GetStringFunc("lexOutsideSixtyFourBitUnsigned",",,,") ) + /// This number is outside the allowable range for signed native integers + /// (Originally from ..\FSComp.txt:1002) + static member lexOutsideNativeSigned() = (1151, GetStringFunc("lexOutsideNativeSigned",",,,") ) + /// This number is outside the allowable range for unsigned native integers + /// (Originally from ..\FSComp.txt:1003) + static member lexOutsideNativeUnsigned() = (1152, GetStringFunc("lexOutsideNativeUnsigned",",,,") ) + /// Invalid floating point number + /// (Originally from ..\FSComp.txt:1004) + static member lexInvalidFloat() = (1153, GetStringFunc("lexInvalidFloat",",,,") ) + /// This number is outside the allowable range for decimal literals + /// (Originally from ..\FSComp.txt:1005) + static member lexOusideDecimal() = (1154, GetStringFunc("lexOusideDecimal",",,,") ) + /// This number is outside the allowable range for 32-bit floats + /// (Originally from ..\FSComp.txt:1006) + static member lexOusideThirtyTwoBitFloat() = (1155, GetStringFunc("lexOusideThirtyTwoBitFloat",",,,") ) + /// This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). + /// (Originally from ..\FSComp.txt:1007) + static member lexInvalidNumericLiteral() = (1156, GetStringFunc("lexInvalidNumericLiteral",",,,") ) + /// This is not a valid byte literal + /// (Originally from ..\FSComp.txt:1008) + static member lexInvalidByteLiteral() = (1157, GetStringFunc("lexInvalidByteLiteral",",,,") ) + /// This is not a valid character literal + /// (Originally from ..\FSComp.txt:1009) + static member lexInvalidCharLiteral() = (1158, GetStringFunc("lexInvalidCharLiteral",",,,") ) + /// This Unicode encoding is only valid in string literals + /// (Originally from ..\FSComp.txt:1010) + static member lexThisUnicodeOnlyInStringLiterals() = (1159, GetStringFunc("lexThisUnicodeOnlyInStringLiterals",",,,") ) + /// This token is reserved for future use + /// (Originally from ..\FSComp.txt:1011) + static member lexTokenReserved() = (1160, GetStringFunc("lexTokenReserved",",,,") ) + /// TABs are not allowed in F# code unless the #indent \"off\" option is used + /// (Originally from ..\FSComp.txt:1012) + static member lexTabsNotAllowed() = (1161, GetStringFunc("lexTabsNotAllowed",",,,") ) + /// Invalid line number: '%s' + /// (Originally from ..\FSComp.txt:1013) + static member lexInvalidLineNumber(a0 : System.String) = (1162, GetStringFunc("lexInvalidLineNumber",",,,%s,,,") a0) + /// #if directive must appear as the first non-whitespace character on a line + /// (Originally from ..\FSComp.txt:1014) + static member lexHashIfMustBeFirst() = (1163, GetStringFunc("lexHashIfMustBeFirst",",,,") ) + /// #else has no matching #if + /// (Originally from ..\FSComp.txt:1015) + static member lexHashElseNoMatchingIf() = (GetStringFunc("lexHashElseNoMatchingIf",",,,") ) + /// #endif required for #else + /// (Originally from ..\FSComp.txt:1016) + static member lexHashEndifRequiredForElse() = (GetStringFunc("lexHashEndifRequiredForElse",",,,") ) + /// #else directive must appear as the first non-whitespace character on a line + /// (Originally from ..\FSComp.txt:1017) + static member lexHashElseMustBeFirst() = (1166, GetStringFunc("lexHashElseMustBeFirst",",,,") ) + /// #endif has no matching #if + /// (Originally from ..\FSComp.txt:1018) + static member lexHashEndingNoMatchingIf() = (GetStringFunc("lexHashEndingNoMatchingIf",",,,") ) + /// #endif directive must appear as the first non-whitespace character on a line + /// (Originally from ..\FSComp.txt:1019) + static member lexHashEndifMustBeFirst() = (1168, GetStringFunc("lexHashEndifMustBeFirst",",,,") ) + /// #if directive should be immediately followed by an identifier + /// (Originally from ..\FSComp.txt:1020) + static member lexHashIfMustHaveIdent() = (1169, GetStringFunc("lexHashIfMustHaveIdent",",,,") ) + /// Syntax error. Wrong nested #endif, unexpected tokens before it. + /// (Originally from ..\FSComp.txt:1021) + static member lexWrongNestedHashEndif() = (1170, GetStringFunc("lexWrongNestedHashEndif",",,,") ) + /// #! may only appear as the first line at the start of a file. + /// (Originally from ..\FSComp.txt:1022) + static member lexHashBangMustBeFirstInFile() = (GetStringFunc("lexHashBangMustBeFirstInFile",",,,") ) + /// Expected single line comment or end of line + /// (Originally from ..\FSComp.txt:1023) + static member pplexExpectedSingleLineComment() = (1171, GetStringFunc("pplexExpectedSingleLineComment",",,,") ) + /// Infix operator member '%s' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + /// (Originally from ..\FSComp.txt:1024) + static member memberOperatorDefinitionWithNoArguments(a0 : System.String) = (1172, GetStringFunc("memberOperatorDefinitionWithNoArguments",",,,%s,,,") a0) + /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + /// (Originally from ..\FSComp.txt:1025) + static member memberOperatorDefinitionWithNonPairArgument(a0 : System.String, a1 : System.Int32) = (1173, GetStringFunc("memberOperatorDefinitionWithNonPairArgument",",,,%s,,,%d,,,") a0 a1) + /// Infix operator member '%s' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + /// (Originally from ..\FSComp.txt:1026) + static member memberOperatorDefinitionWithCurriedArguments(a0 : System.String) = (1174, GetStringFunc("memberOperatorDefinitionWithCurriedArguments",",,,%s,,,") a0) + /// All record, union and struct types in FSharp.Core.dll must be explicitly labelled with 'StructuralComparison' or 'NoComparison' + /// (Originally from ..\FSComp.txt:1027) + static member tcFSharpCoreRequiresExplicit() = (1175, GetStringFunc("tcFSharpCoreRequiresExplicit",",,,") ) + /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the type parameter '%s' does not satisfy the 'comparison' constraint. Consider adding the 'comparison' constraint to the type parameter + /// (Originally from ..\FSComp.txt:1028) + static member tcStructuralComparisonNotSatisfied1(a0 : System.String, a1 : System.String) = (1176, GetStringFunc("tcStructuralComparisonNotSatisfied1",",,,%s,,,%s,,,") a0 a1) + /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the component type '%s' does not satisfy the 'comparison' constraint + /// (Originally from ..\FSComp.txt:1029) + static member tcStructuralComparisonNotSatisfied2(a0 : System.String, a1 : System.String) = (1177, GetStringFunc("tcStructuralComparisonNotSatisfied2",",,,%s,,,%s,,,") a0 a1) + /// The struct, record or union type '%s' is not structurally comparable because the type parameter %s does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable + /// (Originally from ..\FSComp.txt:1030) + static member tcNoComparisonNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The struct, record or union type '%s' is not structurally comparable because the type '%s' does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable + /// (Originally from ..\FSComp.txt:1031) + static member tcNoComparisonNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The struct, record or union type '%s' does not support structural equality because the type parameter %s does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality + /// (Originally from ..\FSComp.txt:1032) + static member tcNoEqualityNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The struct, record or union type '%s' does not support structural equality because the type '%s' does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality + /// (Originally from ..\FSComp.txt:1033) + static member tcNoEqualityNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the type parameter '%s' does not satisfy the 'equality' constraint. Consider adding the 'equality' constraint to the type parameter + /// (Originally from ..\FSComp.txt:1034) + static member tcStructuralEqualityNotSatisfied1(a0 : System.String, a1 : System.String) = (1179, GetStringFunc("tcStructuralEqualityNotSatisfied1",",,,%s,,,%s,,,") a0 a1) + /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the component type '%s' does not satisfy the 'equality' constraint + /// (Originally from ..\FSComp.txt:1035) + static member tcStructuralEqualityNotSatisfied2(a0 : System.String, a1 : System.String) = (1180, GetStringFunc("tcStructuralEqualityNotSatisfied2",",,,%s,,,%s,,,") a0 a1) + /// Each argument of the primary constructor for a struct must be given a type, for example 'type S(x1:int, x2: int) = ...'. These arguments determine the fields of the struct. + /// (Originally from ..\FSComp.txt:1036) + static member tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly() = (1181, GetStringFunc("tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly",",,,") ) + /// The value '%s' is unused + /// (Originally from ..\FSComp.txt:1037) + static member chkUnusedValue(a0 : System.String) = (1182, GetStringFunc("chkUnusedValue",",,,%s,,,") a0) + /// The recursive object reference '%s' is unused. The presence of a recursive object reference adds runtime initialization checks to members in this and derived types. Consider removing this recursive object reference. + /// (Originally from ..\FSComp.txt:1038) + static member chkUnusedThisVariable(a0 : System.String) = (1183, GetStringFunc("chkUnusedThisVariable",",,,%s,,,") a0) + /// A getter property may have at most one argument group + /// (Originally from ..\FSComp.txt:1039) + static member parsGetterAtMostOneArgument() = (1184, GetStringFunc("parsGetterAtMostOneArgument",",,,") ) + /// A setter property may have at most two argument groups + /// (Originally from ..\FSComp.txt:1040) + static member parsSetterAtMostTwoArguments() = (1185, GetStringFunc("parsSetterAtMostTwoArguments",",,,") ) + /// Invalid property getter or setter + /// (Originally from ..\FSComp.txt:1041) + static member parsInvalidProperty() = (1186, GetStringFunc("parsInvalidProperty",",,,") ) + /// An indexer property must be given at least one argument + /// (Originally from ..\FSComp.txt:1042) + static member parsIndexerPropertyRequiresAtLeastOneArgument() = (1187, GetStringFunc("parsIndexerPropertyRequiresAtLeastOneArgument",",,,") ) + /// This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation + /// (Originally from ..\FSComp.txt:1043) + static member tastInvalidAddressOfMutableAcrossAssemblyBoundary() = (1188, GetStringFunc("tastInvalidAddressOfMutableAcrossAssemblyBoundary",",,,") ) + /// Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" + /// (Originally from ..\FSComp.txt:1044) + static member parsNonAdjacentTypars() = (1189, GetStringFunc("parsNonAdjacentTypars",",,,") ) + /// Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" + /// (Originally from ..\FSComp.txt:1045) + static member parsNonAdjacentTyargs() = (1190, GetStringFunc("parsNonAdjacentTyargs",",,,") ) + /// The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C' + /// (Originally from ..\FSComp.txt:1046) + static member parsNonAtomicType() = (GetStringFunc("parsNonAtomicType",",,,") ) + /// The module/namespace '%s' from compilation unit '%s' did not contain the module/namespace '%s' + /// (Originally from ..\FSComp.txt:1049) + static member tastUndefinedItemRefModuleNamespace(a0 : System.String, a1 : System.String, a2 : System.String) = (1193, GetStringFunc("tastUndefinedItemRefModuleNamespace",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The module/namespace '%s' from compilation unit '%s' did not contain the val '%s' + /// (Originally from ..\FSComp.txt:1050) + static member tastUndefinedItemRefVal(a0 : System.String, a1 : System.String, a2 : System.String) = (1194, GetStringFunc("tastUndefinedItemRefVal",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The module/namespace '%s' from compilation unit '%s' did not contain the namespace, module or type '%s' + /// (Originally from ..\FSComp.txt:1051) + static member tastUndefinedItemRefModuleNamespaceType(a0 : System.String, a1 : System.String, a2 : System.String) = (1195, GetStringFunc("tastUndefinedItemRefModuleNamespaceType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The 'UseNullAsTrueValue' attribute flag may only be used with union types that have one nullary case and at least one non-nullary case + /// (Originally from ..\FSComp.txt:1052) + static member tcInvalidUseNullAsTrueValue() = (1196, GetStringFunc("tcInvalidUseNullAsTrueValue",",,,") ) + /// The parameter '%s' was inferred to have byref type. Parameters of byref type must be given an explicit type annotation, e.g. 'x1: byref'. When used, a byref parameter is implicitly dereferenced. + /// (Originally from ..\FSComp.txt:1053) + static member tcParameterInferredByref(a0 : System.String) = (1197, GetStringFunc("tcParameterInferredByref",",,,%s,,,") a0) + /// The generic member '%s' has been used at a non-uniform instantiation prior to this program point. Consider reordering the members so this member occurs first. Alternatively, specify the full type of the member explicitly, including argument types, return type and any additional generic parameters and constraints. + /// (Originally from ..\FSComp.txt:1054) + static member tcNonUniformMemberUse(a0 : System.String) = (1198, GetStringFunc("tcNonUniformMemberUse",",,,%s,,,") a0) + /// The attribute '%s' appears in both the implementation and the signature, but the attribute arguments differ. Only the attribute from the signature will be included in the compiled code. + /// (Originally from ..\FSComp.txt:1055) + static member tcAttribArgsDiffer(a0 : System.String) = (1200, GetStringFunc("tcAttribArgsDiffer",",,,%s,,,") a0) + /// Cannot call an abstract base member: '%s' + /// (Originally from ..\FSComp.txt:1056) + static member tcCannotCallAbstractBaseMember(a0 : System.String) = (1201, GetStringFunc("tcCannotCallAbstractBaseMember",",,,%s,,,") a0) + /// Could not resolve the ambiguity in the use of a generic construct with an 'unmanaged' constraint at or near this position + /// (Originally from ..\FSComp.txt:1057) + static member typrelCannotResolveAmbiguityInUnmanaged() = (1202, GetStringFunc("typrelCannotResolveAmbiguityInUnmanaged",",,,") ) + /// This construct is for ML compatibility. %s. You can disable this warning by using '--mlcompatibility' or '--nowarn:62'. + /// (Originally from ..\FSComp.txt:1060) + static member mlCompatMessage(a0 : System.String) = (GetStringFunc("mlCompatMessage",",,,%s,,,") a0) + /// The type '%s' has been marked as having an Explicit layout, but the field '%s' has not been marked with the 'FieldOffset' attribute + /// (Originally from ..\FSComp.txt:1062) + static member ilFieldDoesNotHaveValidOffsetForStructureLayout(a0 : System.String, a1 : System.String) = (1206, GetStringFunc("ilFieldDoesNotHaveValidOffsetForStructureLayout",",,,%s,,,%s,,,") a0 a1) + /// Interfaces inherited by other interfaces should be declared using 'inherit ...' instead of 'interface ...' + /// (Originally from ..\FSComp.txt:1063) + static member tcInterfacesShouldUseInheritNotInterface() = (1207, GetStringFunc("tcInterfacesShouldUseInheritNotInterface",",,,") ) + /// Invalid prefix operator + /// (Originally from ..\FSComp.txt:1064) + static member parsInvalidPrefixOperator() = (1208, GetStringFunc("parsInvalidPrefixOperator",",,,") ) + /// Invalid operator definition. Prefix operator definitions must use a valid prefix operator name. + /// (Originally from ..\FSComp.txt:1065) + static member parsInvalidPrefixOperatorDefinition() = (1208, GetStringFunc("parsInvalidPrefixOperatorDefinition",",,,") ) + /// The file extensions '.ml' and '.mli' are for ML compatibility + /// (Originally from ..\FSComp.txt:1066) + static member buildCompilingExtensionIsForML() = (GetStringFunc("buildCompilingExtensionIsForML",",,,") ) + /// Consider using a file with extension '.ml' or '.mli' instead + /// (Originally from ..\FSComp.txt:1067) + static member lexIndentOffForML() = (GetStringFunc("lexIndentOffForML",",,,") ) + /// Active pattern '%s' is not a function + /// (Originally from ..\FSComp.txt:1068) + static member activePatternIdentIsNotFunctionTyped(a0 : System.String) = (1209, GetStringFunc("activePatternIdentIsNotFunctionTyped",",,,%s,,,") a0) + /// Active pattern '%s' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + /// (Originally from ..\FSComp.txt:1069) + static member activePatternChoiceHasFreeTypars(a0 : System.String) = (1210, GetStringFunc("activePatternChoiceHasFreeTypars",",,,%s,,,") a0) + /// The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) + /// (Originally from ..\FSComp.txt:1070) + static member ilFieldHasOffsetForSequentialLayout() = (1211, GetStringFunc("ilFieldHasOffsetForSequentialLayout",",,,") ) + /// Optional arguments must come at the end of the argument list, after any non-optional arguments + /// (Originally from ..\FSComp.txt:1071) + static member tcOptionalArgsMustComeAfterNonOptionalArgs() = (1212, GetStringFunc("tcOptionalArgsMustComeAfterNonOptionalArgs",",,,") ) + /// Attribute 'System.Diagnostics.ConditionalAttribute' is only valid on methods or attribute classes + /// (Originally from ..\FSComp.txt:1072) + static member tcConditionalAttributeUsage() = (1213, GetStringFunc("tcConditionalAttributeUsage",",,,") ) + /// Extension members cannot provide operator overloads. Consider defining the operator as part of the type definition instead. + /// (Originally from ..\FSComp.txt:1074) + static member tcMemberOperatorDefinitionInExtrinsic() = (1215, GetStringFunc("tcMemberOperatorDefinitionInExtrinsic",",,,") ) + /// The name of the MDB file must be .mdb. The --pdb option will be ignored. + /// (Originally from ..\FSComp.txt:1075) + static member ilwriteMDBFileNameCannotBeChangedWarning() = (1216, GetStringFunc("ilwriteMDBFileNameCannotBeChangedWarning",",,,") ) + /// MDB generation failed. Could not find compatible member %s + /// (Originally from ..\FSComp.txt:1076) + static member ilwriteMDBMemberMissing(a0 : System.String) = (1217, GetStringFunc("ilwriteMDBMemberMissing",",,,%s,,,") a0) + /// Cannot generate MDB debug information. Failed to load the 'MonoSymbolWriter' type from the 'Mono.CompilerServices.SymbolWriter.dll' assembly. + /// (Originally from ..\FSComp.txt:1077) + static member ilwriteErrorCreatingMdb() = (1218, GetStringFunc("ilwriteErrorCreatingMdb",",,,") ) + /// The union case named '%s' conflicts with the generated type '%s' + /// (Originally from ..\FSComp.txt:1078) + static member tcUnionCaseNameConflictsWithGeneratedType(a0 : System.String, a1 : System.String) = (1219, GetStringFunc("tcUnionCaseNameConflictsWithGeneratedType",",,,%s,,,%s,,,") a0 a1) + /// ReflectedDefinitionAttribute may not be applied to an instance member on a struct type, because the instance member takes an implicit 'this' byref parameter + /// (Originally from ..\FSComp.txt:1079) + static member chkNoReflectedDefinitionOnStructMember() = (1220, GetStringFunc("chkNoReflectedDefinitionOnStructMember",",,,") ) + /// DLLImport bindings must be static members in a class or function definitions in a module + /// (Originally from ..\FSComp.txt:1080) + static member tcDllImportNotAllowed() = (1221, GetStringFunc("tcDllImportNotAllowed",",,,") ) + /// When mscorlib.dll or FSharp.Core.dll is explicitly referenced the %s option must also be passed + /// (Originally from ..\FSComp.txt:1081) + static member buildExplicitCoreLibRequiresNoFramework(a0 : System.String) = (1222, GetStringFunc("buildExplicitCoreLibRequiresNoFramework",",,,%s,,,") a0) + /// FSharp.Core.sigdata not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. + /// (Originally from ..\FSComp.txt:1082) + static member buildExpectedSigdataFile(a0 : System.String) = (1223, GetStringFunc("buildExpectedSigdataFile",",,,%s,,,") a0) + /// File '%s' not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. + /// (Originally from ..\FSComp.txt:1083) + static member buildExpectedFileAlongSideFSharpCore(a0 : System.String, a1 : System.String) = (1225, GetStringFunc("buildExpectedFileAlongSideFSharpCore",",,,%s,,,%s,,,") a0 a1) + /// Filename '%s' contains invalid character '%s' + /// (Originally from ..\FSComp.txt:1084) + static member buildUnexpectedFileNameCharacter(a0 : System.String, a1 : System.String) = (1227, GetStringFunc("buildUnexpectedFileNameCharacter",",,,%s,,,%s,,,") a0 a1) + /// 'use!' bindings must be of the form 'use! = ' + /// (Originally from ..\FSComp.txt:1085) + static member tcInvalidUseBangBinding() = (1228, GetStringFunc("tcInvalidUseBangBinding",",,,") ) + /// Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic. + /// (Originally from ..\FSComp.txt:1086) + static member crefNoInnerGenericsInQuotations() = (1230, GetStringFunc("crefNoInnerGenericsInQuotations",",,,") ) + /// The type '%s' is not a valid enumerator type , i.e. does not have a 'MoveNext()' method returning a bool, and a 'Current' property + /// (Originally from ..\FSComp.txt:1087) + static member tcEnumTypeCannotBeEnumerated(a0 : System.String) = (1231, GetStringFunc("tcEnumTypeCannotBeEnumerated",",,,%s,,,") a0) + /// End of file in triple-quote string begun at or before here + /// (Originally from ..\FSComp.txt:1088) + static member parsEofInTripleQuoteString() = (1232, GetStringFunc("parsEofInTripleQuoteString",",,,") ) + /// End of file in triple-quote string embedded in comment begun at or before here + /// (Originally from ..\FSComp.txt:1089) + static member parsEofInTripleQuoteStringInComment() = (1233, GetStringFunc("parsEofInTripleQuoteStringInComment",",,,") ) + /// This type test or downcast will ignore the unit-of-measure '%s' + /// (Originally from ..\FSComp.txt:1090) + static member tcTypeTestLosesMeasures(a0 : System.String) = (1240, GetStringFunc("tcTypeTestLosesMeasures",",,,%s,,,") a0) + /// Expected type argument or static argument + /// (Originally from ..\FSComp.txt:1091) + static member parsMissingTypeArgs() = (1241, GetStringFunc("parsMissingTypeArgs",",,,") ) + /// Unmatched '<'. Expected closing '>' + /// (Originally from ..\FSComp.txt:1092) + static member parsMissingGreaterThan() = (1242, GetStringFunc("parsMissingGreaterThan",",,,") ) + /// Unexpected quotation operator '<@' in type definition. If you intend to pass a verbatim string as a static argument to a type provider, put a space between the '<' and '@' characters. + /// (Originally from ..\FSComp.txt:1093) + static member parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString() = (1243, GetStringFunc("parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString",",,,") ) + /// Attempted to parse this as an operator name, but failed + /// (Originally from ..\FSComp.txt:1094) + static member parsErrorParsingAsOperatorName() = (1244, GetStringFunc("parsErrorParsingAsOperatorName",",,,") ) + /// \U%s is not a valid Unicode character escape sequence + /// (Originally from ..\FSComp.txt:1095) + static member lexInvalidUnicodeLiteral(a0 : System.String) = (1245, GetStringFunc("lexInvalidUnicodeLiteral",",,,%s,,,") a0) + /// '%s' must be applied to an argument of type '%s', but has been applied to an argument of type '%s' + /// (Originally from ..\FSComp.txt:1096) + static member tcCallerInfoWrongType(a0 : System.String, a1 : System.String, a2 : System.String) = (1246, GetStringFunc("tcCallerInfoWrongType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// '%s' can only be applied to optional arguments + /// (Originally from ..\FSComp.txt:1097) + static member tcCallerInfoNotOptional(a0 : System.String) = (1247, GetStringFunc("tcCallerInfoNotOptional",",,,%s,,,") a0) + /// The specified .NET Framework version '%s' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion. + /// (Originally from ..\FSComp.txt:1099) + static member toolLocationHelperUnsupportedFrameworkVersion(a0 : System.String) = (1300, GetStringFunc("toolLocationHelperUnsupportedFrameworkVersion",",,,%s,,,") a0) + /// Invalid Magic value in CLR Header + /// (Originally from ..\FSComp.txt:1103) + static member ilSignInvalidMagicValue() = (1301, GetStringFunc("ilSignInvalidMagicValue",",,,") ) + /// Bad image format + /// (Originally from ..\FSComp.txt:1104) + static member ilSignBadImageFormat() = (1302, GetStringFunc("ilSignBadImageFormat",",,,") ) + /// Private key expected + /// (Originally from ..\FSComp.txt:1105) + static member ilSignPrivateKeyExpected() = (1303, GetStringFunc("ilSignPrivateKeyExpected",",,,") ) + /// RSA key expected + /// (Originally from ..\FSComp.txt:1106) + static member ilSignRsaKeyExpected() = (1304, GetStringFunc("ilSignRsaKeyExpected",",,,") ) + /// Invalid bit Length + /// (Originally from ..\FSComp.txt:1107) + static member ilSignInvalidBitLen() = (1305, GetStringFunc("ilSignInvalidBitLen",",,,") ) + /// Invalid RSAParameters structure - '{0}' expected + /// (Originally from ..\FSComp.txt:1108) + static member ilSignInvalidRSAParams() = (1306, GetStringFunc("ilSignInvalidRSAParams",",,,") ) + /// Invalid algId - 'Exponent' expected + /// (Originally from ..\FSComp.txt:1109) + static member ilSignInvalidAlgId() = (1307, GetStringFunc("ilSignInvalidAlgId",",,,") ) + /// Invalid signature size + /// (Originally from ..\FSComp.txt:1110) + static member ilSignInvalidSignatureSize() = (1308, GetStringFunc("ilSignInvalidSignatureSize",",,,") ) + /// No signature directory + /// (Originally from ..\FSComp.txt:1111) + static member ilSignNoSignatureDirectory() = (1309, GetStringFunc("ilSignNoSignatureDirectory",",,,") ) + /// Invalid Public Key blob + /// (Originally from ..\FSComp.txt:1112) + static member ilSignInvalidPKBlob() = (1310, GetStringFunc("ilSignInvalidPKBlob",",,,") ) + /// Exiting - too many errors + /// (Originally from ..\FSComp.txt:1114) + static member fscTooManyErrors() = (GetStringFunc("fscTooManyErrors",",,,") ) + /// The documentation file has no .xml suffix + /// (Originally from ..\FSComp.txt:1115) + static member docfileNoXmlSuffix() = (2001, GetStringFunc("docfileNoXmlSuffix",",,,") ) + /// No implementation files specified + /// (Originally from ..\FSComp.txt:1116) + static member fscNoImplementationFiles() = (2002, GetStringFunc("fscNoImplementationFiles",",,,") ) + /// An %s specified version '%s', but this value is invalid and has been ignored + /// (Originally from ..\FSComp.txt:1117) + static member fscBadAssemblyVersion(a0 : System.String, a1 : System.String) = (2003, GetStringFunc("fscBadAssemblyVersion",",,,%s,,,%s,,,") a0 a1) + /// Conflicting options specified: 'win32manifest' and 'win32res'. Only one of these can be used. + /// (Originally from ..\FSComp.txt:1118) + static member fscTwoResourceManifests() = (2004, GetStringFunc("fscTwoResourceManifests",",,,") ) + /// The code in assembly '%s' makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. + /// (Originally from ..\FSComp.txt:1119) + static member fscQuotationLiteralsStaticLinking(a0 : System.String) = (2005, GetStringFunc("fscQuotationLiteralsStaticLinking",",,,%s,,,") a0) + /// Code in this assembly makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. + /// (Originally from ..\FSComp.txt:1120) + static member fscQuotationLiteralsStaticLinking0() = (2006, GetStringFunc("fscQuotationLiteralsStaticLinking0",",,,") ) + /// Static linking may not include a .EXE + /// (Originally from ..\FSComp.txt:1121) + static member fscStaticLinkingNoEXE() = (2007, GetStringFunc("fscStaticLinkingNoEXE",",,,") ) + /// Static linking may not include a mixed managed/unmanaged DLL + /// (Originally from ..\FSComp.txt:1122) + static member fscStaticLinkingNoMixedDLL() = (2008, GetStringFunc("fscStaticLinkingNoMixedDLL",",,,") ) + /// Ignoring mixed managed/unmanaged assembly '%s' during static linking + /// (Originally from ..\FSComp.txt:1123) + static member fscIgnoringMixedWhenLinking(a0 : System.String) = (2009, GetStringFunc("fscIgnoringMixedWhenLinking",",,,%s,,,") a0) + /// Assembly '%s' was referenced transitively and the assembly could not be resolved automatically. Static linking will assume this DLL has no dependencies on the F# library or other statically linked DLLs. Consider adding an explicit reference to this DLL. + /// (Originally from ..\FSComp.txt:1124) + static member fscAssumeStaticLinkContainsNoDependencies(a0 : System.String) = (2011, GetStringFunc("fscAssumeStaticLinkContainsNoDependencies",",,,%s,,,") a0) + /// Assembly '%s' not found in dependency set of target binary. Statically linked roots should be specified using an assembly name, without a DLL or EXE extension. If this assembly was referenced explicitly then it is possible the assembly was not actually required by the generated binary, in which case it should not be statically linked. + /// (Originally from ..\FSComp.txt:1125) + static member fscAssemblyNotFoundInDependencySet(a0 : System.String) = (2012, GetStringFunc("fscAssemblyNotFoundInDependencySet",",,,%s,,,") a0) + /// The key file '%s' could not be opened + /// (Originally from ..\FSComp.txt:1126) + static member fscKeyFileCouldNotBeOpened(a0 : System.String) = (2013, GetStringFunc("fscKeyFileCouldNotBeOpened",",,,%s,,,") a0) + /// A problem occurred writing the binary '%s': %s + /// (Originally from ..\FSComp.txt:1127) + static member fscProblemWritingBinary(a0 : System.String, a1 : System.String) = (2014, GetStringFunc("fscProblemWritingBinary",",,,%s,,,%s,,,") a0 a1) + /// The 'AssemblyVersionAttribute' has been ignored because a version was given using a command line option + /// (Originally from ..\FSComp.txt:1128) + static member fscAssemblyVersionAttributeIgnored() = (2015, GetStringFunc("fscAssemblyVersionAttributeIgnored",",,,") ) + /// Error emitting 'System.Reflection.AssemblyCultureAttribute' attribute -- 'Executables cannot be satellite assemblies, Culture should always be empty' + /// (Originally from ..\FSComp.txt:1129) + static member fscAssemblyCultureAttributeError() = (2016, GetStringFunc("fscAssemblyCultureAttributeError",",,,") ) + /// Option '--delaysign' overrides attribute 'System.Reflection.AssemblyDelaySignAttribute' given in a source file or added module + /// (Originally from ..\FSComp.txt:1130) + static member fscDelaySignWarning() = (2017, GetStringFunc("fscDelaySignWarning",",,,") ) + /// Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module + /// (Originally from ..\FSComp.txt:1131) + static member fscKeyFileWarning() = (2018, GetStringFunc("fscKeyFileWarning",",,,") ) + /// Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module + /// (Originally from ..\FSComp.txt:1132) + static member fscKeyNameWarning() = (2019, GetStringFunc("fscKeyNameWarning",",,,") ) + /// The assembly '%s' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'. + /// (Originally from ..\FSComp.txt:1133) + static member fscReferenceOnCommandLine(a0 : System.String) = (2020, GetStringFunc("fscReferenceOnCommandLine",",,,%s,,,") a0) + /// The resident compilation service was not used because a problem occured in communicating with the server. + /// (Originally from ..\FSComp.txt:1134) + static member fscRemotingError() = (2021, GetStringFunc("fscRemotingError",",,,") ) + /// Problem with filename '%s': Illegal characters in path. + /// (Originally from ..\FSComp.txt:1135) + static member pathIsInvalid(a0 : System.String) = (2022, GetStringFunc("pathIsInvalid",",,,%s,,,") a0) + /// Passing a .resx file (%s) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an item in the .fsproj project file. + /// (Originally from ..\FSComp.txt:1136) + static member fscResxSourceFileDeprecated(a0 : System.String) = (2023, GetStringFunc("fscResxSourceFileDeprecated",",,,%s,,,") a0) + /// Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly). + /// (Originally from ..\FSComp.txt:1137) + static member fscStaticLinkingNoProfileMismatches() = (2024, GetStringFunc("fscStaticLinkingNoProfileMismatches",",,,") ) + /// An %s specified version '%s', but this value is a wildcard, and you have requested a deterministic build, these are in conflict. + /// (Originally from ..\FSComp.txt:1138) + static member fscAssemblyWildcardAndDeterminism(a0 : System.String, a1 : System.String) = (2025, GetStringFunc("fscAssemblyWildcardAndDeterminism",",,,%s,,,%s,,,") a0 a1) + /// Determinstic builds only support portable PDBs (--debug:portable or --debug:embedded) + /// (Originally from ..\FSComp.txt:1139) + static member fscDeterministicDebugRequiresPortablePdb() = (2026, GetStringFunc("fscDeterministicDebugRequiresPortablePdb",",,,") ) + /// Character '%s' is not allowed in provided namespace name '%s' + /// (Originally from ..\FSComp.txt:1140) + static member etIllegalCharactersInNamespaceName(a0 : System.String, a1 : System.String) = (3000, GetStringFunc("etIllegalCharactersInNamespaceName",",,,%s,,,%s,,,") a0 a1) + /// The provided type '%s' returned a member with a null or empty member name + /// (Originally from ..\FSComp.txt:1141) + static member etNullOrEmptyMemberName(a0 : System.String) = (3001, GetStringFunc("etNullOrEmptyMemberName",",,,%s,,,") a0) + /// The provided type '%s' returned a null member + /// (Originally from ..\FSComp.txt:1142) + static member etNullMember(a0 : System.String) = (3002, GetStringFunc("etNullMember",",,,%s,,,") a0) + /// The provided type '%s' member info '%s' has null declaring type + /// (Originally from ..\FSComp.txt:1143) + static member etNullMemberDeclaringType(a0 : System.String, a1 : System.String) = (3003, GetStringFunc("etNullMemberDeclaringType",",,,%s,,,%s,,,") a0 a1) + /// The provided type '%s' has member '%s' which has declaring type '%s'. Expected declaring type to be the same as provided type. + /// (Originally from ..\FSComp.txt:1144) + static member etNullMemberDeclaringTypeDifferentFromProvidedType(a0 : System.String, a1 : System.String, a2 : System.String) = (3004, GetStringFunc("etNullMemberDeclaringTypeDifferentFromProvidedType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Referenced assembly '%s' has assembly level attribute '%s' but no public type provider classes were found + /// (Originally from ..\FSComp.txt:1145) + static member etHostingAssemblyFoundWithoutHosts(a0 : System.String, a1 : System.String) = (3005, GetStringFunc("etHostingAssemblyFoundWithoutHosts",",,,%s,,,%s,,,") a0 a1) + /// Type '%s' from type provider '%s' has an empty namespace. Use 'null' for the global namespace. + /// (Originally from ..\FSComp.txt:1146) + static member etEmptyNamespaceOfTypeNotAllowed(a0 : System.String, a1 : System.String) = (3006, GetStringFunc("etEmptyNamespaceOfTypeNotAllowed",",,,%s,,,%s,,,") a0 a1) + /// Empty namespace found from the type provider '%s'. Use 'null' for the global namespace. + /// (Originally from ..\FSComp.txt:1147) + static member etEmptyNamespaceNotAllowed(a0 : System.String) = (3007, GetStringFunc("etEmptyNamespaceNotAllowed",",,,%s,,,") a0) + /// Provided type '%s' has 'IsGenericType' as true, but generic types are not supported. + /// (Originally from ..\FSComp.txt:1148) + static member etMustNotBeGeneric(a0 : System.String) = (3011, GetStringFunc("etMustNotBeGeneric",",,,%s,,,") a0) + /// Provided type '%s' has 'IsArray' as true, but array types are not supported. + /// (Originally from ..\FSComp.txt:1149) + static member etMustNotBeAnArray(a0 : System.String) = (3013, GetStringFunc("etMustNotBeAnArray",",,,%s,,,") a0) + /// Invalid member '%s' on provided type '%s'. Provided type members must be public, and not be generic, virtual, or abstract. + /// (Originally from ..\FSComp.txt:1150) + static member etMethodHasRequirements(a0 : System.String, a1 : System.String) = (3014, GetStringFunc("etMethodHasRequirements",",,,%s,,,%s,,,") a0 a1) + /// Invalid member '%s' on provided type '%s'. Only properties, methods and constructors are allowed + /// (Originally from ..\FSComp.txt:1151) + static member etUnsupportedMemberKind(a0 : System.String, a1 : System.String) = (3015, GetStringFunc("etUnsupportedMemberKind",",,,%s,,,%s,,,") a0 a1) + /// Property '%s' on provided type '%s' has CanRead=true but there was no value from GetGetMethod() + /// (Originally from ..\FSComp.txt:1152) + static member etPropertyCanReadButHasNoGetter(a0 : System.String, a1 : System.String) = (3016, GetStringFunc("etPropertyCanReadButHasNoGetter",",,,%s,,,%s,,,") a0 a1) + /// Property '%s' on provided type '%s' has CanRead=false but GetGetMethod() returned a method + /// (Originally from ..\FSComp.txt:1153) + static member etPropertyHasGetterButNoCanRead(a0 : System.String, a1 : System.String) = (3017, GetStringFunc("etPropertyHasGetterButNoCanRead",",,,%s,,,%s,,,") a0 a1) + /// Property '%s' on provided type '%s' has CanWrite=true but there was no value from GetSetMethod() + /// (Originally from ..\FSComp.txt:1154) + static member etPropertyCanWriteButHasNoSetter(a0 : System.String, a1 : System.String) = (3018, GetStringFunc("etPropertyCanWriteButHasNoSetter",",,,%s,,,%s,,,") a0 a1) + /// Property '%s' on provided type '%s' has CanWrite=false but GetSetMethod() returned a method + /// (Originally from ..\FSComp.txt:1155) + static member etPropertyHasSetterButNoCanWrite(a0 : System.String, a1 : System.String) = (3019, GetStringFunc("etPropertyHasSetterButNoCanWrite",",,,%s,,,%s,,,") a0 a1) + /// One or more errors seen during provided type setup + /// (Originally from ..\FSComp.txt:1156) + static member etOneOrMoreErrorsSeenDuringExtensionTypeSetting() = (3020, GetStringFunc("etOneOrMoreErrorsSeenDuringExtensionTypeSetting",",,,") ) + /// Unexpected exception from provided type '%s' member '%s': %s + /// (Originally from ..\FSComp.txt:1157) + static member etUnexpectedExceptionFromProvidedTypeMember(a0 : System.String, a1 : System.String, a2 : System.String) = (3021, GetStringFunc("etUnexpectedExceptionFromProvidedTypeMember",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Unsupported constant type '%s'. Quotations provided by type providers can only contain simple constants. The implementation of the type provider may need to be adjusted by moving a value declared outside a provided quotation literal to be a 'let' binding inside the quotation literal. + /// (Originally from ..\FSComp.txt:1158) + static member etUnsupportedConstantType(a0 : System.String) = (3022, GetStringFunc("etUnsupportedConstantType",",,,%s,,,") a0) + /// Unsupported expression '%s' from type provider. If you are the author of this type provider, consider adjusting it to provide a different provided expression. + /// (Originally from ..\FSComp.txt:1159) + static member etUnsupportedProvidedExpression(a0 : System.String) = (3025, GetStringFunc("etUnsupportedProvidedExpression",",,,%s,,,") a0) + /// Expected provided type named '%s' but provided type has 'Name' with value '%s' + /// (Originally from ..\FSComp.txt:1160) + static member etProvidedTypeHasUnexpectedName(a0 : System.String, a1 : System.String) = (3028, GetStringFunc("etProvidedTypeHasUnexpectedName",",,,%s,,,%s,,,") a0 a1) + /// Event '%s' on provided type '%s' has no value from GetAddMethod() + /// (Originally from ..\FSComp.txt:1161) + static member etEventNoAdd(a0 : System.String, a1 : System.String) = (3029, GetStringFunc("etEventNoAdd",",,,%s,,,%s,,,") a0 a1) + /// Event '%s' on provided type '%s' has no value from GetRemoveMethod() + /// (Originally from ..\FSComp.txt:1162) + static member etEventNoRemove(a0 : System.String, a1 : System.String) = (3030, GetStringFunc("etEventNoRemove",",,,%s,,,%s,,,") a0 a1) + /// Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded or doesn't exist. %s + /// (Originally from ..\FSComp.txt:1163) + static member etProviderHasWrongDesignerAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (3031, GetStringFunc("etProviderHasWrongDesignerAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The type provider does not have a valid constructor. A constructor taking either no arguments or one argument of type 'TypeProviderConfig' was expected. + /// (Originally from ..\FSComp.txt:1164) + static member etProviderDoesNotHaveValidConstructor() = (3032, GetStringFunc("etProviderDoesNotHaveValidConstructor",",,,") ) + /// The type provider '%s' reported an error: %s + /// (Originally from ..\FSComp.txt:1165) + static member etProviderError(a0 : System.String, a1 : System.String) = (3033, GetStringFunc("etProviderError",",,,%s,,,%s,,,") a0 a1) + /// The type provider '%s' used an invalid parameter in the ParameterExpression: %s + /// (Originally from ..\FSComp.txt:1166) + static member etIncorrectParameterExpression(a0 : System.String, a1 : System.String) = (3034, GetStringFunc("etIncorrectParameterExpression",",,,%s,,,%s,,,") a0 a1) + /// The type provider '%s' provided a method with a name '%s' and metadata token '%d', which is not reported among its methods of its declaring type '%s' + /// (Originally from ..\FSComp.txt:1167) + static member etIncorrectProvidedMethod(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.String) = (3035, GetStringFunc("etIncorrectProvidedMethod",",,,%s,,,%s,,,%d,,,%s,,,") a0 a1 a2 a3) + /// The type provider '%s' provided a constructor which is not reported among the constructors of its declaring type '%s' + /// (Originally from ..\FSComp.txt:1168) + static member etIncorrectProvidedConstructor(a0 : System.String, a1 : System.String) = (3036, GetStringFunc("etIncorrectProvidedConstructor",",,,%s,,,%s,,,") a0 a1) + /// A direct reference to the generated type '%s' is not permitted. Instead, use a type definition, e.g. 'type TypeAlias = '. This indicates that a type provider adds generated types to your assembly. + /// (Originally from ..\FSComp.txt:1169) + static member etDirectReferenceToGeneratedTypeNotAllowed(a0 : System.String) = (3039, GetStringFunc("etDirectReferenceToGeneratedTypeNotAllowed",",,,%s,,,") a0) + /// Expected provided type with path '%s' but provided type has path '%s' + /// (Originally from ..\FSComp.txt:1170) + static member etProvidedTypeHasUnexpectedPath(a0 : System.String, a1 : System.String) = (3041, GetStringFunc("etProvidedTypeHasUnexpectedPath",",,,%s,,,%s,,,") a0 a1) + /// Unexpected 'null' return value from provided type '%s' member '%s' + /// (Originally from ..\FSComp.txt:1171) + static member etUnexpectedNullFromProvidedTypeMember(a0 : System.String, a1 : System.String) = (3042, GetStringFunc("etUnexpectedNullFromProvidedTypeMember",",,,%s,,,%s,,,") a0 a1) + /// Unexpected exception from member '%s' of provided type '%s' member '%s': %s + /// (Originally from ..\FSComp.txt:1172) + static member etUnexpectedExceptionFromProvidedMemberMember(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3043, GetStringFunc("etUnexpectedExceptionFromProvidedMemberMember",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// Nested provided types do not take static arguments or generic parameters + /// (Originally from ..\FSComp.txt:1173) + static member etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters() = (3044, GetStringFunc("etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters",",,,") ) + /// Invalid static argument to provided type. Expected an argument of kind '%s'. + /// (Originally from ..\FSComp.txt:1174) + static member etInvalidStaticArgument(a0 : System.String) = (3045, GetStringFunc("etInvalidStaticArgument",",,,%s,,,") a0) + /// An error occured applying the static arguments to a provided type + /// (Originally from ..\FSComp.txt:1175) + static member etErrorApplyingStaticArgumentsToType() = (3046, GetStringFunc("etErrorApplyingStaticArgumentsToType",",,,") ) + /// Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s' + /// (Originally from ..\FSComp.txt:1176) + static member etUnknownStaticArgumentKind(a0 : System.String, a1 : System.String) = (3047, GetStringFunc("etUnknownStaticArgumentKind",",,,%s,,,%s,,,") a0 a1) + /// invalid namespace for provided type + /// (Originally from ..\FSComp.txt:1177) + static member invalidNamespaceForProvidedType() = (GetStringFunc("invalidNamespaceForProvidedType",",,,") ) + /// invalid full name for provided type + /// (Originally from ..\FSComp.txt:1178) + static member invalidFullNameForProvidedType() = (GetStringFunc("invalidFullNameForProvidedType",",,,") ) + /// The type provider returned 'null', which is not a valid return value from '%s' + /// (Originally from ..\FSComp.txt:1180) + static member etProviderReturnedNull(a0 : System.String) = (3051, GetStringFunc("etProviderReturnedNull",",,,%s,,,") a0) + /// The type provider constructor has thrown an exception: %s + /// (Originally from ..\FSComp.txt:1181) + static member etTypeProviderConstructorException(a0 : System.String) = (3053, GetStringFunc("etTypeProviderConstructorException",",,,%s,,,") a0) + /// Type provider '%s' returned null from GetInvokerExpression. + /// (Originally from ..\FSComp.txt:1182) + static member etNullProvidedExpression(a0 : System.String) = (3056, GetStringFunc("etNullProvidedExpression",",,,%s,,,") a0) + /// The type provider '%s' returned an invalid type from 'ApplyStaticArguments'. A type with name '%s' was expected, but a type with name '%s' was returned. + /// (Originally from ..\FSComp.txt:1183) + static member etProvidedAppliedTypeHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3057, GetStringFunc("etProvidedAppliedTypeHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// The type provider '%s' returned an invalid method from 'ApplyStaticArgumentsForMethod'. A method with name '%s' was expected, but a method with name '%s' was returned. + /// (Originally from ..\FSComp.txt:1184) + static member etProvidedAppliedMethodHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3058, GetStringFunc("etProvidedAppliedMethodHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// This type test or downcast will erase the provided type '%s' to the type '%s' + /// (Originally from ..\FSComp.txt:1185) + static member tcTypeTestLossy(a0 : System.String, a1 : System.String) = (3060, GetStringFunc("tcTypeTestLossy",",,,%s,,,%s,,,") a0 a1) + /// This downcast will erase the provided type '%s' to the type '%s'. + /// (Originally from ..\FSComp.txt:1186) + static member tcTypeCastErased(a0 : System.String, a1 : System.String) = (3061, GetStringFunc("tcTypeCastErased",",,,%s,,,%s,,,") a0 a1) + /// This type test with a provided type '%s' is not allowed because this provided type will be erased to '%s' at runtime. + /// (Originally from ..\FSComp.txt:1187) + static member tcTypeTestErased(a0 : System.String, a1 : System.String) = (3062, GetStringFunc("tcTypeTestErased",",,,%s,,,%s,,,") a0 a1) + /// Cannot inherit from erased provided type + /// (Originally from ..\FSComp.txt:1188) + static member tcCannotInheritFromErasedType() = (3063, GetStringFunc("tcCannotInheritFromErasedType",",,,") ) + /// Assembly '%s' hase TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name + /// (Originally from ..\FSComp.txt:1189) + static member etInvalidTypeProviderAssemblyName(a0 : System.String, a1 : System.String) = (3065, GetStringFunc("etInvalidTypeProviderAssemblyName",",,,%s,,,%s,,,") a0 a1) + /// Invalid member name. Members may not have name '.ctor' or '.cctor' + /// (Originally from ..\FSComp.txt:1190) + static member tcInvalidMemberNameCtor() = (3066, GetStringFunc("tcInvalidMemberNameCtor",",,,") ) + /// The function or member '%s' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '%s'. + /// (Originally from ..\FSComp.txt:1191) + static member tcInferredGenericTypeGivesRiseToInconsistency(a0 : System.String, a1 : System.String) = (3068, GetStringFunc("tcInferredGenericTypeGivesRiseToInconsistency",",,,%s,,,%s,,,") a0 a1) + /// The number of type arguments did not match: '%d' given, '%d' expected. This may be related to a previously reported error. + /// (Originally from ..\FSComp.txt:1192) + static member tcInvalidTypeArgumentCount(a0 : System.Int32, a1 : System.Int32) = (3069, GetStringFunc("tcInvalidTypeArgumentCount",",,,%d,,,%d,,,") a0 a1) + /// Cannot override inherited member '%s' because it is sealed + /// (Originally from ..\FSComp.txt:1193) + static member tcCannotOverrideSealedMethod(a0 : System.String) = (3070, GetStringFunc("tcCannotOverrideSealedMethod",",,,%s,,,") a0) + /// The type provider '%s' reported an error in the context of provided type '%s', member '%s'. The error: %s + /// (Originally from ..\FSComp.txt:1194) + static member etProviderErrorWithContext(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3071, GetStringFunc("etProviderErrorWithContext",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// An exception occurred when accessing the '%s' of a provided type: %s + /// (Originally from ..\FSComp.txt:1195) + static member etProvidedTypeWithNameException(a0 : System.String, a1 : System.String) = (3072, GetStringFunc("etProvidedTypeWithNameException",",,,%s,,,%s,,,") a0 a1) + /// The '%s' of a provided type was null or empty. + /// (Originally from ..\FSComp.txt:1196) + static member etProvidedTypeWithNullOrEmptyName(a0 : System.String) = (3073, GetStringFunc("etProvidedTypeWithNullOrEmptyName",",,,%s,,,") a0) + /// Character '%s' is not allowed in provided type name '%s' + /// (Originally from ..\FSComp.txt:1197) + static member etIllegalCharactersInTypeName(a0 : System.String, a1 : System.String) = (3075, GetStringFunc("etIllegalCharactersInTypeName",",,,%s,,,%s,,,") a0 a1) + /// In queries, '%s' must use a simple pattern + /// (Originally from ..\FSComp.txt:1198) + static member tcJoinMustUseSimplePattern(a0 : System.String) = (3077, GetStringFunc("tcJoinMustUseSimplePattern",",,,%s,,,") a0) + /// A custom query operation for '%s' is required but not specified + /// (Originally from ..\FSComp.txt:1199) + static member tcMissingCustomOperation(a0 : System.String) = (3078, GetStringFunc("tcMissingCustomOperation",",,,%s,,,") a0) + /// Named static arguments must come after all unnamed static arguments + /// (Originally from ..\FSComp.txt:1200) + static member etBadUnnamedStaticArgs() = (3080, GetStringFunc("etBadUnnamedStaticArgs",",,,") ) + /// The static parameter '%s' of the provided type or method '%s' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. '%s<%s=...>'. + /// (Originally from ..\FSComp.txt:1201) + static member etStaticParameterRequiresAValue(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3081, GetStringFunc("etStaticParameterRequiresAValue",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// No static parameter exists with name '%s' + /// (Originally from ..\FSComp.txt:1202) + static member etNoStaticParameterWithName(a0 : System.String) = (3082, GetStringFunc("etNoStaticParameterWithName",",,,%s,,,") a0) + /// The static parameter '%s' has already been given a value + /// (Originally from ..\FSComp.txt:1203) + static member etStaticParameterAlreadyHasValue(a0 : System.String) = (3083, GetStringFunc("etStaticParameterAlreadyHasValue",",,,%s,,,") a0) + /// Multiple static parameters exist with name '%s' + /// (Originally from ..\FSComp.txt:1204) + static member etMultipleStaticParameterWithName(a0 : System.String) = (3084, GetStringFunc("etMultipleStaticParameterWithName",",,,%s,,,") a0) + /// A custom operation may not be used in conjunction with a non-value or recursive 'let' binding in another part of this computation expression + /// (Originally from ..\FSComp.txt:1205) + static member tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings() = (3085, GetStringFunc("tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings",",,,") ) + /// A custom operation may not be used in conjunction with 'use', 'try/with', 'try/finally', 'if/then/else' or 'match' operators within this computation expression + /// (Originally from ..\FSComp.txt:1206) + static member tcCustomOperationMayNotBeUsedHere() = (3086, GetStringFunc("tcCustomOperationMayNotBeUsedHere",",,,") ) + /// The custom operation '%s' refers to a method which is overloaded. The implementations of custom operations may not be overloaded. + /// (Originally from ..\FSComp.txt:1207) + static member tcCustomOperationMayNotBeOverloaded(a0 : System.String) = (3087, GetStringFunc("tcCustomOperationMayNotBeOverloaded",",,,%s,,,") a0) + /// An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. + /// (Originally from ..\FSComp.txt:1208) + static member tcIfThenElseMayNotBeUsedWithinQueries() = (3090, GetStringFunc("tcIfThenElseMayNotBeUsedWithinQueries",",,,") ) + /// Invalid argument to 'methodhandleof' during codegen + /// (Originally from ..\FSComp.txt:1209) + static member ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen() = (3091, GetStringFunc("ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen",",,,") ) + /// A reference to a provided type was missing a value for the static parameter '%s'. You may need to recompile one or more referenced assemblies. + /// (Originally from ..\FSComp.txt:1210) + static member etProvidedTypeReferenceMissingArgument(a0 : System.String) = (3092, GetStringFunc("etProvidedTypeReferenceMissingArgument",",,,%s,,,") a0) + /// A reference to a provided type had an invalid value '%s' for a static parameter. You may need to recompile one or more referenced assemblies. + /// (Originally from ..\FSComp.txt:1211) + static member etProvidedTypeReferenceInvalidText(a0 : System.String) = (3093, GetStringFunc("etProvidedTypeReferenceInvalidText",",,,%s,,,") a0) + /// '%s' is not used correctly. This is a custom operation in this query or computation expression. + /// (Originally from ..\FSComp.txt:1212) + static member tcCustomOperationNotUsedCorrectly(a0 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly",",,,%s,,,") a0) + /// '%s' is not used correctly. Usage: %s. This is a custom operation in this query or computation expression. + /// (Originally from ..\FSComp.txt:1213) + static member tcCustomOperationNotUsedCorrectly2(a0 : System.String, a1 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly2",",,,%s,,,%s,,,") a0 a1) + /// %s var in collection %s (outerKey = innerKey). Note that parentheses are required after '%s' + /// (Originally from ..\FSComp.txt:1214) + static member customOperationTextLikeJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// %s var in collection %s (outerKey = innerKey) into group. Note that parentheses are required after '%s' + /// (Originally from ..\FSComp.txt:1215) + static member customOperationTextLikeGroupJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeGroupJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// %s var in collection + /// (Originally from ..\FSComp.txt:1216) + static member customOperationTextLikeZip(a0 : System.String) = (GetStringFunc("customOperationTextLikeZip",",,,%s,,,") a0) + /// '%s' must be followed by a variable name. Usage: %s. + /// (Originally from ..\FSComp.txt:1217) + static member tcBinaryOperatorRequiresVariable(a0 : System.String, a1 : System.String) = (3096, GetStringFunc("tcBinaryOperatorRequiresVariable",",,,%s,,,%s,,,") a0 a1) + /// Incorrect syntax for '%s'. Usage: %s. + /// (Originally from ..\FSComp.txt:1218) + static member tcOperatorIncorrectSyntax(a0 : System.String, a1 : System.String) = (3097, GetStringFunc("tcOperatorIncorrectSyntax",",,,%s,,,%s,,,") a0 a1) + /// '%s' must come after a 'for' selection clause and be followed by the rest of the query. Syntax: ... %s ... + /// (Originally from ..\FSComp.txt:1219) + static member tcBinaryOperatorRequiresBody(a0 : System.String, a1 : System.String) = (3098, GetStringFunc("tcBinaryOperatorRequiresBody",",,,%s,,,%s,,,") a0 a1) + /// '%s' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected %d argument(s), but given %d. + /// (Originally from ..\FSComp.txt:1220) + static member tcCustomOperationHasIncorrectArgCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3099, GetStringFunc("tcCustomOperationHasIncorrectArgCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) + /// Expected an expression after this point + /// (Originally from ..\FSComp.txt:1221) + static member parsExpectedExpressionAfterToken() = (3100, GetStringFunc("parsExpectedExpressionAfterToken",",,,") ) + /// Expected a type after this point + /// (Originally from ..\FSComp.txt:1222) + static member parsExpectedTypeAfterToken() = (3101, GetStringFunc("parsExpectedTypeAfterToken",",,,") ) + /// Unmatched '[<'. Expected closing '>]' + /// (Originally from ..\FSComp.txt:1223) + static member parsUnmatchedLBrackLess() = (3102, GetStringFunc("parsUnmatchedLBrackLess",",,,") ) + /// Unexpected end of input in 'match' expression. Expected 'match with | -> | -> ...'. + /// (Originally from ..\FSComp.txt:1224) + static member parsUnexpectedEndOfFileMatch() = (3103, GetStringFunc("parsUnexpectedEndOfFileMatch",",,,") ) + /// Unexpected end of input in 'try' expression. Expected 'try with ' or 'try finally '. + /// (Originally from ..\FSComp.txt:1225) + static member parsUnexpectedEndOfFileTry() = (3104, GetStringFunc("parsUnexpectedEndOfFileTry",",,,") ) + /// Unexpected end of input in 'while' expression. Expected 'while do '. + /// (Originally from ..\FSComp.txt:1226) + static member parsUnexpectedEndOfFileWhile() = (3105, GetStringFunc("parsUnexpectedEndOfFileWhile",",,,") ) + /// Unexpected end of input in 'for' expression. Expected 'for in do '. + /// (Originally from ..\FSComp.txt:1227) + static member parsUnexpectedEndOfFileFor() = (3106, GetStringFunc("parsUnexpectedEndOfFileFor",",,,") ) + /// Unexpected end of input in 'match' or 'try' expression + /// (Originally from ..\FSComp.txt:1228) + static member parsUnexpectedEndOfFileWith() = (3107, GetStringFunc("parsUnexpectedEndOfFileWith",",,,") ) + /// Unexpected end of input in 'then' branch of conditional expression. Expected 'if then ' or 'if then else '. + /// (Originally from ..\FSComp.txt:1229) + static member parsUnexpectedEndOfFileThen() = (3108, GetStringFunc("parsUnexpectedEndOfFileThen",",,,") ) + /// Unexpected end of input in 'else' branch of conditional expression. Expected 'if then ' or 'if then else '. + /// (Originally from ..\FSComp.txt:1230) + static member parsUnexpectedEndOfFileElse() = (3109, GetStringFunc("parsUnexpectedEndOfFileElse",",,,") ) + /// Unexpected end of input in body of lambda expression. Expected 'fun ... -> '. + /// (Originally from ..\FSComp.txt:1231) + static member parsUnexpectedEndOfFileFunBody() = (3110, GetStringFunc("parsUnexpectedEndOfFileFunBody",",,,") ) + /// Unexpected end of input in type arguments + /// (Originally from ..\FSComp.txt:1232) + static member parsUnexpectedEndOfFileTypeArgs() = (3111, GetStringFunc("parsUnexpectedEndOfFileTypeArgs",",,,") ) + /// Unexpected end of input in type signature + /// (Originally from ..\FSComp.txt:1233) + static member parsUnexpectedEndOfFileTypeSignature() = (3112, GetStringFunc("parsUnexpectedEndOfFileTypeSignature",",,,") ) + /// Unexpected end of input in type definition + /// (Originally from ..\FSComp.txt:1234) + static member parsUnexpectedEndOfFileTypeDefinition() = (3113, GetStringFunc("parsUnexpectedEndOfFileTypeDefinition",",,,") ) + /// Unexpected end of input in object members + /// (Originally from ..\FSComp.txt:1235) + static member parsUnexpectedEndOfFileObjectMembers() = (3114, GetStringFunc("parsUnexpectedEndOfFileObjectMembers",",,,") ) + /// Unexpected end of input in value, function or member definition + /// (Originally from ..\FSComp.txt:1236) + static member parsUnexpectedEndOfFileDefinition() = (3115, GetStringFunc("parsUnexpectedEndOfFileDefinition",",,,") ) + /// Unexpected end of input in expression + /// (Originally from ..\FSComp.txt:1237) + static member parsUnexpectedEndOfFileExpression() = (3116, GetStringFunc("parsUnexpectedEndOfFileExpression",",,,") ) + /// Unexpected end of type. Expected a name after this point. + /// (Originally from ..\FSComp.txt:1238) + static member parsExpectedNameAfterToken() = (3117, GetStringFunc("parsExpectedNameAfterToken",",,,") ) + /// Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + /// (Originally from ..\FSComp.txt:1239) + static member parsUnmatchedLet() = (3118, GetStringFunc("parsUnmatchedLet",",,,") ) + /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let!' keyword. + /// (Originally from ..\FSComp.txt:1240) + static member parsUnmatchedLetBang() = (3119, GetStringFunc("parsUnmatchedLetBang",",,,") ) + /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use!' keyword. + /// (Originally from ..\FSComp.txt:1241) + static member parsUnmatchedUseBang() = (3120, GetStringFunc("parsUnmatchedUseBang",",,,") ) + /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use' keyword. + /// (Originally from ..\FSComp.txt:1242) + static member parsUnmatchedUse() = (3121, GetStringFunc("parsUnmatchedUse",",,,") ) + /// Missing 'do' in 'while' expression. Expected 'while do '. + /// (Originally from ..\FSComp.txt:1243) + static member parsWhileDoExpected() = (3122, GetStringFunc("parsWhileDoExpected",",,,") ) + /// Missing 'do' in 'for' expression. Expected 'for in do '. + /// (Originally from ..\FSComp.txt:1244) + static member parsForDoExpected() = (3123, GetStringFunc("parsForDoExpected",",,,") ) + /// Invalid join relation in '%s'. Expected 'expr expr', where is =, =?, ?= or ?=?. + /// (Originally from ..\FSComp.txt:1245) + static member tcInvalidRelationInJoin(a0 : System.String) = (3125, GetStringFunc("tcInvalidRelationInJoin",",,,%s,,,") a0) + /// Calls + /// (Originally from ..\FSComp.txt:1246) + static member typeInfoCallsWord() = (GetStringFunc("typeInfoCallsWord",",,,") ) + /// Invalid number of generic arguments to type '%s' in provided type. Expected '%d' arguments, given '%d'. + /// (Originally from ..\FSComp.txt:1247) + static member impInvalidNumberOfGenericArguments(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3126, GetStringFunc("impInvalidNumberOfGenericArguments",",,,%s,,,%d,,,%d,,,") a0 a1 a2) + /// Invalid value '%s' for unit-of-measure parameter '%s' + /// (Originally from ..\FSComp.txt:1248) + static member impInvalidMeasureArgument1(a0 : System.String, a1 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument1",",,,%s,,,%s,,,") a0 a1) + /// Invalid value unit-of-measure parameter '%s' + /// (Originally from ..\FSComp.txt:1249) + static member impInvalidMeasureArgument2(a0 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument2",",,,%s,,,") a0) + /// Property '%s' on provided type '%s' is neither readable nor writable as it has CanRead=false and CanWrite=false + /// (Originally from ..\FSComp.txt:1250) + static member etPropertyNeedsCanWriteOrCanRead(a0 : System.String, a1 : System.String) = (3128, GetStringFunc("etPropertyNeedsCanWriteOrCanRead",",,,%s,,,%s,,,") a0 a1) + /// A use of 'into' must be followed by the remainder of the computation + /// (Originally from ..\FSComp.txt:1251) + static member tcIntoNeedsRestOfQuery() = (3129, GetStringFunc("tcIntoNeedsRestOfQuery",",,,") ) + /// The operator '%s' does not accept the use of 'into' + /// (Originally from ..\FSComp.txt:1252) + static member tcOperatorDoesntAcceptInto(a0 : System.String) = (3130, GetStringFunc("tcOperatorDoesntAcceptInto",",,,%s,,,") a0) + /// The definition of the custom operator '%s' does not use a valid combination of attribute flags + /// (Originally from ..\FSComp.txt:1253) + static member tcCustomOperationInvalid(a0 : System.String) = (3131, GetStringFunc("tcCustomOperationInvalid",",,,%s,,,") a0) + /// This type definition may not have the 'CLIMutable' attribute. Only record types may have this attribute. + /// (Originally from ..\FSComp.txt:1254) + static member tcThisTypeMayNotHaveACLIMutableAttribute() = (3132, GetStringFunc("tcThisTypeMayNotHaveACLIMutableAttribute",",,,") ) + /// 'member val' definitions are only permitted in types with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + /// (Originally from ..\FSComp.txt:1255) + static member tcAutoPropertyRequiresImplicitConstructionSequence() = (3133, GetStringFunc("tcAutoPropertyRequiresImplicitConstructionSequence",",,,") ) + /// Property definitions may not be declared mutable. To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. + /// (Originally from ..\FSComp.txt:1256) + static member parsMutableOnAutoPropertyShouldBeGetSet() = (3134, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSet",",,,") ) + /// To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. + /// (Originally from ..\FSComp.txt:1257) + static member parsMutableOnAutoPropertyShouldBeGetSetNotJustSet() = (3135, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSetNotJustSet",",,,") ) + /// Type '%s' is illegal because in byref, T cannot contain byref types. + /// (Originally from ..\FSComp.txt:1258) + static member chkNoByrefsOfByrefs(a0 : System.String) = (3136, GetStringFunc("chkNoByrefsOfByrefs",",,,%s,,,") a0) + /// F# supports array ranks between 1 and 32. The value %d is not allowed. + /// (Originally from ..\FSComp.txt:1259) + static member tastopsMaxArrayThirtyTwo(a0 : System.Int32) = (3138, GetStringFunc("tastopsMaxArrayThirtyTwo",",,,%d,,,") a0) + /// In queries, use the form 'for x in n .. m do ...' for ranging over integers + /// (Originally from ..\FSComp.txt:1260) + static member tcNoIntegerForLoopInQuery() = (3139, GetStringFunc("tcNoIntegerForLoopInQuery",",,,") ) + /// 'while' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1261) + static member tcNoWhileInQuery() = (3140, GetStringFunc("tcNoWhileInQuery",",,,") ) + /// 'try/finally' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1262) + static member tcNoTryFinallyInQuery() = (3141, GetStringFunc("tcNoTryFinallyInQuery",",,,") ) + /// 'use' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1263) + static member tcUseMayNotBeUsedInQueries() = (3142, GetStringFunc("tcUseMayNotBeUsedInQueries",",,,") ) + /// 'let!', 'use!' and 'do!' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1264) + static member tcBindMayNotBeUsedInQueries() = (3143, GetStringFunc("tcBindMayNotBeUsedInQueries",",,,") ) + /// 'return' and 'return!' may not be used in queries + /// (Originally from ..\FSComp.txt:1265) + static member tcReturnMayNotBeUsedInQueries() = (3144, GetStringFunc("tcReturnMayNotBeUsedInQueries",",,,") ) + /// This is not a known query operator. Query operators are identifiers such as 'select', 'where', 'sortBy', 'thenBy', 'groupBy', 'groupValBy', 'join', 'groupJoin', 'sumBy' and 'averageBy', defined using corresponding methods on the 'QueryBuilder' type. + /// (Originally from ..\FSComp.txt:1266) + static member tcUnrecognizedQueryOperator() = (3145, GetStringFunc("tcUnrecognizedQueryOperator",",,,") ) + /// 'try/with' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1267) + static member tcTryWithMayNotBeUsedInQueries() = (3146, GetStringFunc("tcTryWithMayNotBeUsedInQueries",",,,") ) + /// This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. + /// (Originally from ..\FSComp.txt:1268) + static member tcNonSimpleLetBindingInQuery() = (3147, GetStringFunc("tcNonSimpleLetBindingInQuery",",,,") ) + /// Too many static parameters. Expected at most %d parameters, but got %d unnamed and %d named parameters. + /// (Originally from ..\FSComp.txt:1269) + static member etTooManyStaticParameters(a0 : System.Int32, a1 : System.Int32, a2 : System.Int32) = (3148, GetStringFunc("etTooManyStaticParameters",",,,%d,,,%d,,,%d,,,") a0 a1 a2) + /// Invalid provided literal value '%s' + /// (Originally from ..\FSComp.txt:1270) + static member infosInvalidProvidedLiteralValue(a0 : System.String) = (3149, GetStringFunc("infosInvalidProvidedLiteralValue",",,,%s,,,") a0) + /// The 'anycpu32bitpreferred' platform can only be used with EXE targets. You must use 'anycpu' instead. + /// (Originally from ..\FSComp.txt:1271) + static member invalidPlatformTarget() = (3150, GetStringFunc("invalidPlatformTarget",",,,") ) + /// This member, function or value declaration may not be declared 'inline' + /// (Originally from ..\FSComp.txt:1272) + static member tcThisValueMayNotBeInlined() = (3151, GetStringFunc("tcThisValueMayNotBeInlined",",,,") ) + /// The provider '%s' returned a non-generated type '%s' in the context of a set of generated types. Consider adjusting the type provider to only return generated types. + /// (Originally from ..\FSComp.txt:1273) + static member etErasedTypeUsedInGeneration(a0 : System.String, a1 : System.String) = (3152, GetStringFunc("etErasedTypeUsedInGeneration",",,,%s,,,%s,,,") a0 a1) + /// Arguments to query operators may require parentheses, e.g. 'where (x > y)' or 'groupBy (x.Length / 10)' + /// (Originally from ..\FSComp.txt:1274) + static member tcUnrecognizedQueryBinaryOperator() = (3153, GetStringFunc("tcUnrecognizedQueryBinaryOperator",",,,") ) + /// A quotation may not involve an assignment to or taking the address of a captured local variable + /// (Originally from ..\FSComp.txt:1275) + static member crefNoSetOfHole() = (3155, GetStringFunc("crefNoSetOfHole",",,,") ) + /// + 1 overload + /// (Originally from ..\FSComp.txt:1276) + static member nicePrintOtherOverloads1() = (GetStringFunc("nicePrintOtherOverloads1",",,,") ) + /// + %d overloads + /// (Originally from ..\FSComp.txt:1277) + static member nicePrintOtherOverloadsN(a0 : System.Int32) = (GetStringFunc("nicePrintOtherOverloadsN",",,,%d,,,") a0) + /// Erased to + /// (Originally from ..\FSComp.txt:1278) + static member erasedTo() = (GetStringFunc("erasedTo",",,,") ) + /// Unexpected token '%s' or incomplete expression + /// (Originally from ..\FSComp.txt:1279) + static member parsUnfinishedExpression(a0 : System.String) = (3156, GetStringFunc("parsUnfinishedExpression",",,,%s,,,") a0) + /// Cannot find code target for this attribute, possibly because the code after the attribute is incomplete. + /// (Originally from ..\FSComp.txt:1280) + static member parsAttributeOnIncompleteCode() = (3158, GetStringFunc("parsAttributeOnIncompleteCode",",,,") ) + /// Type name cannot be empty. + /// (Originally from ..\FSComp.txt:1281) + static member parsTypeNameCannotBeEmpty() = (3159, GetStringFunc("parsTypeNameCannotBeEmpty",",,,") ) + /// Problem reading assembly '%s': %s + /// (Originally from ..\FSComp.txt:1282) + static member buildProblemReadingAssembly(a0 : System.String, a1 : System.String) = (3160, GetStringFunc("buildProblemReadingAssembly",",,,%s,,,%s,,,") a0 a1) + /// Invalid provided field. Provided fields of erased provided types must be literals. + /// (Originally from ..\FSComp.txt:1283) + static member tcTPFieldMustBeLiteral() = (3161, GetStringFunc("tcTPFieldMustBeLiteral",",,,") ) + /// (loading description...) + /// (Originally from ..\FSComp.txt:1284) + static member loadingDescription() = (GetStringFunc("loadingDescription",",,,") ) + /// (description unavailable...) + /// (Originally from ..\FSComp.txt:1285) + static member descriptionUnavailable() = (GetStringFunc("descriptionUnavailable",",,,") ) + /// A type variable has been constrained by multiple different class types. A type variable may only have one class constraint. + /// (Originally from ..\FSComp.txt:1286) + static member chkTyparMultipleClassConstraints() = (3162, GetStringFunc("chkTyparMultipleClassConstraints",",,,") ) + /// 'match' expressions may not be used in queries + /// (Originally from ..\FSComp.txt:1287) + static member tcMatchMayNotBeUsedWithQuery() = (3163, GetStringFunc("tcMatchMayNotBeUsedWithQuery",",,,") ) + /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 3 arguments + /// (Originally from ..\FSComp.txt:1288) + static member memberOperatorDefinitionWithNonTripleArgument(a0 : System.String, a1 : System.Int32) = (3164, GetStringFunc("memberOperatorDefinitionWithNonTripleArgument",",,,%s,,,%d,,,") a0 a1) + /// The operator '%s' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + /// (Originally from ..\FSComp.txt:1289) + static member cannotResolveNullableOperators(a0 : System.String) = (3165, GetStringFunc("cannotResolveNullableOperators",",,,%s,,,") a0) + /// '%s' must be followed by 'in'. Usage: %s. + /// (Originally from ..\FSComp.txt:1290) + static member tcOperatorRequiresIn(a0 : System.String, a1 : System.String) = (3167, GetStringFunc("tcOperatorRequiresIn",",,,%s,,,%s,,,") a0 a1) + /// Neither 'member val' nor 'override val' definitions are permitted in object expressions. + /// (Originally from ..\FSComp.txt:1291) + static member parsIllegalMemberVarInObjectImplementation() = (3168, GetStringFunc("parsIllegalMemberVarInObjectImplementation",",,,") ) + /// Copy-and-update record expressions must include at least one field. + /// (Originally from ..\FSComp.txt:1292) + static member tcEmptyCopyAndUpdateRecordInvalid() = (3169, GetStringFunc("tcEmptyCopyAndUpdateRecordInvalid",",,,") ) + /// '_' cannot be used as field name + /// (Originally from ..\FSComp.txt:1293) + static member parsUnderscoreInvalidFieldName() = (3170, GetStringFunc("parsUnderscoreInvalidFieldName",",,,") ) + /// The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'. + /// (Originally from ..\FSComp.txt:1294) + static member tcGeneratedTypesShouldBeInternalOrPrivate() = (3171, GetStringFunc("tcGeneratedTypesShouldBeInternalOrPrivate",",,,") ) + /// A property's getter and setter must have the same type. Property '%s' has getter of type '%s' but setter of type '%s'. + /// (Originally from ..\FSComp.txt:1295) + static member chkGetterAndSetterHaveSamePropertyType(a0 : System.String, a1 : System.String, a2 : System.String) = (3172, GetStringFunc("chkGetterAndSetterHaveSamePropertyType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. + /// (Originally from ..\FSComp.txt:1296) + static member tcRuntimeSuppliedMethodCannotBeUsedInUserCode(a0 : System.String) = (3173, GetStringFunc("tcRuntimeSuppliedMethodCannotBeUsedInUserCode",",,,%s,,,") a0) + /// Union case/exception '%s' does not have field named '%s'. + /// (Originally from ..\FSComp.txt:1297) + static member tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) + /// Union case/exception field '%s' cannot be used more than once. + /// (Originally from ..\FSComp.txt:1298) + static member tcUnionCaseFieldCannotBeUsedMoreThanOnce(a0 : System.String) = (3175, GetStringFunc("tcUnionCaseFieldCannotBeUsedMoreThanOnce",",,,%s,,,") a0) + /// Named field '%s' is used more than once. + /// (Originally from ..\FSComp.txt:1299) + static member tcFieldNameIsUsedModeThanOnce(a0 : System.String) = (3176, GetStringFunc("tcFieldNameIsUsedModeThanOnce",",,,%s,,,") a0) + /// Named field '%s' conflicts with autogenerated name for anonymous field. + /// (Originally from ..\FSComp.txt:1300) + static member tcFieldNameConflictsWithGeneratedNameForAnonymousField(a0 : System.String) = (3176, GetStringFunc("tcFieldNameConflictsWithGeneratedNameForAnonymousField",",,,%s,,,") a0) + /// This literal expression or attribute argument results in an arithmetic overflow. + /// (Originally from ..\FSComp.txt:1301) + static member tastConstantExpressionOverflow() = (3177, GetStringFunc("tastConstantExpressionOverflow",",,,") ) + /// This is not valid literal expression. The [] attribute will be ignored. + /// (Originally from ..\FSComp.txt:1302) + static member tcIllegalStructTypeForConstantExpression() = (3178, GetStringFunc("tcIllegalStructTypeForConstantExpression",",,,") ) + /// System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes. + /// (Originally from ..\FSComp.txt:1303) + static member fscSystemRuntimeInteropServicesIsRequired() = (3179, GetStringFunc("fscSystemRuntimeInteropServicesIsRequired",",,,") ) + /// The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed. + /// (Originally from ..\FSComp.txt:1304) + static member abImplicitHeapAllocation(a0 : System.String) = (3180, GetStringFunc("abImplicitHeapAllocation",",,,%s,,,") a0) + /// A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid + /// (Originally from ..\FSComp.txt:1305) + static member estApplyStaticArgumentsForMethodNotImplemented() = (GetStringFunc("estApplyStaticArgumentsForMethodNotImplemented",",,,") ) + /// An error occured applying the static arguments to a provided method + /// (Originally from ..\FSComp.txt:1306) + static member etErrorApplyingStaticArgumentsToMethod() = (3181, GetStringFunc("etErrorApplyingStaticArgumentsToMethod",",,,") ) + /// Unexpected character '%s' in preprocessor expression + /// (Originally from ..\FSComp.txt:1307) + static member pplexUnexpectedChar(a0 : System.String) = (3182, GetStringFunc("pplexUnexpectedChar",",,,%s,,,") a0) + /// Unexpected token '%s' in preprocessor expression + /// (Originally from ..\FSComp.txt:1308) + static member ppparsUnexpectedToken(a0 : System.String) = (3183, GetStringFunc("ppparsUnexpectedToken",",,,%s,,,") a0) + /// Incomplete preprocessor expression + /// (Originally from ..\FSComp.txt:1309) + static member ppparsIncompleteExpression() = (3184, GetStringFunc("ppparsIncompleteExpression",",,,") ) + /// Missing token '%s' in preprocessor expression + /// (Originally from ..\FSComp.txt:1310) + static member ppparsMissingToken(a0 : System.String) = (3185, GetStringFunc("ppparsMissingToken",",,,%s,,,") a0) + /// An error occurred while reading the F# metadata node at position %d in table '%s' of assembly '%s'. The node had no matching declaration. Please report this warning. You may need to recompile the F# assembly you are using. + /// (Originally from ..\FSComp.txt:1311) + static member pickleMissingDefinition(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3186, GetStringFunc("pickleMissingDefinition",",,,%d,,,%s,,,%s,,,") a0 a1 a2) + /// Type inference caused the type variable %s to escape its scope. Consider adding an explicit type parameter declaration or adjusting your code to be less generic. + /// (Originally from ..\FSComp.txt:1312) + static member checkNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (3187, GetStringFunc("checkNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) + /// Type inference caused an inference type variable to escape its scope. Consider adding type annotations to make your code less generic. + /// (Originally from ..\FSComp.txt:1313) + static member checkNotSufficientlyGenericBecauseOfScopeAnon() = (3188, GetStringFunc("checkNotSufficientlyGenericBecauseOfScopeAnon",",,,") ) + /// Redundant arguments are being ignored in function '%s'. Expected %d but got %d arguments. + /// (Originally from ..\FSComp.txt:1314) + static member checkRaiseFamilyFunctionArgumentCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3189, GetStringFunc("checkRaiseFamilyFunctionArgumentCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) + /// Lowercase literal '%s' is being shadowed by a new pattern with the same name. Only uppercase and module-prefixed literals can be used as named patterns. + /// (Originally from ..\FSComp.txt:1315) + static member checkLowercaseLiteralBindingInPattern(a0 : System.String) = (3190, GetStringFunc("checkLowercaseLiteralBindingInPattern",",,,%s,,,") a0) + /// This literal pattern does not take arguments + /// (Originally from ..\FSComp.txt:1316) + static member tcLiteralDoesNotTakeArguments() = (3191, GetStringFunc("tcLiteralDoesNotTakeArguments",",,,") ) + /// Constructors are not permitted as extension members - they must be defined as part of the original definition of the type + /// (Originally from ..\FSComp.txt:1317) + static member tcConstructorsIllegalInAugmentation() = (3192, GetStringFunc("tcConstructorsIllegalInAugmentation",",,,") ) + /// Invalid response file '%s' ( '%s' ) + /// (Originally from ..\FSComp.txt:1318) + static member optsInvalidResponseFile(a0 : System.String, a1 : System.String) = (3193, GetStringFunc("optsInvalidResponseFile",",,,%s,,,%s,,,") a0 a1) + /// Response file '%s' not found in '%s' + /// (Originally from ..\FSComp.txt:1319) + static member optsResponseFileNotFound(a0 : System.String, a1 : System.String) = (3194, GetStringFunc("optsResponseFileNotFound",",,,%s,,,%s,,,") a0 a1) + /// Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long + /// (Originally from ..\FSComp.txt:1320) + static member optsResponseFileNameInvalid(a0 : System.String) = (3195, GetStringFunc("optsResponseFileNameInvalid",",,,%s,,,") a0) + /// Cannot find FSharp.Core.dll in compiler's directory + /// (Originally from ..\FSComp.txt:1321) + static member fsharpCoreNotFoundToBeCopied() = (3196, GetStringFunc("fsharpCoreNotFoundToBeCopied",",,,") ) + /// One tuple type is a struct tuple, the other is a reference tuple + /// (Originally from ..\FSComp.txt:1322) + static member tcTupleStructMismatch() = (GetStringFunc("tcTupleStructMismatch",",,,") ) + /// This provided method requires static parameters + /// (Originally from ..\FSComp.txt:1323) + static member etMissingStaticArgumentsToMethod() = (3197, GetStringFunc("etMissingStaticArgumentsToMethod",",,,") ) + /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'. + /// (Originally from ..\FSComp.txt:1324) + static member considerUpcast(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcast",",,,%s,,,%s,,,") a0 a1) + /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator. + /// (Originally from ..\FSComp.txt:1325) + static member considerUpcastOperator(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcastOperator",",,,%s,,,%s,,,") a0 a1) + /// The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored + /// (Originally from ..\FSComp.txt:1326) + static member tcRecImplied() = (3199, GetStringFunc("tcRecImplied",",,,") ) + /// In a recursive declaration group, 'open' declarations must come first in each module + /// (Originally from ..\FSComp.txt:1327) + static member tcOpenFirstInMutRec() = (3200, GetStringFunc("tcOpenFirstInMutRec",",,,") ) + /// In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations + /// (Originally from ..\FSComp.txt:1328) + static member tcModuleAbbrevFirstInMutRec() = (3201, GetStringFunc("tcModuleAbbrevFirstInMutRec",",,,") ) + /// This declaration is not supported in recursive declaration groups + /// (Originally from ..\FSComp.txt:1329) + static member tcUnsupportedMutRecDecl() = (3202, GetStringFunc("tcUnsupportedMutRecDecl",",,,") ) + /// Invalid use of 'rec' keyword + /// (Originally from ..\FSComp.txt:1330) + static member parsInvalidUseOfRec() = (3203, GetStringFunc("parsInvalidUseOfRec",",,,") ) + /// If a union type has more than one case and is a struct, then all fields within the union type must be given unique names. + /// (Originally from ..\FSComp.txt:1331) + static member tcStructUnionMultiCaseDistinctFields() = (3204, GetStringFunc("tcStructUnionMultiCaseDistinctFields",",,,") ) + /// The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute. + /// (Originally from ..\FSComp.txt:1332) + static member CallerMemberNameIsOverriden(a0 : System.String) = (3206, GetStringFunc("CallerMemberNameIsOverriden",",,,%s,,,") a0) + /// Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' + /// (Originally from ..\FSComp.txt:1333) + static member tcFixedNotAllowed() = (3207, GetStringFunc("tcFixedNotAllowed",",,,") ) + /// Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression. + /// (Originally from ..\FSComp.txt:1334) + static member tcCouldNotFindOffsetToStringData() = (3208, GetStringFunc("tcCouldNotFindOffsetToStringData",",,,") ) + /// The address of the variable '%s' cannot be used at this point. A method or function may not return the address of this local value. + /// (Originally from ..\FSComp.txt:1335) + static member chkNoByrefReturnOfLocal(a0 : System.String) = (3209, GetStringFunc("chkNoByrefReturnOfLocal",",,,%s,,,") a0) + /// %s is an active pattern and cannot be treated as a discriminated union case with named fields. + /// (Originally from ..\FSComp.txt:1336) + static member tcNamedActivePattern(a0 : System.String) = (3210, GetStringFunc("tcNamedActivePattern",",,,%s,,,") a0) + /// The default value does not have the same type as the argument. The DefaultParameterValue attribute and any Optional attribute will be ignored. Note: 'null' needs to be annotated with the correct type, e.g. 'DefaultParameterValue(null:obj)'. + /// (Originally from ..\FSComp.txt:1337) + static member DefaultParameterValueNotAppropriateForArgument() = (3211, GetStringFunc("DefaultParameterValueNotAppropriateForArgument",",,,") ) + /// The system type '%s' was required but no referenced system DLL contained this type + /// (Originally from ..\FSComp.txt:1338) + static member tcGlobalsSystemTypeNotFound(a0 : System.String) = (GetStringFunc("tcGlobalsSystemTypeNotFound",",,,%s,,,") a0) + /// The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s. + /// (Originally from ..\FSComp.txt:1339) + static member typrelMemberHasMultiplePossibleDispatchSlots(a0 : System.String, a1 : System.String) = (3213, GetStringFunc("typrelMemberHasMultiplePossibleDispatchSlots",",,,%s,,,%s,,,") a0 a1) + /// Method or object constructor '%s' is not static + /// (Originally from ..\FSComp.txt:1340) + static member methodIsNotStatic(a0 : System.String) = (3214, GetStringFunc("methodIsNotStatic",",,,%s,,,") a0) + /// Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? + /// (Originally from ..\FSComp.txt:1341) + static member parsUnexpectedSymbolEqualsInsteadOfIn() = (3215, GetStringFunc("parsUnexpectedSymbolEqualsInsteadOfIn",",,,") ) + /// Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. + /// (Originally from ..\FSComp.txt:1342) + static member keywordDescriptionAbstract() = (GetStringFunc("keywordDescriptionAbstract",",,,") ) + /// Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. + /// (Originally from ..\FSComp.txt:1343) + static member keyworkDescriptionAnd() = (GetStringFunc("keyworkDescriptionAnd",",,,") ) + /// Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. + /// (Originally from ..\FSComp.txt:1344) + static member keywordDescriptionAs() = (GetStringFunc("keywordDescriptionAs",",,,") ) + /// Used to verify code during debugging. + /// (Originally from ..\FSComp.txt:1345) + static member keywordDescriptionAssert() = (GetStringFunc("keywordDescriptionAssert",",,,") ) + /// Used as the name of the base class object. + /// (Originally from ..\FSComp.txt:1346) + static member keywordDescriptionBase() = (GetStringFunc("keywordDescriptionBase",",,,") ) + /// In verbose syntax, indicates the start of a code block. + /// (Originally from ..\FSComp.txt:1347) + static member keywordDescriptionBegin() = (GetStringFunc("keywordDescriptionBegin",",,,") ) + /// In verbose syntax, indicates the start of a class definition. + /// (Originally from ..\FSComp.txt:1348) + static member keywordDescriptionClass() = (GetStringFunc("keywordDescriptionClass",",,,") ) + /// Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. + /// (Originally from ..\FSComp.txt:1349) + static member keywordDescriptionDefault() = (GetStringFunc("keywordDescriptionDefault",",,,") ) + /// Used to declare a delegate. + /// (Originally from ..\FSComp.txt:1350) + static member keywordDescriptionDelegate() = (GetStringFunc("keywordDescriptionDelegate",",,,") ) + /// Used in looping constructs or to execute imperative code. + /// (Originally from ..\FSComp.txt:1351) + static member keywordDescriptionDo() = (GetStringFunc("keywordDescriptionDo",",,,") ) + /// In verbose syntax, indicates the end of a block of code in a looping expression. + /// (Originally from ..\FSComp.txt:1352) + static member keywordDescriptionDone() = (GetStringFunc("keywordDescriptionDone",",,,") ) + /// Used to convert to a type that is lower in the inheritance chain. + /// (Originally from ..\FSComp.txt:1353) + static member keywordDescriptionDowncast() = (GetStringFunc("keywordDescriptionDowncast",",,,") ) + /// In a for expression, used when counting in reverse. + /// (Originally from ..\FSComp.txt:1354) + static member keywordDescriptionDownto() = (GetStringFunc("keywordDescriptionDownto",",,,") ) + /// Used in conditional branching. A short form of else if. + /// (Originally from ..\FSComp.txt:1355) + static member keywordDescriptionElif() = (GetStringFunc("keywordDescriptionElif",",,,") ) + /// Used in conditional branching. + /// (Originally from ..\FSComp.txt:1356) + static member keywordDescriptionElse() = (GetStringFunc("keywordDescriptionElse",",,,") ) + /// In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. + /// (Originally from ..\FSComp.txt:1357) + static member keywordDescriptionEnd() = (GetStringFunc("keywordDescriptionEnd",",,,") ) + /// Used to declare an exception type. + /// (Originally from ..\FSComp.txt:1358) + static member keywordDescriptionException() = (GetStringFunc("keywordDescriptionException",",,,") ) + /// Indicates that a declared program element is defined in another binary or assembly. + /// (Originally from ..\FSComp.txt:1359) + static member keywordDescriptionExtern() = (GetStringFunc("keywordDescriptionExtern",",,,") ) + /// Used as a Boolean literal. + /// (Originally from ..\FSComp.txt:1360) + static member keywordDescriptionTrueFalse() = (GetStringFunc("keywordDescriptionTrueFalse",",,,") ) + /// Used together with try to introduce a block of code that executes regardless of whether an exception occurs. + /// (Originally from ..\FSComp.txt:1361) + static member keywordDescriptionFinally() = (GetStringFunc("keywordDescriptionFinally",",,,") ) + /// Used in looping constructs. + /// (Originally from ..\FSComp.txt:1362) + static member keywordDescriptionFor() = (GetStringFunc("keywordDescriptionFor",",,,") ) + /// Used in lambda expressions, also known as anonymous functions. + /// (Originally from ..\FSComp.txt:1363) + static member keywordDescriptionFun() = (GetStringFunc("keywordDescriptionFun",",,,") ) + /// Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. + /// (Originally from ..\FSComp.txt:1364) + static member keywordDescriptionFunction() = (GetStringFunc("keywordDescriptionFunction",",,,") ) + /// Used to reference the top-level .NET namespace. + /// (Originally from ..\FSComp.txt:1365) + static member keywordDescriptionGlobal() = (GetStringFunc("keywordDescriptionGlobal",",,,") ) + /// Used in conditional branching constructs. + /// (Originally from ..\FSComp.txt:1366) + static member keywordDescriptionIf() = (GetStringFunc("keywordDescriptionIf",",,,") ) + /// Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. + /// (Originally from ..\FSComp.txt:1367) + static member keywordDescriptionIn() = (GetStringFunc("keywordDescriptionIn",",,,") ) + /// Used to specify a base class or base interface. + /// (Originally from ..\FSComp.txt:1368) + static member keywordDescriptionInherit() = (GetStringFunc("keywordDescriptionInherit",",,,") ) + /// Used to indicate a function that should be integrated directly into the caller's code. + /// (Originally from ..\FSComp.txt:1369) + static member keywordDescriptionInline() = (GetStringFunc("keywordDescriptionInline",",,,") ) + /// Used to declare and implement interfaces. + /// (Originally from ..\FSComp.txt:1370) + static member keywordDescriptionInterface() = (GetStringFunc("keywordDescriptionInterface",",,,") ) + /// Used to specify that a member is visible inside an assembly but not outside it. + /// (Originally from ..\FSComp.txt:1371) + static member keywordDescriptionInternal() = (GetStringFunc("keywordDescriptionInternal",",,,") ) + /// Used to specify a computation that is to be performed only when a result is needed. + /// (Originally from ..\FSComp.txt:1372) + static member keywordDescriptionLazy() = (GetStringFunc("keywordDescriptionLazy",",,,") ) + /// Used to associate, or bind, a name to a value or function. + /// (Originally from ..\FSComp.txt:1373) + static member keywordDescriptionLet() = (GetStringFunc("keywordDescriptionLet",",,,") ) + /// Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type. + /// (Originally from ..\FSComp.txt:1374) + static member keywordDescriptionLetBang() = (GetStringFunc("keywordDescriptionLetBang",",,,") ) + /// Used to branch by comparing a value to a pattern. + /// (Originally from ..\FSComp.txt:1375) + static member keywordDescriptionMatch() = (GetStringFunc("keywordDescriptionMatch",",,,") ) + /// Used to declare a property or method in an object type. + /// (Originally from ..\FSComp.txt:1376) + static member keywordDescriptionMember() = (GetStringFunc("keywordDescriptionMember",",,,") ) + /// Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. + /// (Originally from ..\FSComp.txt:1377) + static member keywordDescriptionModule() = (GetStringFunc("keywordDescriptionModule",",,,") ) + /// Used to declare a variable, that is, a value that can be changed. + /// (Originally from ..\FSComp.txt:1378) + static member keywordDescriptionMutable() = (GetStringFunc("keywordDescriptionMutable",",,,") ) + /// Used to associate a name with a group of related types and modules, to logically separate it from other code. + /// (Originally from ..\FSComp.txt:1379) + static member keywordDescriptionNamespace() = (GetStringFunc("keywordDescriptionNamespace",",,,") ) + /// Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. + /// (Originally from ..\FSComp.txt:1380) + static member keywordDescriptionNew() = (GetStringFunc("keywordDescriptionNew",",,,") ) + /// Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. + /// (Originally from ..\FSComp.txt:1381) + static member keywordDescriptionNot() = (GetStringFunc("keywordDescriptionNot",",,,") ) + /// Indicates the absence of an object. Also used in generic parameter constraints. + /// (Originally from ..\FSComp.txt:1382) + static member keywordDescriptionNull() = (GetStringFunc("keywordDescriptionNull",",,,") ) + /// Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. + /// (Originally from ..\FSComp.txt:1383) + static member keywordDescriptionOf() = (GetStringFunc("keywordDescriptionOf",",,,") ) + /// Used to make the contents of a namespace or module available without qualification. + /// (Originally from ..\FSComp.txt:1384) + static member keywordDescriptionOpen() = (GetStringFunc("keywordDescriptionOpen",",,,") ) + /// Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. + /// (Originally from ..\FSComp.txt:1385) + static member keywordDescriptionOr() = (GetStringFunc("keywordDescriptionOr",",,,") ) + /// Used to implement a version of an abstract or virtual method that differs from the base version. + /// (Originally from ..\FSComp.txt:1386) + static member keywordDescriptionOverride() = (GetStringFunc("keywordDescriptionOverride",",,,") ) + /// Restricts access to a member to code in the same type or module. + /// (Originally from ..\FSComp.txt:1387) + static member keywordDescriptionPrivate() = (GetStringFunc("keywordDescriptionPrivate",",,,") ) + /// Allows access to a member from outside the type. + /// (Originally from ..\FSComp.txt:1388) + static member keywordDescriptionPublic() = (GetStringFunc("keywordDescriptionPublic",",,,") ) + /// Used to indicate that a function is recursive. + /// (Originally from ..\FSComp.txt:1389) + static member keywordDescriptionRec() = (GetStringFunc("keywordDescriptionRec",",,,") ) + /// Used to indicate a value to provide as the result of a computation expression. + /// (Originally from ..\FSComp.txt:1390) + static member keywordDescriptionReturn() = (GetStringFunc("keywordDescriptionReturn",",,,") ) + /// Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression. + /// (Originally from ..\FSComp.txt:1391) + static member keywordDescriptionReturnBang() = (GetStringFunc("keywordDescriptionReturnBang",",,,") ) + /// Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. + /// (Originally from ..\FSComp.txt:1392) + static member keywordDescriptionSelect() = (GetStringFunc("keywordDescriptionSelect",",,,") ) + /// Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. + /// (Originally from ..\FSComp.txt:1393) + static member keywordDescriptionStatic() = (GetStringFunc("keywordDescriptionStatic",",,,") ) + /// Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. + /// (Originally from ..\FSComp.txt:1394) + static member keywordDescriptionStruct() = (GetStringFunc("keywordDescriptionStruct",",,,") ) + /// Used in conditional expressions. Also used to perform side effects after object construction. + /// (Originally from ..\FSComp.txt:1395) + static member keywordDescriptionThen() = (GetStringFunc("keywordDescriptionThen",",,,") ) + /// Used in for loops to indicate a range. + /// (Originally from ..\FSComp.txt:1396) + static member keywordDescriptionTo() = (GetStringFunc("keywordDescriptionTo",",,,") ) + /// Used to introduce a block of code that might generate an exception. Used together with with or finally. + /// (Originally from ..\FSComp.txt:1397) + static member keywordDescriptionTry() = (GetStringFunc("keywordDescriptionTry",",,,") ) + /// Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. + /// (Originally from ..\FSComp.txt:1398) + static member keywordDescriptionType() = (GetStringFunc("keywordDescriptionType",",,,") ) + /// Used to convert to a type that is higher in the inheritance chain. + /// (Originally from ..\FSComp.txt:1399) + static member keywordDescriptionUpcast() = (GetStringFunc("keywordDescriptionUpcast",",,,") ) + /// Used instead of let for values that require Dispose to be called to free resources. + /// (Originally from ..\FSComp.txt:1400) + static member keywordDescriptionUse() = (GetStringFunc("keywordDescriptionUse",",,,") ) + /// Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources. + /// (Originally from ..\FSComp.txt:1401) + static member keywordDescriptionUseBang() = (GetStringFunc("keywordDescriptionUseBang",",,,") ) + /// Used in a signature to indicate a value, or in a type to declare a member, in limited situations. + /// (Originally from ..\FSComp.txt:1402) + static member keywordDescriptionVal() = (GetStringFunc("keywordDescriptionVal",",,,") ) + /// Indicates the .NET void type. Used when interoperating with other .NET languages. + /// (Originally from ..\FSComp.txt:1403) + static member keywordDescriptionVoid() = (GetStringFunc("keywordDescriptionVoid",",,,") ) + /// Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. + /// (Originally from ..\FSComp.txt:1404) + static member keywordDescriptionWhen() = (GetStringFunc("keywordDescriptionWhen",",,,") ) + /// Introduces a looping construct. + /// (Originally from ..\FSComp.txt:1405) + static member keywordDescriptionWhile() = (GetStringFunc("keywordDescriptionWhile",",,,") ) + /// Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. + /// (Originally from ..\FSComp.txt:1406) + static member keywordDescriptionWith() = (GetStringFunc("keywordDescriptionWith",",,,") ) + /// Used in a sequence expression to produce a value for a sequence. + /// (Originally from ..\FSComp.txt:1407) + static member keywordDescriptionYield() = (GetStringFunc("keywordDescriptionYield",",,,") ) + /// Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. + /// (Originally from ..\FSComp.txt:1408) + static member keywordDescriptionYieldBang() = (GetStringFunc("keywordDescriptionYieldBang",",,,") ) + /// In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions + /// (Originally from ..\FSComp.txt:1409) + static member keywordDescriptionRightArrow() = (GetStringFunc("keywordDescriptionRightArrow",",,,") ) + /// Assigns a value to a variable. + /// (Originally from ..\FSComp.txt:1410) + static member keywordDescriptionLeftArrow() = (GetStringFunc("keywordDescriptionLeftArrow",",,,") ) + /// Converts a type to type that is higher in the hierarchy. + /// (Originally from ..\FSComp.txt:1411) + static member keywordDescriptionCast() = (GetStringFunc("keywordDescriptionCast",",,,") ) + /// Converts a type to a type that is lower in the hierarchy. + /// (Originally from ..\FSComp.txt:1412) + static member keywordDescriptionDynamicCast() = (GetStringFunc("keywordDescriptionDynamicCast",",,,") ) + /// Delimits a typed code quotation. + /// (Originally from ..\FSComp.txt:1413) + static member keywordDescriptionTypedQuotation() = (GetStringFunc("keywordDescriptionTypedQuotation",",,,") ) + /// Delimits a untyped code quotation. + /// (Originally from ..\FSComp.txt:1414) + static member keywordDescriptionUntypedQuotation() = (GetStringFunc("keywordDescriptionUntypedQuotation",",,,") ) + /// %s '%s' not found in assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. + /// (Originally from ..\FSComp.txt:1415) + static member itemNotFoundDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String) = (3216, GetStringFunc("itemNotFoundDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// %s '%s' not found in type '%s' from assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. + /// (Originally from ..\FSComp.txt:1416) + static member itemNotFoundInTypeDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3216, GetStringFunc("itemNotFoundInTypeDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) + /// is + /// (Originally from ..\FSComp.txt:1417) + static member descriptionWordIs() = (GetStringFunc("descriptionWordIs",",,,") ) + /// This value is not a function and cannot be applied. + /// (Originally from ..\FSComp.txt:1418) + static member notAFunction() = (GetStringFunc("notAFunction",",,,") ) + /// This value is not a function and cannot be applied. Did you intend to access the indexer via %s.[index] instead? + /// (Originally from ..\FSComp.txt:1419) + static member notAFunctionButMaybeIndexerWithName(a0 : System.String) = (GetStringFunc("notAFunctionButMaybeIndexerWithName",",,,%s,,,") a0) + /// This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? + /// (Originally from ..\FSComp.txt:1420) + static member notAFunctionButMaybeIndexer() = (GetStringFunc("notAFunctionButMaybeIndexer",",,,") ) + /// + /// (Originally from ..\FSComp.txt:1421) + static member notAFunctionButMaybeIndexerErrorCode() = (3217, GetStringFunc("notAFunctionButMaybeIndexerErrorCode",",,,") ) + /// This value is not a function and cannot be applied. Did you forget to terminate a declaration? + /// (Originally from ..\FSComp.txt:1422) + static member notAFunctionButMaybeDeclaration() = (GetStringFunc("notAFunctionButMaybeDeclaration",",,,") ) + /// The argument names in the signature '%s' and implementation '%s' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. + /// (Originally from ..\FSComp.txt:1423) + static member ArgumentsInSigAndImplMismatch(a0 : System.String, a1 : System.String) = (3218, GetStringFunc("ArgumentsInSigAndImplMismatch",",,,%s,,,%s,,,") a0 a1) + /// An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. + /// (Originally from ..\FSComp.txt:1424) + static member pickleUnexpectedNonZero(a0 : System.String) = (3219, GetStringFunc("pickleUnexpectedNonZero",",,,%s,,,") a0) + + /// Call this method once to validate that all known resources are valid; throws if not + static member RunStartupValidation() = + ignore(GetString("undefinedNameNamespace")) + ignore(GetString("undefinedNameNamespaceOrModule")) + ignore(GetString("undefinedNameFieldConstructorOrMember")) + ignore(GetString("undefinedNameValueConstructorNamespaceOrType")) + ignore(GetString("undefinedNameValueOfConstructor")) + ignore(GetString("undefinedNameValueNamespaceTypeOrModule")) + ignore(GetString("undefinedNameConstructorModuleOrNamespace")) + ignore(GetString("undefinedNameType")) + ignore(GetString("undefinedNameTypeIn")) + ignore(GetString("undefinedNameRecordLabelOrNamespace")) + ignore(GetString("undefinedNameRecordLabel")) + ignore(GetString("undefinedNameSuggestionsIntro")) + ignore(GetString("undefinedNameTypeParameter")) + ignore(GetString("undefinedNamePatternDiscriminator")) + ignore(GetString("replaceWithSuggestion")) + ignore(GetString("addIndexerDot")) + ignore(GetString("listElementHasWrongType")) + ignore(GetString("arrayElementHasWrongType")) + ignore(GetString("missingElseBranch")) + ignore(GetString("ifExpression")) + ignore(GetString("elseBranchHasWrongType")) + ignore(GetString("followingPatternMatchClauseHasWrongType")) + ignore(GetString("patternMatchGuardIsNotBool")) + ignore(GetString("commaInsteadOfSemicolonInRecord")) + ignore(GetString("derefInsteadOfNot")) + ignore(GetString("buildUnexpectedTypeArgs")) + ignore(GetString("returnUsedInsteadOfReturnBang")) + ignore(GetString("yieldUsedInsteadOfYieldBang")) + ignore(GetString("tupleRequiredInAbstractMethod")) + ignore(GetString("buildInvalidWarningNumber")) + ignore(GetString("buildInvalidVersionString")) + ignore(GetString("buildInvalidVersionFile")) + ignore(GetString("buildProductName")) + ignore(GetString("buildProductNameCommunity")) + ignore(GetString("buildProblemWithFilename")) + ignore(GetString("buildNoInputsSpecified")) + ignore(GetString("buildPdbRequiresDebug")) + ignore(GetString("buildInvalidSearchDirectory")) + ignore(GetString("buildSearchDirectoryNotFound")) + ignore(GetString("buildInvalidFilename")) + ignore(GetString("buildInvalidAssemblyName")) + ignore(GetString("buildInvalidPrivacy")) + ignore(GetString("buildMultipleReferencesNotAllowed")) + ignore(GetString("buildCouldNotReadVersionInfoFromMscorlib")) + ignore(GetString("buildCannotReadAssembly")) + ignore(GetString("buildAssemblyResolutionFailed")) + ignore(GetString("buildImplicitModuleIsNotLegalIdentifier")) + ignore(GetString("buildMultiFileRequiresNamespaceOrModule")) + ignore(GetString("noEqualSignAfterModule")) + ignore(GetString("buildMultipleToplevelModules")) + ignore(GetString("buildOptionRequiresParameter")) + ignore(GetString("buildCouldNotFindSourceFile")) + ignore(GetString("buildInvalidSourceFileExtension")) + ignore(GetString("buildCouldNotResolveAssembly")) + ignore(GetString("buildCouldNotResolveAssemblyRequiredByFile")) + ignore(GetString("buildErrorOpeningBinaryFile")) + ignore(GetString("buildDifferentVersionMustRecompile")) + ignore(GetString("buildInvalidHashIDirective")) + ignore(GetString("buildInvalidHashrDirective")) + ignore(GetString("buildInvalidHashloadDirective")) + ignore(GetString("buildInvalidHashtimeDirective")) + ignore(GetString("buildDirectivesInModulesAreIgnored")) + ignore(GetString("buildSignatureAlreadySpecified")) + ignore(GetString("buildImplementationAlreadyGivenDetail")) + ignore(GetString("buildImplementationAlreadyGiven")) + ignore(GetString("buildSignatureWithoutImplementation")) + ignore(GetString("buildArgInvalidInt")) + ignore(GetString("buildArgInvalidFloat")) + ignore(GetString("buildUnrecognizedOption")) + ignore(GetString("buildInvalidModuleOrNamespaceName")) + ignore(GetString("pickleErrorReadingWritingMetadata")) + ignore(GetString("tastTypeOrModuleNotConcrete")) + ignore(GetString("tastTypeHasAssemblyCodeRepresentation")) + ignore(GetString("tastNamespaceAndModuleWithSameNameInAssembly")) + ignore(GetString("tastTwoModulesWithSameNameInAssembly")) + ignore(GetString("tastDuplicateTypeDefinitionInAssembly")) + ignore(GetString("tastConflictingModuleAndTypeDefinitionInAssembly")) + ignore(GetString("tastInvalidMemberSignature")) + ignore(GetString("tastValueDoesNotHaveSetterType")) + ignore(GetString("tastInvalidFormForPropertyGetter")) + ignore(GetString("tastInvalidFormForPropertySetter")) + ignore(GetString("tastUnexpectedByRef")) + ignore(GetString("tastValueMustBeLocalAndMutable")) + ignore(GetString("tastInvalidMutationOfConstant")) + ignore(GetString("tastValueHasBeenCopied")) + ignore(GetString("tastRecursiveValuesMayNotBeInConstructionOfTuple")) + ignore(GetString("tastRecursiveValuesMayNotAppearInConstructionOfType")) + ignore(GetString("tastRecursiveValuesMayNotBeAssignedToNonMutableField")) + ignore(GetString("tastUnexpectedDecodeOfAutoOpenAttribute")) + ignore(GetString("tastUnexpectedDecodeOfInternalsVisibleToAttribute")) + ignore(GetString("tastUnexpectedDecodeOfInterfaceDataVersionAttribute")) + ignore(GetString("tastActivePatternsLimitedToSeven")) + ignore(GetString("tastNotAConstantExpression")) + ignore(GetString("ValueNotContainedMutabilityAttributesDiffer")) + ignore(GetString("ValueNotContainedMutabilityNamesDiffer")) + ignore(GetString("ValueNotContainedMutabilityCompiledNamesDiffer")) + ignore(GetString("ValueNotContainedMutabilityDisplayNamesDiffer")) + ignore(GetString("ValueNotContainedMutabilityAccessibilityMore")) + ignore(GetString("ValueNotContainedMutabilityInlineFlagsDiffer")) + ignore(GetString("ValueNotContainedMutabilityLiteralConstantValuesDiffer")) + ignore(GetString("ValueNotContainedMutabilityOneIsTypeFunction")) + ignore(GetString("ValueNotContainedMutabilityParameterCountsDiffer")) + ignore(GetString("ValueNotContainedMutabilityTypesDiffer")) + ignore(GetString("ValueNotContainedMutabilityExtensionsDiffer")) + ignore(GetString("ValueNotContainedMutabilityArityNotInferred")) + ignore(GetString("ValueNotContainedMutabilityGenericParametersDiffer")) + ignore(GetString("ValueNotContainedMutabilityGenericParametersAreDifferentKinds")) + ignore(GetString("ValueNotContainedMutabilityAritiesDiffer")) + ignore(GetString("ValueNotContainedMutabilityDotNetNamesDiffer")) + ignore(GetString("ValueNotContainedMutabilityStaticsDiffer")) + ignore(GetString("ValueNotContainedMutabilityVirtualsDiffer")) + ignore(GetString("ValueNotContainedMutabilityAbstractsDiffer")) + ignore(GetString("ValueNotContainedMutabilityFinalsDiffer")) + ignore(GetString("ValueNotContainedMutabilityOverridesDiffer")) + ignore(GetString("ValueNotContainedMutabilityOneIsConstructor")) + ignore(GetString("ValueNotContainedMutabilityStaticButInstance")) + ignore(GetString("ValueNotContainedMutabilityInstanceButStatic")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleNamesDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleMissingInterface")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplementationSealed")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleNumbersDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleImplDefinesStruct")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleTypeIsHidden")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleILDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleFieldWasPresent")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig")) + ignore(GetString("DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation")) + ignore(GetString("ModuleContainsConstructorButNamesDiffer")) + ignore(GetString("ModuleContainsConstructorButDataFieldsDiffer")) + ignore(GetString("ModuleContainsConstructorButTypesOfFieldsDiffer")) + ignore(GetString("ModuleContainsConstructorButAccessibilityDiffers")) + ignore(GetString("FieldNotContainedNamesDiffer")) + ignore(GetString("FieldNotContainedAccessibilitiesDiffer")) + ignore(GetString("FieldNotContainedStaticsDiffer")) + ignore(GetString("FieldNotContainedMutablesDiffer")) + ignore(GetString("FieldNotContainedLiteralsDiffer")) + ignore(GetString("FieldNotContainedTypesDiffer")) + ignore(GetString("typrelCannotResolveImplicitGenericInstantiation")) + ignore(GetString("typrelCannotResolveAmbiguityInOverloadedOperator")) + ignore(GetString("typrelCannotResolveAmbiguityInPrintf")) + ignore(GetString("typrelCannotResolveAmbiguityInEnum")) + ignore(GetString("typrelCannotResolveAmbiguityInDelegate")) + ignore(GetString("typrelInvalidValue")) + ignore(GetString("typrelSigImplNotCompatibleParamCountsDiffer")) + ignore(GetString("typrelSigImplNotCompatibleCompileTimeRequirementsDiffer")) + ignore(GetString("typrelSigImplNotCompatibleConstraintsDiffer")) + ignore(GetString("typrelSigImplNotCompatibleConstraintsDifferRemove")) + ignore(GetString("typrelTypeImplementsIComparableShouldOverrideObjectEquals")) + ignore(GetString("typrelTypeImplementsIComparableDefaultObjectEqualsProvided")) + ignore(GetString("typrelExplicitImplementationOfGetHashCodeOrEquals")) + ignore(GetString("typrelExplicitImplementationOfGetHashCode")) + ignore(GetString("typrelExplicitImplementationOfEquals")) + ignore(GetString("ExceptionDefsNotCompatibleHiddenBySignature")) + ignore(GetString("ExceptionDefsNotCompatibleDotNetRepresentationsDiffer")) + ignore(GetString("ExceptionDefsNotCompatibleAbbreviationHiddenBySignature")) + ignore(GetString("ExceptionDefsNotCompatibleSignaturesDiffer")) + ignore(GetString("ExceptionDefsNotCompatibleExceptionDeclarationsDiffer")) + ignore(GetString("ExceptionDefsNotCompatibleFieldInSigButNotImpl")) + ignore(GetString("ExceptionDefsNotCompatibleFieldInImplButNotSig")) + ignore(GetString("ExceptionDefsNotCompatibleFieldOrderDiffers")) + ignore(GetString("typrelModuleNamespaceAttributesDifferInSigAndImpl")) + ignore(GetString("typrelMethodIsOverconstrained")) + ignore(GetString("typrelOverloadNotFound")) + ignore(GetString("typrelOverrideWasAmbiguous")) + ignore(GetString("typrelMoreThenOneOverride")) + ignore(GetString("typrelMethodIsSealed")) + ignore(GetString("typrelOverrideImplementsMoreThenOneSlot")) + ignore(GetString("typrelDuplicateInterface")) + ignore(GetString("typrelNeedExplicitImplementation")) + ignore(GetString("typrelNamedArgumentHasBeenAssignedMoreThenOnce")) + ignore(GetString("typrelNoImplementationGiven")) + ignore(GetString("typrelNoImplementationGivenWithSuggestion")) + ignore(GetString("typrelMemberDoesNotHaveCorrectNumberOfArguments")) + ignore(GetString("typrelMemberDoesNotHaveCorrectNumberOfTypeParameters")) + ignore(GetString("typrelMemberDoesNotHaveCorrectKindsOfGenericParameters")) + ignore(GetString("typrelMemberCannotImplement")) + ignore(GetString("astParseEmbeddedILError")) + ignore(GetString("astParseEmbeddedILTypeError")) + ignore(GetString("astDeprecatedIndexerNotation")) + ignore(GetString("astInvalidExprLeftHandOfAssignment")) + ignore(GetString("augNoRefEqualsOnStruct")) + ignore(GetString("augInvalidAttrs")) + ignore(GetString("augNoEqualityNeedsNoComparison")) + ignore(GetString("augStructCompNeedsStructEquality")) + ignore(GetString("augStructEqNeedsNoCompOrStructComp")) + ignore(GetString("augTypeCantHaveRefEqAndStructAttrs")) + ignore(GetString("augOnlyCertainTypesCanHaveAttrs")) + ignore(GetString("augRefEqCantHaveObjEquals")) + ignore(GetString("augCustomEqNeedsObjEquals")) + ignore(GetString("augCustomCompareNeedsIComp")) + ignore(GetString("augNoEqNeedsNoObjEquals")) + ignore(GetString("augNoCompCantImpIComp")) + ignore(GetString("augCustomEqNeedsNoCompOrCustomComp")) + ignore(GetString("forPositionalSpecifiersNotPermitted")) + ignore(GetString("forMissingFormatSpecifier")) + ignore(GetString("forFlagSetTwice")) + ignore(GetString("forPrefixFlagSpacePlusSetTwice")) + ignore(GetString("forHashSpecifierIsInvalid")) + ignore(GetString("forBadPrecision")) + ignore(GetString("forBadWidth")) + ignore(GetString("forDoesNotSupportZeroFlag")) + ignore(GetString("forPrecisionMissingAfterDot")) + ignore(GetString("forFormatDoesntSupportPrecision")) + ignore(GetString("forBadFormatSpecifier")) + ignore(GetString("forLIsUnnecessary")) + ignore(GetString("forHIsUnnecessary")) + ignore(GetString("forDoesNotSupportPrefixFlag")) + ignore(GetString("forBadFormatSpecifierGeneral")) + ignore(GetString("elSysEnvExitDidntExit")) + ignore(GetString("elDeprecatedOperator")) + ignore(GetString("chkProtectedOrBaseCalled")) + ignore(GetString("chkByrefUsedInInvalidWay")) + ignore(GetString("chkBaseUsedInInvalidWay")) + ignore(GetString("chkVariableUsedInInvalidWay")) + ignore(GetString("chkTypeLessAccessibleThanType")) + ignore(GetString("chkSystemVoidOnlyInTypeof")) + ignore(GetString("chkErrorUseOfByref")) + ignore(GetString("chkErrorContainsCallToRethrow")) + ignore(GetString("chkSplicingOnlyInQuotations")) + ignore(GetString("chkNoFirstClassSplicing")) + ignore(GetString("chkNoFirstClassAddressOf")) + ignore(GetString("chkNoFirstClassRethrow")) + ignore(GetString("chkNoByrefAtThisPoint")) + ignore(GetString("chkLimitationsOfBaseKeyword")) + ignore(GetString("chkObjCtorsCantUseExceptionHandling")) + ignore(GetString("chkNoAddressOfAtThisPoint")) + ignore(GetString("chkNoAddressStaticFieldAtThisPoint")) + ignore(GetString("chkNoAddressFieldAtThisPoint")) + ignore(GetString("chkNoAddressOfArrayElementAtThisPoint")) + ignore(GetString("chkFirstClassFuncNoByref")) + ignore(GetString("chkReturnTypeNoByref")) + ignore(GetString("chkInvalidCustAttrVal")) + ignore(GetString("chkAttrHasAllowMultiFalse")) + ignore(GetString("chkMemberUsedInInvalidWay")) + ignore(GetString("chkNoByrefAsTopValue")) + ignore(GetString("chkReflectedDefCantSplice")) + ignore(GetString("chkEntryPointUsage")) + ignore(GetString("chkUnionCaseCompiledForm")) + ignore(GetString("chkUnionCaseDefaultAugmentation")) + ignore(GetString("chkPropertySameNameMethod")) + ignore(GetString("chkGetterSetterDoNotMatchAbstract")) + ignore(GetString("chkPropertySameNameIndexer")) + ignore(GetString("chkCantStoreByrefValue")) + ignore(GetString("chkDuplicateMethod")) + ignore(GetString("chkDuplicateMethodWithSuffix")) + ignore(GetString("chkDuplicateMethodCurried")) + ignore(GetString("chkCurriedMethodsCantHaveOutParams")) + ignore(GetString("chkDuplicateProperty")) + ignore(GetString("chkDuplicatePropertyWithSuffix")) + ignore(GetString("chkDuplicateMethodInheritedType")) + ignore(GetString("chkDuplicateMethodInheritedTypeWithSuffix")) + ignore(GetString("chkMultipleGenericInterfaceInstantiations")) + ignore(GetString("chkValueWithDefaultValueMustHaveDefaultValue")) + ignore(GetString("chkNoByrefInTypeAbbrev")) + ignore(GetString("crefBoundVarUsedInSplice")) + ignore(GetString("crefQuotationsCantContainGenericExprs")) + ignore(GetString("crefQuotationsCantContainGenericFunctions")) + ignore(GetString("crefQuotationsCantContainObjExprs")) + ignore(GetString("crefQuotationsCantContainAddressOf")) + ignore(GetString("crefQuotationsCantContainStaticFieldRef")) + ignore(GetString("crefQuotationsCantContainInlineIL")) + ignore(GetString("crefQuotationsCantContainDescendingForLoops")) + ignore(GetString("crefQuotationsCantFetchUnionIndexes")) + ignore(GetString("crefQuotationsCantSetUnionFields")) + ignore(GetString("crefQuotationsCantSetExceptionFields")) + ignore(GetString("crefQuotationsCantRequireByref")) + ignore(GetString("crefQuotationsCantCallTraitMembers")) + ignore(GetString("crefQuotationsCantContainThisConstant")) + ignore(GetString("crefQuotationsCantContainThisPatternMatch")) + ignore(GetString("crefQuotationsCantContainArrayPatternMatching")) + ignore(GetString("crefQuotationsCantContainThisType")) + ignore(GetString("csTypeCannotBeResolvedAtCompileTime")) + ignore(GetString("csCodeLessGeneric")) + ignore(GetString("csTypeInferenceMaxDepth")) + ignore(GetString("csExpectedArguments")) + ignore(GetString("csIndexArgumentMismatch")) + ignore(GetString("csExpectTypeWithOperatorButGivenFunction")) + ignore(GetString("csExpectTypeWithOperatorButGivenTuple")) + ignore(GetString("csTypesDoNotSupportOperator")) + ignore(GetString("csTypeDoesNotSupportOperator")) + ignore(GetString("csTypesDoNotSupportOperatorNullable")) + ignore(GetString("csTypeDoesNotSupportOperatorNullable")) + ignore(GetString("csTypeDoesNotSupportConversion")) + ignore(GetString("csMethodFoundButIsStatic")) + ignore(GetString("csMethodFoundButIsNotStatic")) + ignore(GetString("csStructConstraintInconsistent")) + ignore(GetString("csTypeDoesNotHaveNull")) + ignore(GetString("csNullableTypeDoesNotHaveNull")) + ignore(GetString("csTypeDoesNotSupportComparison1")) + ignore(GetString("csTypeDoesNotSupportComparison2")) + ignore(GetString("csTypeDoesNotSupportComparison3")) + ignore(GetString("csTypeDoesNotSupportEquality1")) + ignore(GetString("csTypeDoesNotSupportEquality2")) + ignore(GetString("csTypeDoesNotSupportEquality3")) + ignore(GetString("csTypeIsNotEnumType")) + ignore(GetString("csTypeHasNonStandardDelegateType")) + ignore(GetString("csTypeIsNotDelegateType")) + ignore(GetString("csTypeParameterCannotBeNullable")) + ignore(GetString("csGenericConstructRequiresStructType")) + ignore(GetString("csGenericConstructRequiresUnmanagedType")) + ignore(GetString("csTypeNotCompatibleBecauseOfPrintf")) + ignore(GetString("csGenericConstructRequiresReferenceSemantics")) + ignore(GetString("csGenericConstructRequiresNonAbstract")) + ignore(GetString("csGenericConstructRequiresPublicDefaultConstructor")) + ignore(GetString("csTypeInstantiationLengthMismatch")) + ignore(GetString("csOptionalArgumentNotPermittedHere")) + ignore(GetString("csMemberIsNotStatic")) + ignore(GetString("csMemberIsNotInstance")) + ignore(GetString("csArgumentLengthMismatch")) + ignore(GetString("csArgumentTypesDoNotMatch")) + ignore(GetString("csMethodExpectsParams")) + ignore(GetString("csMemberIsNotAccessible")) + ignore(GetString("csMemberIsNotAccessible2")) + ignore(GetString("csMethodIsNotAStaticMethod")) + ignore(GetString("csMethodIsNotAnInstanceMethod")) + ignore(GetString("csMemberHasNoArgumentOrReturnProperty")) + ignore(GetString("csCtorHasNoArgumentOrReturnProperty")) + ignore(GetString("csRequiredSignatureIs")) + ignore(GetString("csMemberSignatureMismatch")) + ignore(GetString("csMemberSignatureMismatch2")) + ignore(GetString("csMemberSignatureMismatch3")) + ignore(GetString("csMemberSignatureMismatch4")) + ignore(GetString("csMemberSignatureMismatchArityNamed")) + ignore(GetString("csMemberSignatureMismatchArity")) + ignore(GetString("csCtorSignatureMismatchArity")) + ignore(GetString("csCtorSignatureMismatchArityProp")) + ignore(GetString("csMemberSignatureMismatchArityType")) + ignore(GetString("csMemberNotAccessible")) + ignore(GetString("csIncorrectGenericInstantiation")) + ignore(GetString("csMemberOverloadArityMismatch")) + ignore(GetString("csNoMemberTakesTheseArguments")) + ignore(GetString("csNoMemberTakesTheseArguments2")) + ignore(GetString("csNoMemberTakesTheseArguments3")) + ignore(GetString("csMethodNotFound")) + ignore(GetString("csNoOverloadsFound")) + ignore(GetString("csMethodIsOverloaded")) + ignore(GetString("csCandidates")) + ignore(GetString("csSeeAvailableOverloads")) + ignore(GetString("parsDoCannotHaveVisibilityDeclarations")) + ignore(GetString("parsEofInHashIf")) + ignore(GetString("parsEofInString")) + ignore(GetString("parsEofInVerbatimString")) + ignore(GetString("parsEofInComment")) + ignore(GetString("parsEofInStringInComment")) + ignore(GetString("parsEofInVerbatimStringInComment")) + ignore(GetString("parsEofInIfOcaml")) + ignore(GetString("parsEofInDirective")) + ignore(GetString("parsNoHashEndIfFound")) + ignore(GetString("parsAttributesIgnored")) + ignore(GetString("parsUseBindingsIllegalInImplicitClassConstructors")) + ignore(GetString("parsUseBindingsIllegalInModules")) + ignore(GetString("parsIntegerForLoopRequiresSimpleIdentifier")) + ignore(GetString("parsOnlyOneWithAugmentationAllowed")) + ignore(GetString("parsUnexpectedSemicolon")) + ignore(GetString("parsUnexpectedEndOfFile")) + ignore(GetString("parsUnexpectedVisibilityDeclaration")) + ignore(GetString("parsOnlyHashDirectivesAllowed")) + ignore(GetString("parsVisibilityDeclarationsShouldComePriorToIdentifier")) + ignore(GetString("parsNamespaceOrModuleNotBoth")) + ignore(GetString("parsModuleAbbreviationMustBeSimpleName")) + ignore(GetString("parsIgnoreAttributesOnModuleAbbreviation")) + ignore(GetString("parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate")) + ignore(GetString("parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate")) + ignore(GetString("parsUnClosedBlockInHashLight")) + ignore(GetString("parsUnmatchedBeginOrStruct")) + ignore(GetString("parsModuleDefnMustBeSimpleName")) + ignore(GetString("parsUnexpectedEmptyModuleDefn")) + ignore(GetString("parsAttributesMustComeBeforeVal")) + ignore(GetString("parsAttributesAreNotPermittedOnInterfaceImplementations")) + ignore(GetString("parsSyntaxError")) + ignore(GetString("parsAugmentationsIllegalOnDelegateType")) + ignore(GetString("parsUnmatchedClassInterfaceOrStruct")) + ignore(GetString("parsEmptyTypeDefinition")) + ignore(GetString("parsUnmatchedWith")) + ignore(GetString("parsGetOrSetRequired")) + ignore(GetString("parsOnlyClassCanTakeValueArguments")) + ignore(GetString("parsUnmatchedBegin")) + ignore(GetString("parsInvalidDeclarationSyntax")) + ignore(GetString("parsGetAndOrSetRequired")) + ignore(GetString("parsTypeAnnotationsOnGetSet")) + ignore(GetString("parsGetterMustHaveAtLeastOneArgument")) + ignore(GetString("parsMultipleAccessibilitiesForGetSet")) + ignore(GetString("parsSetSyntax")) + ignore(GetString("parsInterfacesHaveSameVisibilityAsEnclosingType")) + ignore(GetString("parsAccessibilityModsIllegalForAbstract")) + ignore(GetString("parsAttributesIllegalOnInherit")) + ignore(GetString("parsVisibilityIllegalOnInherit")) + ignore(GetString("parsInheritDeclarationsCannotHaveAsBindings")) + ignore(GetString("parsAttributesIllegalHere")) + ignore(GetString("parsTypeAbbreviationsCannotHaveVisibilityDeclarations")) + ignore(GetString("parsEnumTypesCannotHaveVisibilityDeclarations")) + ignore(GetString("parsAllEnumFieldsRequireValues")) + ignore(GetString("parsInlineAssemblyCannotHaveVisibilityDeclarations")) + ignore(GetString("parsUnexpectedIdentifier")) + ignore(GetString("parsUnionCasesCannotHaveVisibilityDeclarations")) + ignore(GetString("parsEnumFieldsCannotHaveVisibilityDeclarations")) + ignore(GetString("parsConsiderUsingSeparateRecordType")) + ignore(GetString("parsRecordFieldsCannotHaveVisibilityDeclarations")) + ignore(GetString("parsLetAndForNonRecBindings")) + ignore(GetString("parsUnmatchedParen")) + ignore(GetString("parsSuccessivePatternsShouldBeSpacedOrTupled")) + ignore(GetString("parsNoMatchingInForLet")) + ignore(GetString("parsErrorInReturnForLetIncorrectIndentation")) + ignore(GetString("parsExpectedExpressionAfterLet")) + ignore(GetString("parsIncompleteIf")) + ignore(GetString("parsAssertIsNotFirstClassValue")) + ignore(GetString("parsIdentifierExpected")) + ignore(GetString("parsInOrEqualExpected")) + ignore(GetString("parsArrowUseIsLimited")) + ignore(GetString("parsSuccessiveArgsShouldBeSpacedOrTupled")) + ignore(GetString("parsUnmatchedBracket")) + ignore(GetString("parsMissingQualificationAfterDot")) + ignore(GetString("parsParenFormIsForML")) + ignore(GetString("parsMismatchedQuote")) + ignore(GetString("parsUnmatched")) + ignore(GetString("parsUnmatchedBracketBar")) + ignore(GetString("parsUnmatchedBrace")) + ignore(GetString("parsFieldBinding")) + ignore(GetString("parsMemberIllegalInObjectImplementation")) + ignore(GetString("parsMissingFunctionBody")) + ignore(GetString("parsSyntaxErrorInLabeledType")) + ignore(GetString("parsUnexpectedInfixOperator")) + ignore(GetString("parsMultiArgumentGenericTypeFormDeprecated")) + ignore(GetString("parsInvalidLiteralInType")) + ignore(GetString("parsUnexpectedOperatorForUnitOfMeasure")) + ignore(GetString("parsUnexpectedIntegerLiteralForUnitOfMeasure")) + ignore(GetString("parsUnexpectedTypeParameter")) + ignore(GetString("parsMismatchedQuotationName")) + ignore(GetString("parsActivePatternCaseMustBeginWithUpperCase")) + ignore(GetString("parsActivePatternCaseContainsPipe")) + ignore(GetString("parsIllegalDenominatorForMeasureExponent")) + ignore(GetString("parsNoEqualShouldFollowNamespace")) + ignore(GetString("parsSyntaxModuleStructEndDeprecated")) + ignore(GetString("parsSyntaxModuleSigEndDeprecated")) + ignore(GetString("tcStaticFieldUsedWhenInstanceFieldExpected")) + ignore(GetString("tcMethodNotAccessible")) + ignore(GetString("tcImplicitMeasureFollowingSlash")) + ignore(GetString("tcUnexpectedMeasureAnon")) + ignore(GetString("tcNonZeroConstantCannotHaveGenericUnit")) + ignore(GetString("tcSeqResultsUseYield")) + ignore(GetString("tcUnexpectedBigRationalConstant")) + ignore(GetString("tcInvalidTypeForUnitsOfMeasure")) + ignore(GetString("tcUnexpectedConstUint16Array")) + ignore(GetString("tcUnexpectedConstByteArray")) + ignore(GetString("tcParameterRequiresName")) + ignore(GetString("tcReturnValuesCannotHaveNames")) + ignore(GetString("tcMemberKindPropertyGetSetNotExpected")) + ignore(GetString("tcNamespaceCannotContainValues")) + ignore(GetString("tcNamespaceCannotContainExtensionMembers")) + ignore(GetString("tcMultipleVisibilityAttributes")) + ignore(GetString("tcMultipleVisibilityAttributesWithLet")) + ignore(GetString("tcInvalidMethodNameForRelationalOperator")) + ignore(GetString("tcInvalidMethodNameForEquality")) + ignore(GetString("tcInvalidMemberName")) + ignore(GetString("tcInvalidMemberNameFixedTypes")) + ignore(GetString("tcInvalidOperatorDefinitionRelational")) + ignore(GetString("tcInvalidOperatorDefinitionEquality")) + ignore(GetString("tcInvalidOperatorDefinition")) + ignore(GetString("tcInvalidIndexOperatorDefinition")) + ignore(GetString("tcExpectModuleOrNamespaceParent")) + ignore(GetString("tcImplementsIComparableExplicitly")) + ignore(GetString("tcImplementsGenericIComparableExplicitly")) + ignore(GetString("tcImplementsIStructuralComparableExplicitly")) + ignore(GetString("tcRecordFieldInconsistentTypes")) + ignore(GetString("tcDllImportStubsCannotBeInlined")) + ignore(GetString("tcStructsCanOnlyBindThisAtMemberDeclaration")) + ignore(GetString("tcUnexpectedExprAtRecInfPoint")) + ignore(GetString("tcLessGenericBecauseOfAnnotation")) + ignore(GetString("tcConstrainedTypeVariableCannotBeGeneralized")) + ignore(GetString("tcGenericParameterHasBeenConstrained")) + ignore(GetString("tcTypeParameterHasBeenConstrained")) + ignore(GetString("tcTypeParametersInferredAreNotStable")) + ignore(GetString("tcExplicitTypeParameterInvalid")) + ignore(GetString("tcOverridingMethodRequiresAllOrNoTypeParameters")) + ignore(GetString("tcFieldsDoNotDetermineUniqueRecordType")) + ignore(GetString("tcFieldAppearsTwiceInRecord")) + ignore(GetString("tcUnknownUnion")) + ignore(GetString("tcNotSufficientlyGenericBecauseOfScope")) + ignore(GetString("tcPropertyRequiresExplicitTypeParameters")) + ignore(GetString("tcConstructorCannotHaveTypeParameters")) + ignore(GetString("tcInstanceMemberRequiresTarget")) + ignore(GetString("tcUnexpectedPropertyInSyntaxTree")) + ignore(GetString("tcStaticInitializerRequiresArgument")) + ignore(GetString("tcObjectConstructorRequiresArgument")) + ignore(GetString("tcStaticMemberShouldNotHaveThis")) + ignore(GetString("tcExplicitStaticInitializerSyntax")) + ignore(GetString("tcExplicitObjectConstructorSyntax")) + ignore(GetString("tcUnexpectedPropertySpec")) + ignore(GetString("tcObjectExpressionFormDeprecated")) + ignore(GetString("tcInvalidDeclaration")) + ignore(GetString("tcAttributesInvalidInPatterns")) + ignore(GetString("tcFunctionRequiresExplicitTypeArguments")) + ignore(GetString("tcDoesNotAllowExplicitTypeArguments")) + ignore(GetString("tcTypeParameterArityMismatch")) + ignore(GetString("tcDefaultStructConstructorCall")) + ignore(GetString("tcCouldNotFindIDisposable")) + ignore(GetString("tcNonLiteralCannotBeUsedInPattern")) + ignore(GetString("tcFieldIsReadonly")) + ignore(GetString("tcNameArgumentsMustAppearLast")) + ignore(GetString("tcFunctionRequiresExplicitLambda")) + ignore(GetString("tcTypeCannotBeEnumerated")) + ignore(GetString("tcInvalidMixtureOfRecursiveForms")) + ignore(GetString("tcInvalidObjectConstructionExpression")) + ignore(GetString("tcInvalidConstraint")) + ignore(GetString("tcInvalidConstraintTypeSealed")) + ignore(GetString("tcInvalidEnumConstraint")) + ignore(GetString("tcInvalidNewConstraint")) + ignore(GetString("tcInvalidPropertyType")) + ignore(GetString("tcExpectedUnitOfMeasureMarkWithAttribute")) + ignore(GetString("tcExpectedTypeParameter")) + ignore(GetString("tcExpectedTypeNotUnitOfMeasure")) + ignore(GetString("tcExpectedUnitOfMeasureNotType")) + ignore(GetString("tcInvalidUnitsOfMeasurePrefix")) + ignore(GetString("tcUnitsOfMeasureInvalidInTypeConstructor")) + ignore(GetString("tcRequireBuilderMethod")) + ignore(GetString("tcTypeHasNoNestedTypes")) + ignore(GetString("tcUnexpectedSymbolInTypeExpression")) + ignore(GetString("tcTypeParameterInvalidAsTypeConstructor")) + ignore(GetString("tcIllegalSyntaxInTypeExpression")) + ignore(GetString("tcAnonymousUnitsOfMeasureCannotBeNested")) + ignore(GetString("tcAnonymousTypeInvalidInDeclaration")) + ignore(GetString("tcUnexpectedSlashInType")) + ignore(GetString("tcUnexpectedTypeArguments")) + ignore(GetString("tcOptionalArgsOnlyOnMembers")) + ignore(GetString("tcNameNotBoundInPattern")) + ignore(GetString("tcInvalidNonPrimitiveLiteralInPatternMatch")) + ignore(GetString("tcInvalidTypeArgumentUsage")) + ignore(GetString("tcRequireActivePatternWithOneResult")) + ignore(GetString("tcInvalidArgForParameterizedPattern")) + ignore(GetString("tcInvalidIndexIntoActivePatternArray")) + ignore(GetString("tcUnionCaseDoesNotTakeArguments")) + ignore(GetString("tcUnionCaseRequiresOneArgument")) + ignore(GetString("tcUnionCaseExpectsTupledArguments")) + ignore(GetString("tcFieldIsNotStatic")) + ignore(GetString("tcFieldNotLiteralCannotBeUsedInPattern")) + ignore(GetString("tcRequireVarConstRecogOrLiteral")) + ignore(GetString("tcInvalidPattern")) + ignore(GetString("tcUseWhenPatternGuard")) + ignore(GetString("tcIllegalPattern")) + ignore(GetString("tcSyntaxErrorUnexpectedQMark")) + ignore(GetString("tcExpressionCountMisMatch")) + ignore(GetString("tcExprUndelayed")) + ignore(GetString("tcExpressionRequiresSequence")) + ignore(GetString("tcInvalidObjectExpressionSyntaxForm")) + ignore(GetString("tcInvalidObjectSequenceOrRecordExpression")) + ignore(GetString("tcInvalidSequenceExpressionSyntaxForm")) + ignore(GetString("tcExpressionWithIfRequiresParenthesis")) + ignore(GetString("tcUnableToParseFormatString")) + ignore(GetString("tcListLiteralMaxSize")) + ignore(GetString("tcExpressionFormRequiresObjectConstructor")) + ignore(GetString("tcNamedArgumentsCannotBeUsedInMemberTraits")) + ignore(GetString("tcNotValidEnumCaseName")) + ignore(GetString("tcFieldIsNotMutable")) + ignore(GetString("tcConstructRequiresListArrayOrSequence")) + ignore(GetString("tcConstructRequiresComputationExpressions")) + ignore(GetString("tcConstructRequiresSequenceOrComputations")) + ignore(GetString("tcConstructRequiresComputationExpression")) + ignore(GetString("tcInvalidIndexerExpression")) + ignore(GetString("tcObjectOfIndeterminateTypeUsedRequireTypeConstraint")) + ignore(GetString("tcCannotInheritFromVariableType")) + ignore(GetString("tcObjectConstructorsOnTypeParametersCannotTakeArguments")) + ignore(GetString("tcCompiledNameAttributeMisused")) + ignore(GetString("tcNamedTypeRequired")) + ignore(GetString("tcInheritCannotBeUsedOnInterfaceType")) + ignore(GetString("tcNewCannotBeUsedOnInterfaceType")) + ignore(GetString("tcAbstractTypeCannotBeInstantiated")) + ignore(GetString("tcIDisposableTypeShouldUseNew")) + ignore(GetString("tcSyntaxCanOnlyBeUsedToCreateObjectTypes")) + ignore(GetString("tcConstructorRequiresCall")) + ignore(GetString("tcUndefinedField")) + ignore(GetString("tcFieldRequiresAssignment")) + ignore(GetString("tcExtraneousFieldsGivenValues")) + ignore(GetString("tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual")) + ignore(GetString("tcNoAbstractOrVirtualMemberFound")) + ignore(GetString("tcMemberFoundIsNotAbstractOrVirtual")) + ignore(GetString("tcArgumentArityMismatch")) + ignore(GetString("tcArgumentArityMismatchOneOverload")) + ignore(GetString("tcSimpleMethodNameRequired")) + ignore(GetString("tcPredefinedTypeCannotBeUsedAsSuperType")) + ignore(GetString("tcNewMustBeUsedWithNamedType")) + ignore(GetString("tcCannotCreateExtensionOfSealedType")) + ignore(GetString("tcNoArgumentsForRecordValue")) + ignore(GetString("tcNoInterfaceImplementationForConstructionExpression")) + ignore(GetString("tcObjectConstructionCanOnlyBeUsedInClassTypes")) + ignore(GetString("tcOnlySimpleBindingsCanBeUsedInConstructionExpressions")) + ignore(GetString("tcObjectsMustBeInitializedWithObjectExpression")) + ignore(GetString("tcExpectedInterfaceType")) + ignore(GetString("tcConstructorForInterfacesDoNotTakeArguments")) + ignore(GetString("tcConstructorRequiresArguments")) + ignore(GetString("tcNewRequiresObjectConstructor")) + ignore(GetString("tcAtLeastOneOverrideIsInvalid")) + ignore(GetString("tcNumericLiteralRequiresModule")) + ignore(GetString("tcInvalidRecordConstruction")) + ignore(GetString("tcExpressionFormRequiresRecordTypes")) + ignore(GetString("tcInheritedTypeIsNotObjectModelType")) + ignore(GetString("tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes")) + ignore(GetString("tcEmptyRecordInvalid")) + ignore(GetString("tcTypeIsNotARecordTypeNeedConstructor")) + ignore(GetString("tcTypeIsNotARecordType")) + ignore(GetString("tcConstructIsAmbiguousInComputationExpression")) + ignore(GetString("tcConstructIsAmbiguousInSequenceExpression")) + ignore(GetString("tcDoBangIllegalInSequenceExpression")) + ignore(GetString("tcUseForInSequenceExpression")) + ignore(GetString("tcTryIllegalInSequenceExpression")) + ignore(GetString("tcUseYieldBangForMultipleResults")) + ignore(GetString("tcInvalidAssignment")) + ignore(GetString("tcInvalidUseOfTypeName")) + ignore(GetString("tcTypeHasNoAccessibleConstructor")) + ignore(GetString("tcInvalidUseOfInterfaceType")) + ignore(GetString("tcInvalidUseOfDelegate")) + ignore(GetString("tcPropertyIsNotStatic")) + ignore(GetString("tcPropertyIsNotReadable")) + ignore(GetString("tcLookupMayNotBeUsedHere")) + ignore(GetString("tcPropertyIsStatic")) + ignore(GetString("tcPropertyCannotBeSet1")) + ignore(GetString("tcConstructorsCannotBeFirstClassValues")) + ignore(GetString("tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields")) + ignore(GetString("tcEventIsStatic")) + ignore(GetString("tcEventIsNotStatic")) + ignore(GetString("tcNamedArgumentDidNotMatch")) + ignore(GetString("tcOverloadsCannotHaveCurriedArguments")) + ignore(GetString("tcUnnamedArgumentsDoNotFormPrefix")) + ignore(GetString("tcStaticOptimizationConditionalsOnlyForFSharpLibrary")) + ignore(GetString("tcFormalArgumentIsNotOptional")) + ignore(GetString("tcInvalidOptionalAssignmentToPropertyOrField")) + ignore(GetString("tcDelegateConstructorMustBePassed")) + ignore(GetString("tcBindingCannotBeUseAndRec")) + ignore(GetString("tcVolatileOnlyOnClassLetBindings")) + ignore(GetString("tcAttributesAreNotPermittedOnLetBindings")) + ignore(GetString("tcDefaultValueAttributeRequiresVal")) + ignore(GetString("tcConditionalAttributeRequiresMembers")) + ignore(GetString("tcInvalidActivePatternName")) + ignore(GetString("tcEntryPointAttributeRequiresFunctionInModule")) + ignore(GetString("tcMutableValuesCannotBeInline")) + ignore(GetString("tcMutableValuesMayNotHaveGenericParameters")) + ignore(GetString("tcMutableValuesSyntax")) + ignore(GetString("tcOnlyFunctionsCanBeInline")) + ignore(GetString("tcIllegalAttributesForLiteral")) + ignore(GetString("tcLiteralCannotBeMutable")) + ignore(GetString("tcLiteralCannotBeInline")) + ignore(GetString("tcLiteralCannotHaveGenericParameters")) + ignore(GetString("tcInvalidConstantExpression")) + ignore(GetString("tcTypeIsInaccessible")) + ignore(GetString("tcUnexpectedConditionInImportedAssembly")) + ignore(GetString("tcUnrecognizedAttributeTarget")) + ignore(GetString("tcAttributeIsNotValidForLanguageElementUseDo")) + ignore(GetString("tcAttributeIsNotValidForLanguageElement")) + ignore(GetString("tcOptionalArgumentsCannotBeUsedInCustomAttribute")) + ignore(GetString("tcPropertyCannotBeSet0")) + ignore(GetString("tcPropertyOrFieldNotFoundInAttribute")) + ignore(GetString("tcCustomAttributeMustBeReferenceType")) + ignore(GetString("tcCustomAttributeArgumentMismatch")) + ignore(GetString("tcCustomAttributeMustInvokeConstructor")) + ignore(GetString("tcAttributeExpressionsMustBeConstructorCalls")) + ignore(GetString("tcUnsupportedAttribute")) + ignore(GetString("tcInvalidInlineSpecification")) + ignore(GetString("tcInvalidUseBinding")) + ignore(GetString("tcAbstractMembersIllegalInAugmentation")) + ignore(GetString("tcMethodOverridesIllegalHere")) + ignore(GetString("tcNoMemberFoundForOverride")) + ignore(GetString("tcOverrideArityMismatch")) + ignore(GetString("tcDefaultImplementationAlreadyExists")) + ignore(GetString("tcDefaultAmbiguous")) + ignore(GetString("tcNoPropertyFoundForOverride")) + ignore(GetString("tcAbstractPropertyMissingGetOrSet")) + ignore(GetString("tcInvalidSignatureForSet")) + ignore(GetString("tcNewMemberHidesAbstractMember")) + ignore(GetString("tcNewMemberHidesAbstractMemberWithSuffix")) + ignore(GetString("tcStaticInitializersIllegalInInterface")) + ignore(GetString("tcObjectConstructorsIllegalInInterface")) + ignore(GetString("tcMemberOverridesIllegalInInterface")) + ignore(GetString("tcConcreteMembersIllegalInInterface")) + ignore(GetString("tcConstructorsDisallowedInExceptionAugmentation")) + ignore(GetString("tcStructsCannotHaveConstructorWithNoArguments")) + ignore(GetString("tcConstructorsIllegalForThisType")) + ignore(GetString("tcRecursiveBindingsWithMembersMustBeDirectAugmentation")) + ignore(GetString("tcOnlySimplePatternsInLetRec")) + ignore(GetString("tcOnlyRecordFieldsAndSimpleLetCanBeMutable")) + ignore(GetString("tcMemberIsNotSufficientlyGeneric")) + ignore(GetString("tcLiteralAttributeRequiresConstantValue")) + ignore(GetString("tcValueInSignatureRequiresLiteralAttribute")) + ignore(GetString("tcThreadStaticAndContextStaticMustBeStatic")) + ignore(GetString("tcVolatileFieldsMustBeMutable")) + ignore(GetString("tcUninitializedValFieldsMustBeMutable")) + ignore(GetString("tcStaticValFieldsMustBeMutableAndPrivate")) + ignore(GetString("tcFieldRequiresName")) + ignore(GetString("tcInvalidNamespaceModuleTypeUnionName")) + ignore(GetString("tcIllegalFormForExplicitTypeDeclaration")) + ignore(GetString("tcReturnTypesForUnionMustBeSameAsType")) + ignore(GetString("tcInvalidEnumerationLiteral")) + ignore(GetString("tcTypeIsNotInterfaceType1")) + ignore(GetString("tcDuplicateSpecOfInterface")) + ignore(GetString("tcFieldValIllegalHere")) + ignore(GetString("tcInheritIllegalHere")) + ignore(GetString("tcModuleRequiresQualifiedAccess")) + ignore(GetString("tcOpenUsedWithPartiallyQualifiedPath")) + ignore(GetString("tcLocalClassBindingsCannotBeInline")) + ignore(GetString("tcTypeAbbreviationsMayNotHaveMembers")) + ignore(GetString("tcTypeAbbreviationsCheckedAtCompileTime")) + ignore(GetString("tcEnumerationsMayNotHaveMembers")) + ignore(GetString("tcMeasureDeclarationsRequireStaticMembers")) + ignore(GetString("tcStructsMayNotContainDoBindings")) + ignore(GetString("tcStructsMayNotContainLetBindings")) + ignore(GetString("tcStaticLetBindingsRequireClassesWithImplicitConstructors")) + ignore(GetString("tcMeasureDeclarationsRequireStaticMembersNotConstructors")) + ignore(GetString("tcMemberAndLocalClassBindingHaveSameName")) + ignore(GetString("tcTypeAbbreviationsCannotHaveInterfaceDeclaration")) + ignore(GetString("tcEnumerationsCannotHaveInterfaceDeclaration")) + ignore(GetString("tcTypeIsNotInterfaceType0")) + ignore(GetString("tcAllImplementedInterfacesShouldBeDeclared")) + ignore(GetString("tcDefaultImplementationForInterfaceHasAlreadyBeenAdded")) + ignore(GetString("tcMemberNotPermittedInInterfaceImplementation")) + ignore(GetString("tcDeclarationElementNotPermittedInAugmentation")) + ignore(GetString("tcTypesCannotContainNestedTypes")) + ignore(GetString("tcTypeExceptionOrModule")) + ignore(GetString("tcTypeOrModule")) + ignore(GetString("tcImplementsIStructuralEquatableExplicitly")) + ignore(GetString("tcImplementsIEquatableExplicitly")) + ignore(GetString("tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors")) + ignore(GetString("tcExceptionAbbreviationsShouldNotHaveArgumentList")) + ignore(GetString("tcAbbreviationsFordotNetExceptionsCannotTakeArguments")) + ignore(GetString("tcExceptionAbbreviationsMustReferToValidExceptions")) + ignore(GetString("tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor")) + ignore(GetString("tcNotAnException")) + ignore(GetString("tcInvalidModuleName")) + ignore(GetString("tcInvalidTypeExtension")) + ignore(GetString("tcAttributesOfTypeSpecifyMultipleKindsForType")) + ignore(GetString("tcKindOfTypeSpecifiedDoesNotMatchDefinition")) + ignore(GetString("tcMeasureDefinitionsCannotHaveTypeParameters")) + ignore(GetString("tcTypeRequiresDefinition")) + ignore(GetString("tcTypeAbbreviationHasTypeParametersMissingOnType")) + ignore(GetString("tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes")) + ignore(GetString("tcTypesCannotInheritFromMultipleConcreteTypes")) + ignore(GetString("tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute")) + ignore(GetString("tcAllowNullTypesMayOnlyInheritFromAllowNullTypes")) + ignore(GetString("tcGenericTypesCannotHaveStructLayout")) + ignore(GetString("tcOnlyStructsCanHaveStructLayout")) + ignore(GetString("tcRepresentationOfTypeHiddenBySignature")) + ignore(GetString("tcOnlyClassesCanHaveAbstract")) + ignore(GetString("tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure")) + ignore(GetString("tcOverridesCannotHaveVisibilityDeclarations")) + ignore(GetString("tcTypesAreAlwaysSealedDU")) + ignore(GetString("tcTypesAreAlwaysSealedRecord")) + ignore(GetString("tcTypesAreAlwaysSealedAssemblyCode")) + ignore(GetString("tcTypesAreAlwaysSealedStruct")) + ignore(GetString("tcTypesAreAlwaysSealedDelegate")) + ignore(GetString("tcTypesAreAlwaysSealedEnum")) + ignore(GetString("tcInterfaceTypesAndDelegatesCannotContainFields")) + ignore(GetString("tcAbbreviatedTypesCannotBeSealed")) + ignore(GetString("tcCannotInheritFromSealedType")) + ignore(GetString("tcCannotInheritFromInterfaceType")) + ignore(GetString("tcStructTypesCannotContainAbstractMembers")) + ignore(GetString("tcInterfaceTypesCannotBeSealed")) + ignore(GetString("tcInvalidDelegateSpecification")) + ignore(GetString("tcDelegatesCannotBeCurried")) + ignore(GetString("tcInvalidTypeForLiteralEnumeration")) + ignore(GetString("tcTypeDefinitionIsCyclic")) + ignore(GetString("tcTypeDefinitionIsCyclicThroughInheritance")) + ignore(GetString("tcReservedSyntaxForAugmentation")) + ignore(GetString("tcMembersThatExtendInterfaceMustBePlacedInSeparateModule")) + ignore(GetString("tcDeclaredTypeParametersForExtensionDoNotMatchOriginal")) + ignore(GetString("tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit")) + ignore(GetString("tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers")) + ignore(GetString("tcInheritDeclarationMissingArguments")) + ignore(GetString("tcInheritConstructionCallNotPartOfImplicitSequence")) + ignore(GetString("tcLetAndDoRequiresImplicitConstructionSequence")) + ignore(GetString("tcTypeAbbreviationsCannotHaveAugmentations")) + ignore(GetString("tcModuleAbbreviationForNamespace")) + ignore(GetString("tcTypeUsedInInvalidWay")) + ignore(GetString("tcMemberUsedInInvalidWay")) + ignore(GetString("tcAttributeAutoOpenWasIgnored")) + ignore(GetString("ilUndefinedValue")) + ignore(GetString("ilLabelNotFound")) + ignore(GetString("ilIncorrectNumberOfTypeArguments")) + ignore(GetString("ilDynamicInvocationNotSupported")) + ignore(GetString("ilAddressOfLiteralFieldIsInvalid")) + ignore(GetString("ilAddressOfValueHereIsInvalid")) + ignore(GetString("ilCustomMarshallersCannotBeUsedInFSharp")) + ignore(GetString("ilMarshalAsAttributeCannotBeDecoded")) + ignore(GetString("ilSignatureForExternalFunctionContainsTypeParameters")) + ignore(GetString("ilDllImportAttributeCouldNotBeDecoded")) + ignore(GetString("ilLiteralFieldsCannotBeSet")) + ignore(GetString("ilStaticMethodIsNotLambda")) + ignore(GetString("ilMutableVariablesCannotEscapeMethod")) + ignore(GetString("ilUnexpectedUnrealizedValue")) + ignore(GetString("ilMainModuleEmpty")) + ignore(GetString("ilTypeCannotBeUsedForLiteralField")) + ignore(GetString("ilUnexpectedGetSetAnnotation")) + ignore(GetString("ilFieldOffsetAttributeCouldNotBeDecoded")) + ignore(GetString("ilStructLayoutAttributeCouldNotBeDecoded")) + ignore(GetString("ilDefaultAugmentationAttributeCouldNotBeDecoded")) + ignore(GetString("ilReflectedDefinitionsCannotUseSliceOperator")) + ignore(GetString("optsProblemWithCodepage")) + ignore(GetString("optsCopyright")) + ignore(GetString("optsCopyrightCommunity")) + ignore(GetString("optsNameOfOutputFile")) + ignore(GetString("optsBuildConsole")) + ignore(GetString("optsBuildWindows")) + ignore(GetString("optsBuildLibrary")) + ignore(GetString("optsBuildModule")) + ignore(GetString("optsDelaySign")) + ignore(GetString("optsPublicSign")) + ignore(GetString("optsWriteXml")) + ignore(GetString("optsStrongKeyFile")) + ignore(GetString("optsStrongKeyContainer")) + ignore(GetString("optsPlatform")) + ignore(GetString("optsNoOpt")) + ignore(GetString("optsNoInterface")) + ignore(GetString("optsSig")) + ignore(GetString("optsReference")) + ignore(GetString("optsWin32res")) + ignore(GetString("optsWin32manifest")) + ignore(GetString("optsNowin32manifest")) + ignore(GetString("optsEmbedAllSource")) + ignore(GetString("optsEmbedSource")) + ignore(GetString("optsSourceLink")) + ignore(GetString("optsEmbeddedSourceRequirePortablePDBs")) + ignore(GetString("optsSourceLinkRequirePortablePDBs")) + ignore(GetString("srcFileTooLarge")) + ignore(GetString("optsResource")) + ignore(GetString("optsLinkresource")) + ignore(GetString("optsDebugPM")) + ignore(GetString("optsDebug")) + ignore(GetString("optsOptimize")) + ignore(GetString("optsTailcalls")) + ignore(GetString("optsDeterministic")) + ignore(GetString("optsCrossoptimize")) + ignore(GetString("optsWarnaserrorPM")) + ignore(GetString("optsWarnaserror")) + ignore(GetString("optsWarn")) + ignore(GetString("optsNowarn")) + ignore(GetString("optsWarnOn")) + ignore(GetString("optsChecked")) + ignore(GetString("optsDefine")) + ignore(GetString("optsMlcompatibility")) + ignore(GetString("optsNologo")) + ignore(GetString("optsHelp")) + ignore(GetString("optsResponseFile")) + ignore(GetString("optsCodepage")) + ignore(GetString("optsUtf8output")) + ignore(GetString("optsFullpaths")) + ignore(GetString("optsLib")) + ignore(GetString("optsBaseaddress")) + ignore(GetString("optsNoframework")) + ignore(GetString("optsStandalone")) + ignore(GetString("optsStaticlink")) + ignore(GetString("optsResident")) + ignore(GetString("optsPdb")) + ignore(GetString("optsSimpleresolution")) + ignore(GetString("optsUnrecognizedTarget")) + ignore(GetString("optsUnrecognizedDebugType")) + ignore(GetString("optsInvalidWarningLevel")) + ignore(GetString("optsShortFormOf")) + ignore(GetString("optsClirootDeprecatedMsg")) + ignore(GetString("optsClirootDescription")) + ignore(GetString("optsHelpBannerOutputFiles")) + ignore(GetString("optsHelpBannerInputFiles")) + ignore(GetString("optsHelpBannerResources")) + ignore(GetString("optsHelpBannerCodeGen")) + ignore(GetString("optsHelpBannerAdvanced")) + ignore(GetString("optsHelpBannerMisc")) + ignore(GetString("optsHelpBannerLanguage")) + ignore(GetString("optsHelpBannerErrsAndWarns")) + ignore(GetString("optsUnknownArgumentToTheTestSwitch")) + ignore(GetString("optsUnknownPlatform")) + ignore(GetString("optsInternalNoDescription")) + ignore(GetString("optsDCLONoDescription")) + ignore(GetString("optsDCLODeprecatedSuggestAlternative")) + ignore(GetString("optsDCLOHtmlDoc")) + ignore(GetString("optsConsoleColors")) + ignore(GetString("optsUseHighEntropyVA")) + ignore(GetString("optsSubSystemVersion")) + ignore(GetString("optsTargetProfile")) + ignore(GetString("optsEmitDebugInfoInQuotations")) + ignore(GetString("optsPreferredUiLang")) + ignore(GetString("optsNoCopyFsharpCore")) + ignore(GetString("optsInvalidSubSystemVersion")) + ignore(GetString("optsInvalidTargetProfile")) + ignore(GetString("typeInfoFullName")) + ignore(GetString("typeInfoOtherOverloads")) + ignore(GetString("typeInfoUnionCase")) + ignore(GetString("typeInfoActivePatternResult")) + ignore(GetString("typeInfoActiveRecognizer")) + ignore(GetString("typeInfoField")) + ignore(GetString("typeInfoEvent")) + ignore(GetString("typeInfoProperty")) + ignore(GetString("typeInfoExtension")) + ignore(GetString("typeInfoCustomOperation")) + ignore(GetString("typeInfoArgument")) + ignore(GetString("typeInfoPatternVariable")) + ignore(GetString("typeInfoNamespace")) + ignore(GetString("typeInfoModule")) + ignore(GetString("typeInfoNamespaceOrModule")) + ignore(GetString("typeInfoFromFirst")) + ignore(GetString("typeInfoFromNext")) + ignore(GetString("typeInfoGeneratedProperty")) + ignore(GetString("typeInfoGeneratedType")) + ignore(GetString("assemblyResolutionFoundByAssemblyFoldersKey")) + ignore(GetString("assemblyResolutionFoundByAssemblyFoldersExKey")) + ignore(GetString("assemblyResolutionNetFramework")) + ignore(GetString("assemblyResolutionGAC")) + ignore(GetString("recursiveClassHierarchy")) + ignore(GetString("InvalidRecursiveReferenceToAbstractSlot")) + ignore(GetString("eventHasNonStandardType")) + ignore(GetString("typeIsNotAccessible")) + ignore(GetString("unionCasesAreNotAccessible")) + ignore(GetString("valueIsNotAccessible")) + ignore(GetString("unionCaseIsNotAccessible")) + ignore(GetString("fieldIsNotAccessible")) + ignore(GetString("structOrClassFieldIsNotAccessible")) + ignore(GetString("experimentalConstruct")) + ignore(GetString("noInvokeMethodsFound")) + ignore(GetString("moreThanOneInvokeMethodFound")) + ignore(GetString("delegatesNotAllowedToHaveCurriedSignatures")) + ignore(GetString("tlrUnexpectedTExpr")) + ignore(GetString("tlrLambdaLiftingOptimizationsNotApplied")) + ignore(GetString("lexhlpIdentifiersContainingAtSymbolReserved")) + ignore(GetString("lexhlpIdentifierReserved")) + ignore(GetString("patcMissingVariable")) + ignore(GetString("patcPartialActivePatternsGenerateOneResult")) + ignore(GetString("impTypeRequiredUnavailable")) + ignore(GetString("impReferencedTypeCouldNotBeFoundInAssembly")) + ignore(GetString("impNotEnoughTypeParamsInScopeWhileImporting")) + ignore(GetString("impReferenceToDllRequiredByAssembly")) + ignore(GetString("impImportedAssemblyUsesNotPublicType")) + ignore(GetString("optValueMarkedInlineButIncomplete")) + ignore(GetString("optValueMarkedInlineButWasNotBoundInTheOptEnv")) + ignore(GetString("optLocalValueNotFoundDuringOptimization")) + ignore(GetString("optValueMarkedInlineHasUnexpectedValue")) + ignore(GetString("optValueMarkedInlineCouldNotBeInlined")) + ignore(GetString("optFailedToInlineValue")) + ignore(GetString("optRecursiveValValue")) + ignore(GetString("lexfltIncorrentIndentationOfIn")) + ignore(GetString("lexfltTokenIsOffsideOfContextStartedEarlier")) + ignore(GetString("lexfltSeparatorTokensOfPatternMatchMisaligned")) + ignore(GetString("nrInvalidModuleExprType")) + ignore(GetString("nrTypeInstantiationNeededToDisambiguateTypesWithSameName")) + ignore(GetString("nrTypeInstantiationIsMissingAndCouldNotBeInferred")) + ignore(GetString("nrGlobalUsedOnlyAsFirstName")) + ignore(GetString("nrIsNotConstructorOrLiteral")) + ignore(GetString("nrUnexpectedEmptyLongId")) + ignore(GetString("nrRecordDoesNotContainSuchLabel")) + ignore(GetString("nrInvalidFieldLabel")) + ignore(GetString("nrInvalidExpression")) + ignore(GetString("nrNoConstructorsAvailableForType")) + ignore(GetString("nrUnionTypeNeedsQualifiedAccess")) + ignore(GetString("nrRecordTypeNeedsQualifiedAccess")) + ignore(GetString("ilwriteErrorCreatingPdb")) + ignore(GetString("lexOutsideIntegerRange")) + ignore(GetString("lexCharNotAllowedInOperatorNames")) + ignore(GetString("lexUnexpectedChar")) + ignore(GetString("lexByteArrayCannotEncode")) + ignore(GetString("lexIdentEndInMarkReserved")) + ignore(GetString("lexOutsideEightBitSigned")) + ignore(GetString("lexOutsideEightBitSignedHex")) + ignore(GetString("lexOutsideEightBitUnsigned")) + ignore(GetString("lexOutsideSixteenBitSigned")) + ignore(GetString("lexOutsideSixteenBitUnsigned")) + ignore(GetString("lexOutsideThirtyTwoBitSigned")) + ignore(GetString("lexOutsideThirtyTwoBitUnsigned")) + ignore(GetString("lexOutsideSixtyFourBitSigned")) + ignore(GetString("lexOutsideSixtyFourBitUnsigned")) + ignore(GetString("lexOutsideNativeSigned")) + ignore(GetString("lexOutsideNativeUnsigned")) + ignore(GetString("lexInvalidFloat")) + ignore(GetString("lexOusideDecimal")) + ignore(GetString("lexOusideThirtyTwoBitFloat")) + ignore(GetString("lexInvalidNumericLiteral")) + ignore(GetString("lexInvalidByteLiteral")) + ignore(GetString("lexInvalidCharLiteral")) + ignore(GetString("lexThisUnicodeOnlyInStringLiterals")) + ignore(GetString("lexTokenReserved")) + ignore(GetString("lexTabsNotAllowed")) + ignore(GetString("lexInvalidLineNumber")) + ignore(GetString("lexHashIfMustBeFirst")) + ignore(GetString("lexHashElseNoMatchingIf")) + ignore(GetString("lexHashEndifRequiredForElse")) + ignore(GetString("lexHashElseMustBeFirst")) + ignore(GetString("lexHashEndingNoMatchingIf")) + ignore(GetString("lexHashEndifMustBeFirst")) + ignore(GetString("lexHashIfMustHaveIdent")) + ignore(GetString("lexWrongNestedHashEndif")) + ignore(GetString("lexHashBangMustBeFirstInFile")) + ignore(GetString("pplexExpectedSingleLineComment")) + ignore(GetString("memberOperatorDefinitionWithNoArguments")) + ignore(GetString("memberOperatorDefinitionWithNonPairArgument")) + ignore(GetString("memberOperatorDefinitionWithCurriedArguments")) + ignore(GetString("tcFSharpCoreRequiresExplicit")) + ignore(GetString("tcStructuralComparisonNotSatisfied1")) + ignore(GetString("tcStructuralComparisonNotSatisfied2")) + ignore(GetString("tcNoComparisonNeeded1")) + ignore(GetString("tcNoComparisonNeeded2")) + ignore(GetString("tcNoEqualityNeeded1")) + ignore(GetString("tcNoEqualityNeeded2")) + ignore(GetString("tcStructuralEqualityNotSatisfied1")) + ignore(GetString("tcStructuralEqualityNotSatisfied2")) + ignore(GetString("tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly")) + ignore(GetString("chkUnusedValue")) + ignore(GetString("chkUnusedThisVariable")) + ignore(GetString("parsGetterAtMostOneArgument")) + ignore(GetString("parsSetterAtMostTwoArguments")) + ignore(GetString("parsInvalidProperty")) + ignore(GetString("parsIndexerPropertyRequiresAtLeastOneArgument")) + ignore(GetString("tastInvalidAddressOfMutableAcrossAssemblyBoundary")) + ignore(GetString("parsNonAdjacentTypars")) + ignore(GetString("parsNonAdjacentTyargs")) + ignore(GetString("parsNonAtomicType")) + ignore(GetString("tastUndefinedItemRefModuleNamespace")) + ignore(GetString("tastUndefinedItemRefVal")) + ignore(GetString("tastUndefinedItemRefModuleNamespaceType")) + ignore(GetString("tcInvalidUseNullAsTrueValue")) + ignore(GetString("tcParameterInferredByref")) + ignore(GetString("tcNonUniformMemberUse")) + ignore(GetString("tcAttribArgsDiffer")) + ignore(GetString("tcCannotCallAbstractBaseMember")) + ignore(GetString("typrelCannotResolveAmbiguityInUnmanaged")) + ignore(GetString("mlCompatMessage")) + ignore(GetString("ilFieldDoesNotHaveValidOffsetForStructureLayout")) + ignore(GetString("tcInterfacesShouldUseInheritNotInterface")) + ignore(GetString("parsInvalidPrefixOperator")) + ignore(GetString("parsInvalidPrefixOperatorDefinition")) + ignore(GetString("buildCompilingExtensionIsForML")) + ignore(GetString("lexIndentOffForML")) + ignore(GetString("activePatternIdentIsNotFunctionTyped")) + ignore(GetString("activePatternChoiceHasFreeTypars")) + ignore(GetString("ilFieldHasOffsetForSequentialLayout")) + ignore(GetString("tcOptionalArgsMustComeAfterNonOptionalArgs")) + ignore(GetString("tcConditionalAttributeUsage")) + ignore(GetString("tcMemberOperatorDefinitionInExtrinsic")) + ignore(GetString("ilwriteMDBFileNameCannotBeChangedWarning")) + ignore(GetString("ilwriteMDBMemberMissing")) + ignore(GetString("ilwriteErrorCreatingMdb")) + ignore(GetString("tcUnionCaseNameConflictsWithGeneratedType")) + ignore(GetString("chkNoReflectedDefinitionOnStructMember")) + ignore(GetString("tcDllImportNotAllowed")) + ignore(GetString("buildExplicitCoreLibRequiresNoFramework")) + ignore(GetString("buildExpectedSigdataFile")) + ignore(GetString("buildExpectedFileAlongSideFSharpCore")) + ignore(GetString("buildUnexpectedFileNameCharacter")) + ignore(GetString("tcInvalidUseBangBinding")) + ignore(GetString("crefNoInnerGenericsInQuotations")) + ignore(GetString("tcEnumTypeCannotBeEnumerated")) + ignore(GetString("parsEofInTripleQuoteString")) + ignore(GetString("parsEofInTripleQuoteStringInComment")) + ignore(GetString("tcTypeTestLosesMeasures")) + ignore(GetString("parsMissingTypeArgs")) + ignore(GetString("parsMissingGreaterThan")) + ignore(GetString("parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString")) + ignore(GetString("parsErrorParsingAsOperatorName")) + ignore(GetString("lexInvalidUnicodeLiteral")) + ignore(GetString("tcCallerInfoWrongType")) + ignore(GetString("tcCallerInfoNotOptional")) + ignore(GetString("toolLocationHelperUnsupportedFrameworkVersion")) + ignore(GetString("ilSignInvalidMagicValue")) + ignore(GetString("ilSignBadImageFormat")) + ignore(GetString("ilSignPrivateKeyExpected")) + ignore(GetString("ilSignRsaKeyExpected")) + ignore(GetString("ilSignInvalidBitLen")) + ignore(GetString("ilSignInvalidRSAParams")) + ignore(GetString("ilSignInvalidAlgId")) + ignore(GetString("ilSignInvalidSignatureSize")) + ignore(GetString("ilSignNoSignatureDirectory")) + ignore(GetString("ilSignInvalidPKBlob")) + ignore(GetString("fscTooManyErrors")) + ignore(GetString("docfileNoXmlSuffix")) + ignore(GetString("fscNoImplementationFiles")) + ignore(GetString("fscBadAssemblyVersion")) + ignore(GetString("fscTwoResourceManifests")) + ignore(GetString("fscQuotationLiteralsStaticLinking")) + ignore(GetString("fscQuotationLiteralsStaticLinking0")) + ignore(GetString("fscStaticLinkingNoEXE")) + ignore(GetString("fscStaticLinkingNoMixedDLL")) + ignore(GetString("fscIgnoringMixedWhenLinking")) + ignore(GetString("fscAssumeStaticLinkContainsNoDependencies")) + ignore(GetString("fscAssemblyNotFoundInDependencySet")) + ignore(GetString("fscKeyFileCouldNotBeOpened")) + ignore(GetString("fscProblemWritingBinary")) + ignore(GetString("fscAssemblyVersionAttributeIgnored")) + ignore(GetString("fscAssemblyCultureAttributeError")) + ignore(GetString("fscDelaySignWarning")) + ignore(GetString("fscKeyFileWarning")) + ignore(GetString("fscKeyNameWarning")) + ignore(GetString("fscReferenceOnCommandLine")) + ignore(GetString("fscRemotingError")) + ignore(GetString("pathIsInvalid")) + ignore(GetString("fscResxSourceFileDeprecated")) + ignore(GetString("fscStaticLinkingNoProfileMismatches")) + ignore(GetString("fscAssemblyWildcardAndDeterminism")) + ignore(GetString("fscDeterministicDebugRequiresPortablePdb")) + ignore(GetString("etIllegalCharactersInNamespaceName")) + ignore(GetString("etNullOrEmptyMemberName")) + ignore(GetString("etNullMember")) + ignore(GetString("etNullMemberDeclaringType")) + ignore(GetString("etNullMemberDeclaringTypeDifferentFromProvidedType")) + ignore(GetString("etHostingAssemblyFoundWithoutHosts")) + ignore(GetString("etEmptyNamespaceOfTypeNotAllowed")) + ignore(GetString("etEmptyNamespaceNotAllowed")) + ignore(GetString("etMustNotBeGeneric")) + ignore(GetString("etMustNotBeAnArray")) + ignore(GetString("etMethodHasRequirements")) + ignore(GetString("etUnsupportedMemberKind")) + ignore(GetString("etPropertyCanReadButHasNoGetter")) + ignore(GetString("etPropertyHasGetterButNoCanRead")) + ignore(GetString("etPropertyCanWriteButHasNoSetter")) + ignore(GetString("etPropertyHasSetterButNoCanWrite")) + ignore(GetString("etOneOrMoreErrorsSeenDuringExtensionTypeSetting")) + ignore(GetString("etUnexpectedExceptionFromProvidedTypeMember")) + ignore(GetString("etUnsupportedConstantType")) + ignore(GetString("etUnsupportedProvidedExpression")) + ignore(GetString("etProvidedTypeHasUnexpectedName")) + ignore(GetString("etEventNoAdd")) + ignore(GetString("etEventNoRemove")) + ignore(GetString("etProviderHasWrongDesignerAssembly")) + ignore(GetString("etProviderDoesNotHaveValidConstructor")) + ignore(GetString("etProviderError")) + ignore(GetString("etIncorrectParameterExpression")) + ignore(GetString("etIncorrectProvidedMethod")) + ignore(GetString("etIncorrectProvidedConstructor")) + ignore(GetString("etDirectReferenceToGeneratedTypeNotAllowed")) + ignore(GetString("etProvidedTypeHasUnexpectedPath")) + ignore(GetString("etUnexpectedNullFromProvidedTypeMember")) + ignore(GetString("etUnexpectedExceptionFromProvidedMemberMember")) + ignore(GetString("etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters")) + ignore(GetString("etInvalidStaticArgument")) + ignore(GetString("etErrorApplyingStaticArgumentsToType")) + ignore(GetString("etUnknownStaticArgumentKind")) + ignore(GetString("invalidNamespaceForProvidedType")) + ignore(GetString("invalidFullNameForProvidedType")) + ignore(GetString("etProviderReturnedNull")) + ignore(GetString("etTypeProviderConstructorException")) + ignore(GetString("etNullProvidedExpression")) + ignore(GetString("etProvidedAppliedTypeHadWrongName")) + ignore(GetString("etProvidedAppliedMethodHadWrongName")) + ignore(GetString("tcTypeTestLossy")) + ignore(GetString("tcTypeCastErased")) + ignore(GetString("tcTypeTestErased")) + ignore(GetString("tcCannotInheritFromErasedType")) + ignore(GetString("etInvalidTypeProviderAssemblyName")) + ignore(GetString("tcInvalidMemberNameCtor")) + ignore(GetString("tcInferredGenericTypeGivesRiseToInconsistency")) + ignore(GetString("tcInvalidTypeArgumentCount")) + ignore(GetString("tcCannotOverrideSealedMethod")) + ignore(GetString("etProviderErrorWithContext")) + ignore(GetString("etProvidedTypeWithNameException")) + ignore(GetString("etProvidedTypeWithNullOrEmptyName")) + ignore(GetString("etIllegalCharactersInTypeName")) + ignore(GetString("tcJoinMustUseSimplePattern")) + ignore(GetString("tcMissingCustomOperation")) + ignore(GetString("etBadUnnamedStaticArgs")) + ignore(GetString("etStaticParameterRequiresAValue")) + ignore(GetString("etNoStaticParameterWithName")) + ignore(GetString("etStaticParameterAlreadyHasValue")) + ignore(GetString("etMultipleStaticParameterWithName")) + ignore(GetString("tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings")) + ignore(GetString("tcCustomOperationMayNotBeUsedHere")) + ignore(GetString("tcCustomOperationMayNotBeOverloaded")) + ignore(GetString("tcIfThenElseMayNotBeUsedWithinQueries")) + ignore(GetString("ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen")) + ignore(GetString("etProvidedTypeReferenceMissingArgument")) + ignore(GetString("etProvidedTypeReferenceInvalidText")) + ignore(GetString("tcCustomOperationNotUsedCorrectly")) + ignore(GetString("tcCustomOperationNotUsedCorrectly2")) + ignore(GetString("customOperationTextLikeJoin")) + ignore(GetString("customOperationTextLikeGroupJoin")) + ignore(GetString("customOperationTextLikeZip")) + ignore(GetString("tcBinaryOperatorRequiresVariable")) + ignore(GetString("tcOperatorIncorrectSyntax")) + ignore(GetString("tcBinaryOperatorRequiresBody")) + ignore(GetString("tcCustomOperationHasIncorrectArgCount")) + ignore(GetString("parsExpectedExpressionAfterToken")) + ignore(GetString("parsExpectedTypeAfterToken")) + ignore(GetString("parsUnmatchedLBrackLess")) + ignore(GetString("parsUnexpectedEndOfFileMatch")) + ignore(GetString("parsUnexpectedEndOfFileTry")) + ignore(GetString("parsUnexpectedEndOfFileWhile")) + ignore(GetString("parsUnexpectedEndOfFileFor")) + ignore(GetString("parsUnexpectedEndOfFileWith")) + ignore(GetString("parsUnexpectedEndOfFileThen")) + ignore(GetString("parsUnexpectedEndOfFileElse")) + ignore(GetString("parsUnexpectedEndOfFileFunBody")) + ignore(GetString("parsUnexpectedEndOfFileTypeArgs")) + ignore(GetString("parsUnexpectedEndOfFileTypeSignature")) + ignore(GetString("parsUnexpectedEndOfFileTypeDefinition")) + ignore(GetString("parsUnexpectedEndOfFileObjectMembers")) + ignore(GetString("parsUnexpectedEndOfFileDefinition")) + ignore(GetString("parsUnexpectedEndOfFileExpression")) + ignore(GetString("parsExpectedNameAfterToken")) + ignore(GetString("parsUnmatchedLet")) + ignore(GetString("parsUnmatchedLetBang")) + ignore(GetString("parsUnmatchedUseBang")) + ignore(GetString("parsUnmatchedUse")) + ignore(GetString("parsWhileDoExpected")) + ignore(GetString("parsForDoExpected")) + ignore(GetString("tcInvalidRelationInJoin")) + ignore(GetString("typeInfoCallsWord")) + ignore(GetString("impInvalidNumberOfGenericArguments")) + ignore(GetString("impInvalidMeasureArgument1")) + ignore(GetString("impInvalidMeasureArgument2")) + ignore(GetString("etPropertyNeedsCanWriteOrCanRead")) + ignore(GetString("tcIntoNeedsRestOfQuery")) + ignore(GetString("tcOperatorDoesntAcceptInto")) + ignore(GetString("tcCustomOperationInvalid")) + ignore(GetString("tcThisTypeMayNotHaveACLIMutableAttribute")) + ignore(GetString("tcAutoPropertyRequiresImplicitConstructionSequence")) + ignore(GetString("parsMutableOnAutoPropertyShouldBeGetSet")) + ignore(GetString("parsMutableOnAutoPropertyShouldBeGetSetNotJustSet")) + ignore(GetString("chkNoByrefsOfByrefs")) + ignore(GetString("tastopsMaxArrayThirtyTwo")) + ignore(GetString("tcNoIntegerForLoopInQuery")) + ignore(GetString("tcNoWhileInQuery")) + ignore(GetString("tcNoTryFinallyInQuery")) + ignore(GetString("tcUseMayNotBeUsedInQueries")) + ignore(GetString("tcBindMayNotBeUsedInQueries")) + ignore(GetString("tcReturnMayNotBeUsedInQueries")) + ignore(GetString("tcUnrecognizedQueryOperator")) + ignore(GetString("tcTryWithMayNotBeUsedInQueries")) + ignore(GetString("tcNonSimpleLetBindingInQuery")) + ignore(GetString("etTooManyStaticParameters")) + ignore(GetString("infosInvalidProvidedLiteralValue")) + ignore(GetString("invalidPlatformTarget")) + ignore(GetString("tcThisValueMayNotBeInlined")) + ignore(GetString("etErasedTypeUsedInGeneration")) + ignore(GetString("tcUnrecognizedQueryBinaryOperator")) + ignore(GetString("crefNoSetOfHole")) + ignore(GetString("nicePrintOtherOverloads1")) + ignore(GetString("nicePrintOtherOverloadsN")) + ignore(GetString("erasedTo")) + ignore(GetString("parsUnfinishedExpression")) + ignore(GetString("parsAttributeOnIncompleteCode")) + ignore(GetString("parsTypeNameCannotBeEmpty")) + ignore(GetString("buildProblemReadingAssembly")) + ignore(GetString("tcTPFieldMustBeLiteral")) + ignore(GetString("loadingDescription")) + ignore(GetString("descriptionUnavailable")) + ignore(GetString("chkTyparMultipleClassConstraints")) + ignore(GetString("tcMatchMayNotBeUsedWithQuery")) + ignore(GetString("memberOperatorDefinitionWithNonTripleArgument")) + ignore(GetString("cannotResolveNullableOperators")) + ignore(GetString("tcOperatorRequiresIn")) + ignore(GetString("parsIllegalMemberVarInObjectImplementation")) + ignore(GetString("tcEmptyCopyAndUpdateRecordInvalid")) + ignore(GetString("parsUnderscoreInvalidFieldName")) + ignore(GetString("tcGeneratedTypesShouldBeInternalOrPrivate")) + ignore(GetString("chkGetterAndSetterHaveSamePropertyType")) + ignore(GetString("tcRuntimeSuppliedMethodCannotBeUsedInUserCode")) + ignore(GetString("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName")) + ignore(GetString("tcUnionCaseFieldCannotBeUsedMoreThanOnce")) + ignore(GetString("tcFieldNameIsUsedModeThanOnce")) + ignore(GetString("tcFieldNameConflictsWithGeneratedNameForAnonymousField")) + ignore(GetString("tastConstantExpressionOverflow")) + ignore(GetString("tcIllegalStructTypeForConstantExpression")) + ignore(GetString("fscSystemRuntimeInteropServicesIsRequired")) + ignore(GetString("abImplicitHeapAllocation")) + ignore(GetString("estApplyStaticArgumentsForMethodNotImplemented")) + ignore(GetString("etErrorApplyingStaticArgumentsToMethod")) + ignore(GetString("pplexUnexpectedChar")) + ignore(GetString("ppparsUnexpectedToken")) + ignore(GetString("ppparsIncompleteExpression")) + ignore(GetString("ppparsMissingToken")) + ignore(GetString("pickleMissingDefinition")) + ignore(GetString("checkNotSufficientlyGenericBecauseOfScope")) + ignore(GetString("checkNotSufficientlyGenericBecauseOfScopeAnon")) + ignore(GetString("checkRaiseFamilyFunctionArgumentCount")) + ignore(GetString("checkLowercaseLiteralBindingInPattern")) + ignore(GetString("tcLiteralDoesNotTakeArguments")) + ignore(GetString("tcConstructorsIllegalInAugmentation")) + ignore(GetString("optsInvalidResponseFile")) + ignore(GetString("optsResponseFileNotFound")) + ignore(GetString("optsResponseFileNameInvalid")) + ignore(GetString("fsharpCoreNotFoundToBeCopied")) + ignore(GetString("tcTupleStructMismatch")) + ignore(GetString("etMissingStaticArgumentsToMethod")) + ignore(GetString("considerUpcast")) + ignore(GetString("considerUpcastOperator")) + ignore(GetString("tcRecImplied")) + ignore(GetString("tcOpenFirstInMutRec")) + ignore(GetString("tcModuleAbbrevFirstInMutRec")) + ignore(GetString("tcUnsupportedMutRecDecl")) + ignore(GetString("parsInvalidUseOfRec")) + ignore(GetString("tcStructUnionMultiCaseDistinctFields")) + ignore(GetString("CallerMemberNameIsOverriden")) + ignore(GetString("tcFixedNotAllowed")) + ignore(GetString("tcCouldNotFindOffsetToStringData")) + ignore(GetString("chkNoByrefReturnOfLocal")) + ignore(GetString("tcNamedActivePattern")) + ignore(GetString("DefaultParameterValueNotAppropriateForArgument")) + ignore(GetString("tcGlobalsSystemTypeNotFound")) + ignore(GetString("typrelMemberHasMultiplePossibleDispatchSlots")) + ignore(GetString("methodIsNotStatic")) + ignore(GetString("parsUnexpectedSymbolEqualsInsteadOfIn")) + ignore(GetString("keywordDescriptionAbstract")) + ignore(GetString("keyworkDescriptionAnd")) + ignore(GetString("keywordDescriptionAs")) + ignore(GetString("keywordDescriptionAssert")) + ignore(GetString("keywordDescriptionBase")) + ignore(GetString("keywordDescriptionBegin")) + ignore(GetString("keywordDescriptionClass")) + ignore(GetString("keywordDescriptionDefault")) + ignore(GetString("keywordDescriptionDelegate")) + ignore(GetString("keywordDescriptionDo")) + ignore(GetString("keywordDescriptionDone")) + ignore(GetString("keywordDescriptionDowncast")) + ignore(GetString("keywordDescriptionDownto")) + ignore(GetString("keywordDescriptionElif")) + ignore(GetString("keywordDescriptionElse")) + ignore(GetString("keywordDescriptionEnd")) + ignore(GetString("keywordDescriptionException")) + ignore(GetString("keywordDescriptionExtern")) + ignore(GetString("keywordDescriptionTrueFalse")) + ignore(GetString("keywordDescriptionFinally")) + ignore(GetString("keywordDescriptionFor")) + ignore(GetString("keywordDescriptionFun")) + ignore(GetString("keywordDescriptionFunction")) + ignore(GetString("keywordDescriptionGlobal")) + ignore(GetString("keywordDescriptionIf")) + ignore(GetString("keywordDescriptionIn")) + ignore(GetString("keywordDescriptionInherit")) + ignore(GetString("keywordDescriptionInline")) + ignore(GetString("keywordDescriptionInterface")) + ignore(GetString("keywordDescriptionInternal")) + ignore(GetString("keywordDescriptionLazy")) + ignore(GetString("keywordDescriptionLet")) + ignore(GetString("keywordDescriptionLetBang")) + ignore(GetString("keywordDescriptionMatch")) + ignore(GetString("keywordDescriptionMember")) + ignore(GetString("keywordDescriptionModule")) + ignore(GetString("keywordDescriptionMutable")) + ignore(GetString("keywordDescriptionNamespace")) + ignore(GetString("keywordDescriptionNew")) + ignore(GetString("keywordDescriptionNot")) + ignore(GetString("keywordDescriptionNull")) + ignore(GetString("keywordDescriptionOf")) + ignore(GetString("keywordDescriptionOpen")) + ignore(GetString("keywordDescriptionOr")) + ignore(GetString("keywordDescriptionOverride")) + ignore(GetString("keywordDescriptionPrivate")) + ignore(GetString("keywordDescriptionPublic")) + ignore(GetString("keywordDescriptionRec")) + ignore(GetString("keywordDescriptionReturn")) + ignore(GetString("keywordDescriptionReturnBang")) + ignore(GetString("keywordDescriptionSelect")) + ignore(GetString("keywordDescriptionStatic")) + ignore(GetString("keywordDescriptionStruct")) + ignore(GetString("keywordDescriptionThen")) + ignore(GetString("keywordDescriptionTo")) + ignore(GetString("keywordDescriptionTry")) + ignore(GetString("keywordDescriptionType")) + ignore(GetString("keywordDescriptionUpcast")) + ignore(GetString("keywordDescriptionUse")) + ignore(GetString("keywordDescriptionUseBang")) + ignore(GetString("keywordDescriptionVal")) + ignore(GetString("keywordDescriptionVoid")) + ignore(GetString("keywordDescriptionWhen")) + ignore(GetString("keywordDescriptionWhile")) + ignore(GetString("keywordDescriptionWith")) + ignore(GetString("keywordDescriptionYield")) + ignore(GetString("keywordDescriptionYieldBang")) + ignore(GetString("keywordDescriptionRightArrow")) + ignore(GetString("keywordDescriptionLeftArrow")) + ignore(GetString("keywordDescriptionCast")) + ignore(GetString("keywordDescriptionDynamicCast")) + ignore(GetString("keywordDescriptionTypedQuotation")) + ignore(GetString("keywordDescriptionUntypedQuotation")) + ignore(GetString("itemNotFoundDuringDynamicCodeGen")) + ignore(GetString("itemNotFoundInTypeDuringDynamicCodeGen")) + ignore(GetString("descriptionWordIs")) + ignore(GetString("notAFunction")) + ignore(GetString("notAFunctionButMaybeIndexerWithName")) + ignore(GetString("notAFunctionButMaybeIndexer")) + ignore(GetString("notAFunctionButMaybeIndexerErrorCode")) + ignore(GetString("notAFunctionButMaybeDeclaration")) + ignore(GetString("ArgumentsInSigAndImplMismatch")) + ignore(GetString("pickleUnexpectedNonZero")) + () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx new file mode 100644 index 00000000000..71f965fc9fa --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -0,0 +1,4306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The namespace '{0}' is not defined. + + + The namespace or module '{0}' is not defined. + + + The field, constructor or member '{0}' is not defined. + + + The value, constructor, namespace or type '{0}' is not defined. + + + The value or constructor '{0}' is not defined. + + + The value, namespace, type or module '{0}' is not defined. + + + The constructor, module or namespace '{0}' is not defined. + + + The type '{0}' is not defined. + + + The type '{0}' is not defined in '{1}'. + + + The record label or namespace '{0}' is not defined. + + + The record label '{0}' is not defined. + + + Maybe you want one of the following: + + + The type parameter {0} is not defined. + + + The pattern discriminator '{0}' is not defined. + + + Replace with '{0}' + + + Add . for indexer access. + + + All elements of a list constructor expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. + + + All elements of an array constructor expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. + + + The 'if' expression is missing an 'else' branch. The 'then' branch has type '{0}'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type. + + + The 'if' expression needs to have type '{0}' to satisfy context type requirements. It currently has type '{1}'. + + + All branches of an 'if' expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. + + + All branches of a pattern match expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. + + + A pattern match guard must be of type 'bool', but this 'when' expression is of type '{0}'. + + + A ';' is used to separate field values in records. Consider replacing ',' with ';'. + + + The '!' operator is used to dereference a ref cell. Consider using 'not expr' here. + + + The non-generic type '{0}' does not expect any type arguments, but here is given {1} type argument(s) + + + Consider using 'return!' instead of 'return'. + + + Consider using 'yield!' instead of 'yield'. + + + \nA tuple type is required for one or more arguments. Consider wrapping the given arguments in additional parentheses or review the definition of the interface. + + + Invalid warning number '{0}' + + + Invalid version string '{0}' + + + Invalid version file '{0}' + + + Microsoft (R) F# Compiler version {0} + + + F# Compiler for F# {0} + + + Problem with filename '{0}': {1} + + + No inputs specified + + + The '--pdb' option requires the '--debug' option to be used + + + The search directory '{0}' is invalid + + + The search directory '{0}' could not be found + + + '{0}' is not a valid filename + + + '{0}' is not a valid assembly name + + + Unrecognized privacy setting '{0}' for managed resource, valid options are 'public' and 'private' + + + Multiple references to '{0}.dll' are not permitted + + + Could not read version from mscorlib.dll + + + Unable to read assembly '{0}' + + + Assembly resolution failure at or near this location + + + The declarations in this file will be placed in an implicit module '{0}' based on the file name '{1}'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file. + + + Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration. + + + Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error. + + + This file contains multiple declarations of the form 'module SomeNamespace.SomeModule'. Only one declaration of this form is permitted in a file. Change your file to use an initial namespace declaration and/or use 'module ModuleName = ...' to define your modules. + + + Option requires parameter: {0} + + + Source file '{0}' could not be found + + + The file extension of '{0}' is not recognized. Source files must have extension .fs, .fsi, .fsx, .fsscript, .ml or .mli. + + + Could not resolve assembly '{0}' + + + Could not resolve assembly '{0}' required by '{1}' + + + Error opening binary file '{0}': {1} + + + The F#-compiled DLL '{0}' needs to be recompiled to be used with this version of F# + + + Invalid directive. Expected '#I \"<path>\"'. + + + Invalid directive. Expected '#r \"<file-or-assembly>\"'. + + + Invalid directive. Expected '#load \"<file>\" ... \"<file>\"'. + + + Invalid directive. Expected '#time', '#time \"on\"' or '#time \"off\"'. + + + Directives inside modules are ignored + + + A signature for the file or module '{0}' has already been specified + + + An implementation of file or module '{0}' has already been given. Compilation order is significant in F# because of type inference. You may need to adjust the order of your files to place the signature file before the implementation. In Visual Studio files are type-checked in the order they appear in the project file, which can be edited manually or adjusted using the solution explorer. + + + An implementation of the file or module '{0}' has already been given + + + The signature file '{0}' does not have a corresponding implementation file. If an implementation file exists then check the 'module' and 'namespace' declarations in the signature and implementation files match. + + + '{0}' is not a valid integer argument + + + '{0}' is not a valid floating point argument + + + Unrecognized option: '{0}' + + + Invalid module or namespace name + + + Error reading/writing metadata for the F# compiled DLL '{0}'. Was the DLL compiled with an earlier version of the F# compiler? (error: '{1}'). + + + The type/module '{0}' is not a concrete module or type + + + The type '{0}' has an inline assembly code representation + + + A namespace and a module named '{0}' both occur in two parts of this assembly + + + Two modules named '{0}' occur in two parts of this assembly + + + Two type definitions named '{0}' occur in namespace '{1}' in two parts of this assembly + + + A module and a type definition named '{0}' occur in namespace '{1}' in two parts of this assembly + + + Invalid member signature encountered because of an earlier error + + + This value does not have a valid property setter type + + + Invalid form for a property getter. At least one '()' argument is required when using the explicit syntax. + + + Invalid form for a property setter. At least one argument is required. + + + Unexpected use of a byref-typed variable + + + A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' + + + Invalid mutation of a constant expression. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...'. + + + The value has been copied to ensure the original is not mutated by this operation or because the copy is implicit when returning a struct from a member and another member is then accessed + + + Recursively defined values cannot appear directly as part of the construction of a tuple value within a recursive binding + + + Recursive values cannot appear directly as a construction of the type '{0}' within a recursive binding. This feature has been removed from the F# language. Consider using a record instead. + + + Recursive values cannot be directly assigned to the non-mutable field '{0}' of the type '{1}' within a recursive binding. Consider using a mutable field instead. + + + Unexpected decode of AutoOpenAttribute + + + Unexpected decode of InternalsVisibleToAttribute + + + Unexpected decode of InterfaceDataVersionAttribute + + + Active patterns cannot return more than 7 possibilities + + + This is not a valid constant expression or custom attribute value + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe mutability attributes differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe names differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe compiled names differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe display names differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe accessibility specified in the signature is more than that specified in the implementation + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe inline flags differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe literal constant values and/or attributes differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is a type function and the other is not. The signature requires explicit type parameters if they are present in the implementation. + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe respective type parameter counts differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe types differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is an extension member and the other is not + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nAn arity was not inferred for this value + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe number of generic parameters in the signature and implementation differ (the signature declares {3} but the implementation declares {4} + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe generic parameters in the signature and implementation have different kinds. Perhaps there is a missing [<Measure>] attribute. + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe arities in the signature and implementation differ. The signature specifies that '{3}' is function definition or lambda expression accepting at least {4} argument(s), but the implementation is a computed function value. To declare that a computed function value is a permitted implementation simply parenthesize its type in the signature, e.g.\n\tval {5}: int -> (int -> int)\ninstead of\n\tval {6}: int -> int -> int. + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe CLI member names differ + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is static and the other isn't + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is virtual and the other isn't + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is abstract and the other isn't + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is final and the other isn't + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is marked as an override and the other isn't + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nOne is a constructor/property and the other is not + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe compiled representation of this method is as a static member but the signature indicates its compiled representation is as an instance member + + + Module '{0}' contains\n {1} \nbut its signature specifies\n {2} \nThe compiled representation of this method is as an instance member, but the signature indicates its compiled representation is as a static member + + + The {0} definitions in the signature and implementation are not compatible because the names differ. The type is called '{1}' in the signature file but '{2}' in implementation. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the respective type parameter counts differ + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the accessibility specified in the signature is more than that specified in the implementation + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature requires that the type supports the interface {2} but the interface has not been implemented + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation says this type may use nulls as a representation but the signature does not + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation says this type may use nulls as an extra value but the signature does not + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature says this type may use nulls as a representation but the implementation does not + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature says this type may use nulls as an extra value but the implementation does not + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation type is sealed but the signature implies it is not. Consider adding the [<Sealed>] attribute to the signature. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation type is not sealed but signature implies it is. Consider adding the [<Sealed>] attribute to the implementation. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation is an abstract class but the signature is not. Consider adding the [<AbstractClass>] attribute to the signature. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature is an abstract class but the implementation is not. Consider adding the [<AbstractClass>] attribute to the implementation. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the types have different base types + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the number of {2}s differ + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature defines the {2} '{3}' but the implementation does not (or does, but not in the same order) + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation defines the {2} '{3}' but the signature does not (or does, but not in the same order) + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the implementation defines a struct but the signature defines a type with a hidden representation + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because a CLI type representation is being hidden by a signature + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because a type representation is being hidden by a signature + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the types are of different kinds + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the IL representations differ + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the representations differ + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the field {2} was present in the implementation but not in the signature + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the order of the fields is different in the signature and implementation + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the field {2} was required by the signature but was not specified by the implementation + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the field '{2}' was present in the implementation but not in the signature. Struct types must now reveal their fields in the signature for the type, though the fields may still be labelled 'private' or 'internal'. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abstract member '{2}' was required by the signature but was not specified by the implementation + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abstract member '{2}' was present in the implementation but not in the signature + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature declares a {2} while the implementation declares a {3} + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. + + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the signature has an abbreviation while the implementation does not + + + The module contains the constructor\n {0} \nbut its signature specifies\n {1} \nThe names differ + + + The module contains the constructor\n {0} \nbut its signature specifies\n {1} \nThe respective number of data fields differ + + + The module contains the constructor\n {0} \nbut its signature specifies\n {1} \nThe types of the fields differ + + + The module contains the constructor\n {0} \nbut its signature specifies\n {1} \nthe accessibility specified in the signature is more than that specified in the implementation + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nThe names differ + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nthe accessibility specified in the signature is more than that specified in the implementation + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nThe 'static' modifiers differ + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nThe 'mutable' modifiers differ + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nThe 'literal' modifiers differ + + + The module contains the field\n {0} \nbut its signature specifies\n {1} \nThe types differ + + + The implicit instantiation of a generic construct at or near this point could not be resolved because it could resolve to multiple unrelated types, e.g. '{0}' and '{1}'. Consider using type annotations to resolve the ambiguity + + + Could not resolve the ambiguity inherent in the use of the operator '{0}' at or near this program point. Consider using type annotations to resolve the ambiguity. + + + Could not resolve the ambiguity inherent in the use of a 'printf'-style format string + + + Could not resolve the ambiguity in the use of a generic construct with an 'enum' constraint at or near this position + + + Could not resolve the ambiguity in the use of a generic construct with a 'delegate' constraint at or near this position + + + Invalid value + + + The signature and implementation are not compatible because the respective type parameter counts differ + + + The signature and implementation are not compatible because the type parameter in the class/signature has a different compile-time requirement to the one in the member/implementation + + + The signature and implementation are not compatible because the declaration of the type parameter '{0}' requires a constraint of the form {1} + + + The signature and implementation are not compatible because the type parameter '{0}' has a constraint of the form {1} but the implementation does not. Either remove this constraint from the signature or add it to the implementation. + + + The type '{0}' implements 'System.IComparable'. Consider also adding an explicit override for 'Object.Equals' + + + The type '{0}' implements 'System.IComparable' explicitly but provides no corresponding override for 'Object.Equals'. An implementation of 'Object.Equals' has been automatically provided, implemented via 'System.IComparable'. Consider implementing the override 'Object.Equals' explicitly + + + The struct, record or union type '{0}' has an explicit implementation of 'Object.GetHashCode' or 'Object.Equals'. You must apply the 'CustomEquality' attribute to the type + + + The struct, record or union type '{0}' has an explicit implementation of 'Object.GetHashCode'. Consider implementing a matching override for 'Object.Equals(obj)' + + + The struct, record or union type '{0}' has an explicit implementation of 'Object.Equals'. Consider implementing a matching override for 'Object.GetHashCode()' + + + The exception definitions are not compatible because a CLI exception mapping is being hidden by a signature. The exception mapping must be visible to other modules. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1} + + + The exception definitions are not compatible because the CLI representations differ. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1} + + + The exception definitions are not compatible because the exception abbreviation is being hidden by the signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1}. + + + The exception definitions are not compatible because the exception abbreviations in the signature and implementation differ. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1}. + + + The exception definitions are not compatible because the exception declarations differ. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1}. + + + The exception definitions are not compatible because the field '{0}' was required by the signature but was not specified by the implementation. The module contains the exception definition\n {1} \nbut its signature specifies\n\t{2}. + + + The exception definitions are not compatible because the field '{0}' was present in the implementation but not in the signature. The module contains the exception definition\n {1} \nbut its signature specifies\n\t{2}. + + + The exception definitions are not compatible because the order of the fields is different in the signature and implementation. The module contains the exception definition\n {0} \nbut its signature specifies\n\t{1}. + + + The namespace or module attributes differ between signature and implementation + + + This method is over-constrained in its type parameters + + + No implementations of '{0}' had the correct number of arguments and type parameters. The required signature is '{1}'. + + + The override for '{0}' was ambiguous + + + More than one override implements '{0}' + + + The method '{0}' is sealed and cannot be overridden + + + The override '{0}' implements more than one abstract slot, e.g. '{1}' and '{2}' + + + Duplicate or redundant interface + + + The interface '{0}' is included in multiple explicitly implemented interface types. Add an explicit implementation of this interface. + + + A named argument has been assigned more than one value + + + No implementation was given for '{0}' + + + No implementation was given for '{0}'. Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'. + + + The member '{0}' does not have the correct number of arguments. The required signature is '{1}'. + + + The member '{0}' does not have the correct number of method type parameters. The required signature is '{1}'. + + + The member '{0}' does not have the correct kinds of generic parameters. The required signature is '{1}'. + + + The member '{0}' cannot be used to implement '{1}'. The required signature is '{2}'. + + + Error while parsing embedded IL + + + Error while parsing embedded IL type + + + This indexer notation has been removed from the F# language + + + Invalid expression on left of assignment + + + The 'ReferenceEquality' attribute cannot be used on structs. Consider using the 'StructuralEquality' attribute instead, or implement an override for 'System.Object.Equals(obj)'. + + + This type uses an invalid mix of the attributes 'NoEquality', 'ReferenceEquality', 'StructuralEquality', 'NoComparison' and 'StructuralComparison' + + + The 'NoEquality' attribute must be used in conjunction with the 'NoComparison' attribute + + + The 'StructuralComparison' attribute must be used in conjunction with the 'StructuralEquality' attribute + + + The 'StructuralEquality' attribute must be used in conjunction with the 'NoComparison' or 'StructuralComparison' attributes + + + A type cannot have both the 'ReferenceEquality' and 'StructuralEquality' or 'StructuralComparison' attributes + + + Only record, union, exception and struct types may be augmented with the 'ReferenceEquality', 'StructuralEquality' and 'StructuralComparison' attributes + + + A type with attribute 'ReferenceEquality' cannot have an explicit implementation of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' + + + A type with attribute 'CustomEquality' must have an explicit implementation of at least one of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' + + + A type with attribute 'CustomComparison' must have an explicit implementation of at least one of 'System.IComparable' or 'System.Collections.IStructuralComparable' + + + A type with attribute 'NoEquality' should not usually have an explicit implementation of 'Object.Equals(obj)'. Disable this warning if this is intentional for interoperability purposes + + + A type with attribute 'NoComparison' should not usually have an explicit implementation of 'System.IComparable', 'System.IComparable<_>' or 'System.Collections.IStructuralComparable'. Disable this warning if this is intentional for interoperability purposes + + + The 'CustomEquality' attribute must be used in conjunction with the 'NoComparison' or 'CustomComparison' attributes + + + Positional specifiers are not permitted in format strings + + + Missing format specifier + + + '{0}' flag set twice + + + Prefix flag (' ' or '+') set twice + + + The # formatting modifier is invalid in F# + + + Bad precision in format specifier + + + Bad width in format specifier + + + '{0}' format does not support '0' flag + + + Precision missing after the '.' + + + '{0}' format does not support precision + + + Bad format specifier (after l or L): Expected ld,li,lo,lu,lx or lX. In F# code you can use %d, %x, %o or %u instead, which are overloaded to work with all basic integer types. + + + The 'l' or 'L' in this format specifier is unnecessary. In F# code you can use %d, %x, %o or %u instead, which are overloaded to work with all basic integer types. + + + The 'h' or 'H' in this format specifier is unnecessary. You can use %d, %x, %o or %u instead, which are overloaded to work with all basic integer types. + + + '{0}' does not support prefix '{1}' flag + + + Bad format specifier: '{0}' + + + System.Environment.Exit did not exit + + + The treatment of this operator is now handled directly by the F# compiler and its meaning cannot be redefined + + + A protected member is called or 'base' is being used. This is only allowed in the direct implementation of members since they could escape their object scope. + + + The byref-typed variable '{0}' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. + + + The 'base' keyword is used in an invalid way. Base calls cannot be used in closures. Consider using a private member to make base calls. + + + The variable '{0}' is used in an invalid way + + + The type '{0}' is less accessible than the value, member or type '{1}' it is used in. + + + 'System.Void' can only be used as 'typeof<System.Void>' in F# + + + A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + + + Calls to 'reraise' may only occur directly in a handler of a try-with + + + Expression-splicing operators may only be used within quotations + + + First-class uses of the expression-splicing operator are not permitted + + + First-class uses of the address-of operators are not permitted + + + First-class uses of the 'reraise' function is not permitted + + + The byref typed value '{0}' cannot be used at this point + + + 'base' values may only be used to make direct calls to the base implementations of overridden members + + + Object constructors cannot directly use try/with and try/finally prior to the initialization of the object. This includes constructs such as 'for x in ...' that may elaborate to uses of these constructs. This is a limitation imposed by Common IL. + + + The address of the variable '{0}' cannot be used at this point + + + The address of the static field '{0}' cannot be used at this point + + + The address of the field '{0}' cannot be used at this point + + + The address of an array element cannot be used at this point + + + The type of a first-class function cannot contain byrefs + + + A method return type would contain byrefs which is not permitted + + + Invalid custom attribute value (not a constant or literal) + + + The attribute type '{0}' has 'AllowMultiple=false'. Multiple instances of this attribute cannot be attached to a single language element. + + + The member '{0}' is used in an invalid way. A use of '{1}' has been inferred prior to its definition at or near '{2}'. This is an invalid forward reference. + + + A byref typed value would be stored here. Top-level let-bound byref values are not permitted. + + + [<ReflectedDefinition>] terms cannot contain uses of the prefix splice operator '%' + + + A function labeled with the 'EntryPointAttribute' attribute must be the last declaration in the last file in the compilation sequence. + + + compiled form of the union case + + + default augmentation of the union case + + + The property '{0}' has the same name as a method in type '{1}'. + + + The property '{0}' of type '{1}' has a getter and a setter that do not match. If one is abstract then the other must be as well. + + + The property '{0}' has the same name as another property in type '{1}', but one takes indexer arguments and the other does not. You may be missing an indexer argument to one of your properties. + + + A type would store a byref typed value. This is not permitted by Common IL. + + + Duplicate method. The method '{0}' has the same name and signature as another method in type '{1}'. + + + Duplicate method. The method '{0}' has the same name and signature as another method in type '{1}' once tuples, functions, units of measure and/or provided types are erased. + + + The method '{0}' has curried arguments but has the same name as another method in type '{1}'. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. + + + Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments + + + Duplicate property. The property '{0}' has the same name and signature as another property in type '{1}'. + + + Duplicate property. The property '{0}' has the same name and signature as another property in type '{1}' once tuples, functions, units of measure and/or provided types are erased. + + + Duplicate method. The abstract method '{0}' has the same name and signature as an abstract method in an inherited type. + + + Duplicate method. The abstract method '{0}' has the same name and signature as an abstract method in an inherited type once tuples, functions, units of measure and/or provided types are erased. + + + This type implements the same interface at different generic instantiations '{0}' and '{1}'. This is not permitted in this version of F#. + + + The type of a field using the 'DefaultValue' attribute must admit default initialization, i.e. have 'null' as a proper value or be a struct type whose fields all admit default initialization. You can use 'DefaultValue(false)' to disable this check + + + The type abbreviation contains byrefs. This is not permitted by F#. + + + The variable '{0}' is bound in a quotation but is used as part of a spliced expression. This is not permitted since it may escape its scope. + + + Quotations cannot contain uses of generic expressions + + + Quotations cannot contain function definitions that are inferred or declared to be generic. Consider adding some type constraints to make this a valid quoted expression. + + + Quotations cannot contain object expressions + + + Quotations cannot contain expressions that take the address of a field + + + Quotations cannot contain expressions that fetch static fields + + + Quotations cannot contain inline assembly code or pattern matching on arrays + + + Quotations cannot contain descending for loops + + + Quotations cannot contain expressions that fetch union case indexes + + + Quotations cannot contain expressions that set union case fields + + + Quotations cannot contain expressions that set fields in exception values + + + Quotations cannot contain expressions that require byref pointers + + + Quotations cannot contain expressions that make member constraint calls, or uses of operators that implicitly resolve to a member constraint call + + + Quotations cannot contain this kind of constant + + + Quotations cannot contain this kind of pattern match + + + Quotations cannot contain array pattern matching + + + Quotations cannot contain this kind of type + + + The declared type parameter '{0}' cannot be used here since the type parameter cannot be resolved at compile time + + + This code is less generic than indicated by its annotations. A unit-of-measure specified using '_' has been determined to be '1', i.e. dimensionless. Consider making the code generic, or removing the use of '_'. + + + Type inference problem too complicated (maximum iteration depth reached). Consider adding further type annotations. + + + Expected arguments to an instance member + + + This indexer expects {0} arguments but is here given {1} + + + Expecting a type supporting the operator '{0}' but given a function type. You may be missing an argument to a function. + + + Expecting a type supporting the operator '{0}' but given a tuple type + + + None of the types '{0}' support the operator '{1}' + + + The type '{0}' does not support the operator '{1}' + + + None of the types '{0}' support the operator '{1}'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + + + The type '{0}' does not support the operator '{1}'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + + + The type '{0}' does not support a conversion to the type '{1}' + + + The type '{0}' has a method '{1}' (full name '{2}'), but the method is static + + + The type '{0}' has a method '{1}' (full name '{2}'), but the method is not static + + + The constraints 'struct' and 'not struct' are inconsistent + + + The type '{0}' does not have 'null' as a proper value + + + The type '{0}' does not have 'null' as a proper value. To create a null value for a Nullable type use 'System.Nullable()'. + + + The type '{0}' does not support the 'comparison' constraint because it has the 'NoComparison' attribute + + + The type '{0}' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + + + The type '{0}' does not support the 'comparison' constraint because it is a record, union or struct with one or more structural element types which do not support the 'comparison' constraint. Either avoid the use of comparison with this type, or add the 'StructuralComparison' attribute to the type to determine which field type does not support comparison + + + The type '{0}' does not support the 'equality' constraint because it has the 'NoEquality' attribute + + + The type '{0}' does not support the 'equality' constraint because it is a function type + + + The type '{0}' does not support the 'equality' constraint because it is a record, union or struct with one or more structural element types which do not support the 'equality' constraint. Either avoid the use of equality with this type, or add the 'StructuralEquality' attribute to the type to determine which field type does not support equality + + + The type '{0}' is not a CLI enum type + + + The type '{0}' has a non-standard delegate type + + + The type '{0}' is not a CLI delegate type + + + This type parameter cannot be instantiated to 'Nullable'. This is a restriction imposed in order to ensure the meaning of 'null' in some CLI languages is not confusing when used in conjunction with 'Nullable' values. + + + A generic construct requires that the type '{0}' is a CLI or F# struct type + + + A generic construct requires that the type '{0}' is an unmanaged type + + + The type '{0}' is not compatible with any of the types {1}, arising from the use of a printf-style format string + + + A generic construct requires that the type '{0}' have reference semantics, but it does not, i.e. it is a struct + + + A generic construct requires that the type '{0}' be non-abstract + + + A generic construct requires that the type '{0}' have a public default constructor + + + Type instantiation length mismatch + + + Optional arguments not permitted here + + + {0} is not a static member + + + {0} is not an instance member + + + Argument length mismatch + + + The argument types don't match + + + This method expects a CLI 'params' parameter in this position. 'params' is a way of passing a variable number of arguments to a method in languages such as C#. Consider passing an array for this argument + + + The member or object constructor '{0}' is not {1} + + + The member or object constructor '{0}' is not {1}. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions. + + + {0} is not a static method + + + {0} is not an instance method + + + The member or object constructor '{0}' has no argument or settable return property '{1}'. {2}. + + + The object constructor '{0}' has no argument or settable return property '{1}'. {2}. + + + The required signature is {0} + + + The member or object constructor '{0}' requires {1} argument(s). The required signature is '{2}'. + + + The member or object constructor '{0}' requires {1} additional argument(s). The required signature is '{2}'. + + + The member or object constructor '{0}' requires {1} argument(s). The required signature is '{2}'. Some names for missing arguments are {3}. + + + The member or object constructor '{0}' requires {1} additional argument(s). The required signature is '{2}'. Some names for missing arguments are {3}. + + + The member or object constructor '{0}' requires {1} argument(s) but is here given {2} unnamed and {3} named argument(s). The required signature is '{4}'. + + + The member or object constructor '{0}' takes {1} argument(s) but is here given {2}. The required signature is '{3}'. + + + The object constructor '{0}' takes {1} argument(s) but is here given {2}. The required signature is '{3}'. + + + The object constructor '{0}' takes {1} argument(s) but is here given {2}. The required signature is '{3}'. If some of the arguments are meant to assign values to properties, consider separating those arguments with a comma (','). + + + The member or object constructor '{0}' takes {1} type argument(s) but is here given {2}. The required signature is '{3}'. + + + A member or object constructor '{0}' taking {1} arguments is not accessible from this code location. All accessible versions of method '{2}' take {3} arguments. + + + Incorrect generic instantiation. No {0} member named '{1}' takes {2} generic arguments. + + + The member or object constructor '{0}' does not take {1} argument(s). An overload was found taking {2} arguments. + + + No {0} member or object constructor named '{1}' takes {2} arguments + + + No {0} member or object constructor named '{1}' takes {2} arguments. Note the call to this member also provides {3} named arguments. + + + No {0} member or object constructor named '{1}' takes {2} arguments. The named argument '{3}' doesn't correspond to any argument or settable return property for any overload. + + + Method or object constructor '{0}' not found + + + No overloads match for method '{0}'. + + + A unique overload for method '{0}' could not be determined based on type information prior to this program point. A type annotation may be needed. + + + Candidates: {0} + + + The available overloads are shown below. + + + Accessibility modifiers are not permitted on 'do' bindings, but '{0}' was given. + + + End of file in #if section begun at or after here + + + End of file in string begun at or before here + + + End of file in verbatim string begun at or before here + + + End of file in comment begun at or before here + + + End of file in string embedded in comment begun at or before here + + + End of file in verbatim string embedded in comment begun at or before here + + + End of file in IF-OCAML section begun at or before here + + + End of file in directive begun at or before here + + + No #endif found for #if or #else + + + Attributes have been ignored in this construct + + + 'use' bindings are not permitted in primary constructors + + + 'use' bindings are not permitted in modules and are treated as 'let' bindings + + + An integer for loop must use a simple identifier + + + At most one 'with' augmentation is permitted + + + A semicolon is not expected at this point + + + Unexpected end of input + + + Accessibility modifiers are not permitted here, but '{0}' was given. + + + Only '#' compiler directives may occur prior to the first 'namespace' declaration + + + Accessibility modifiers should come immediately prior to the identifier naming a construct + + + Files should begin with either a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule', but not both. To define a module within a namespace use 'module SomeModule = ...' + + + A module abbreviation must be a simple name, not a path + + + Ignoring attributes on module abbreviation + + + The '{0}' accessibility attribute is not allowed on module abbreviation. Module abbreviations are always private. + + + The '{0}' visibility attribute is not allowed on module abbreviation. Module abbreviations are always private. + + + Unclosed block + + + Unmatched 'begin' or 'struct' + + + A module name must be a simple name, not a path + + + Unexpected empty type moduleDefn list + + + Attributes should be placed before 'val' + + + Attributes are not permitted on interface implementations + + + Syntax error + + + Augmentations are not permitted on delegate type moduleDefns + + + Unmatched 'class', 'interface' or 'struct' + + + A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. + + + Unmatched 'with' or badly formatted 'with' block + + + 'get', 'set' or 'get,set' required + + + Only class types may take value arguments + + + Unmatched 'begin' + + + Invalid declaration syntax + + + 'get' and/or 'set' required + + + Type annotations on property getters and setters must be given after the 'get()' or 'set(v)', e.g. 'with get() : string = ...' + + + A getter property is expected to be a function, e.g. 'get() = ...' or 'get(index) = ...' + + + Multiple accessibilities given for property getter or setter + + + Property setters must be defined using 'set value = ', 'set idx value = ' or 'set (idx1,...,idxN) value = ... ' + + + Interfaces always have the same visibility as the enclosing type + + + Accessibility modifiers are not allowed on this member. Abstract slots always have the same visibility as the enclosing type. + + + Attributes are not permitted on 'inherit' declarations + + + Accessibility modifiers are not permitted on an 'inherits' declaration + + + 'inherit' declarations cannot have 'as' bindings. To access members of the base class when overriding a method, the syntax 'base.SomeMember' may be used; 'base' is a keyword. Remove this 'as' binding. + + + Attributes are not allowed here + + + Accessibility modifiers are not permitted in this position for type abbreviations + + + Accessibility modifiers are not permitted in this position for enum types + + + All enum fields must be given values + + + Accessibility modifiers are not permitted on inline assembly code types + + + Unexpected identifier: '{0}' + + + Accessibility modifiers are not permitted on union cases. Use 'type U = internal ...' or 'type U = private ...' to give an accessibility to the whole representation. + + + Accessibility modifiers are not permitted on enumeration fields + + + Consider using a separate record type instead + + + Accessibility modifiers are not permitted on record fields. Use 'type R = internal ...' or 'type R = private ...' to give an accessibility to the whole representation. + + + The declaration form 'let ... and ...' for non-recursive bindings is not used in F# code. Consider using a sequence of 'let' bindings + + + Unmatched '(' + + + Successive patterns should be separated by spaces or tupled + + + No matching 'in' found for this 'let' + + + Error in the return expression for this 'let'. Possible incorrect indentation. + + + The block following this '{0}' is unfinished. Every code block is an expression and must have a result. '{1}' cannot be the final code element in a block. Consider giving this block an explicit result. + + + Incomplete conditional. Expected 'if <expr> then <expr>' or 'if <expr> then <expr> else <expr>'. + + + 'assert' may not be used as a first class value. Use 'assert <expr>' instead. + + + Identifier expected + + + 'in' or '=' expected + + + The use of '->' in sequence and computation expressions is limited to the form 'for pat in expr -> expr'. Use the syntax 'for ... in ... do ... yield...' to generate elements in more complex sequence expressions. + + + Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized + + + Unmatched '[' + + + Missing qualification after '.' + + + In F# code you may use 'expr.[expr]'. A type annotation may be required to indicate the first expression is an array + + + Mismatched quotation, beginning with '{0}' + + + Unmatched '{0}' + + + Unmatched '[|' + + + Unmatched '{{' + + + Field bindings must have the form 'id = expr;' + + + This member is not permitted in an object implementation + + + Missing function body + + + Syntax error in labelled type argument + + + Unexpected infix operator in type expression + + + The syntax '(typ,...,typ) ident' is not used in F# code. Consider using 'ident<typ,...,typ>' instead + + + Invalid literal in type + + + Unexpected infix operator in unit-of-measure expression. Legal operators are '*', '/' and '^'. + + + Unexpected integer literal in unit-of-measure expression + + + Syntax error: unexpected type parameter specification + + + Mismatched quotation operator name, beginning with '{0}' + + + Active pattern case identifiers must begin with an uppercase letter + + + The '|' character is not permitted in active pattern case identifiers + + + Denominator must not be 0 in unit-of-measure exponent + + + No '=' symbol should follow a 'namespace' declaration + + + The syntax 'module ... = struct .. end' is not used in F# code. Consider using 'module ... = begin .. end' + + + The syntax 'module ... : sig .. end' is not used in F# code. Consider using 'module ... = begin .. end' + + + A static field was used where an instance field is expected + + + Method '{0}' is not accessible from this code location + + + Implicit product of measures following / + + + Unexpected SynMeasure.Anon + + + Non-zero constants cannot have generic units. For generic zero, write 0.0<_>. + + + In sequence expressions, results are generated using 'yield' + + + Unexpected big rational constant + + + Units-of-measure supported only on float, float32, decimal and signed integer types + + + Unexpected Const_uint16array + + + Unexpected Const_bytearray + + + A parameter with attributes must also be given a name, e.g. '[<Attribute>] Name : Type' + + + Return values cannot have names + + + MemberKind.PropertyGetSet only expected in parse trees + + + Namespaces cannot contain values. Consider using a module to hold your value declarations. + + + Namespaces cannot contain extension members except in the same file and namespace declaration group where the type is defined. Consider using a module to hold declarations of extension members. + + + Multiple visibility attributes have been specified for this identifier + + + Multiple visibility attributes have been specified for this identifier. 'let' bindings in classes are always private, as are any 'let' bindings inside expressions. + + + The name '({0})' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name '{1}' instead. + + + The name '({0})' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name '{1}' instead. + + + The name '({0})' should not be used as a member name. If defining a static member for use from other CLI languages then use the name '{1}' instead. + + + The name '({0})' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + The '{0}' operator should not normally be redefined. To define overloaded comparison semantics for a particular type, implement the 'System.IComparable' interface in the definition of that type. + + + The '{0}' operator should not normally be redefined. To define equality semantics for a type, override the 'Object.Equals' member in the definition of that type. + + + The '{0}' operator should not normally be redefined. Consider using a different operator name + + + The '{0}' operator cannot be redefined. Consider using a different operator name + + + Expected module or namespace parent {0} + + + The struct, record or union type '{0}' implements the interface 'System.IComparable' explicitly. You must apply the 'CustomComparison' attribute to the type. + + + The struct, record or union type '{0}' implements the interface 'System.IComparable<_>' explicitly. You must apply the 'CustomComparison' attribute to the type, and should also provide a consistent implementation of the non-generic interface System.IComparable. + + + The struct, record or union type '{0}' implements the interface 'System.IStructuralComparable' explicitly. Apply the 'CustomComparison' attribute to the type. + + + This record contains fields from inconsistent types + + + DLLImport stubs cannot be inlined + + + Structs may only bind a 'this' parameter at member declarations + + + Unexpected expression at recursive inference point + + + This code is less generic than required by its annotations because the explicit type variable '{0}' could not be generalized. It was constrained to be '{1}'. + + + One or more of the explicit class or function type variables for this binding could not be generalized, because they were constrained to other types + + + A generic type parameter has been used in a way that constrains it to always be '{0}' + + + This type parameter has been used in a way that constrains it to always be '{0}' + + + The type parameters inferred for this value are not stable under the erasure of type abbreviations. This is due to the use of type abbreviations which drop or reorder type parameters, e.g. \n\ttype taggedInt<'a> = int or\n\ttype swap<'a,'b> = 'b * 'a.\nConsider declaring the type parameters for this value explicitly, e.g.\n\tlet f<'a,'b> ((x,y) : swap<'b,'a>) : swap<'a,'b> = (y,x). + + + Explicit type parameters may only be used on module or member bindings + + + You must explicitly declare either all or no type parameters when overriding a generic abstract method + + + The field labels and expected type of this record expression or pattern do not uniquely determine a corresponding record type + + + The field '{0}' appears twice in this record expression or pattern + + + Unknown union case + + + This code is not sufficiently generic. The type variable {0} could not be generalized because it would escape its scope. + + + A property cannot have explicit type parameters. Consider using a method instead. + + + A constructor cannot have explicit type parameters. Consider using a static construction method instead. + + + This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args) = ...'. + + + Unexpected source-level property specification in syntax tree + + + A static initializer requires an argument + + + An object constructor requires an argument + + + This static member should not have a 'this' parameter. Consider using the notation 'member Member(args) = ...'. + + + An explicit static initializer should use the syntax 'static new(args) = expr' + + + An explicit object constructor should use the syntax 'new(args) = expr' + + + Unexpected source-level property specification + + + This form of object expression is not used in F#. Use 'member this.MemberName ... = ...' to define member implementations in object expressions. + + + Invalid declaration + + + Attributes are not allowed within patterns + + + The generic function '{0}' must be given explicit type argument(s) + + + The method or function '{0}' should not be given explicit type argument(s) because it does not declare its type parameters explicitly + + + This value, type or method expects {0} type parameter(s) but was given {1} + + + The default, zero-initializing constructor of a struct type may only be used if all the fields of the struct type admit default initialization + + + Couldn't find Dispose on IDisposable, or it was overloaded + + + This value is not a literal and cannot be used in a pattern + + + This field is readonly + + + Named arguments must appear after all other arguments + + + This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking {0} arguments. + + + The type '{0}' is not a type whose values can be enumerated with this syntax, i.e. is not compatible with either seq<_>, IEnumerable<_> or IEnumerable and does not have a GetEnumerator method + + + This recursive binding uses an invalid mixture of recursive forms + + + This is not a valid object construction expression. Explicit object constructors must either call an alternate constructor or initialize all fields of the object and specify a call to a super class constructor. + + + Invalid constraint + + + Invalid constraint: the type used for the constraint is sealed, which means the constraint could only be satisfied by at most one solution + + + An 'enum' constraint must be of the form 'enum<type>' + + + 'new' constraints must take one argument of type 'unit' and return the constructed type + + + This property has an invalid type. Properties taking multiple indexer arguments should have types of the form 'ty1 * ty2 -> ty3'. Properties returning functions should have types of the form '(ty1 -> ty2)'. + + + Expected unit-of-measure parameter, not type parameter. Explicit unit-of-measure parameters must be marked with the [<Measure>] attribute. + + + Expected type parameter, not unit-of-measure parameter + + + Expected type, not unit-of-measure + + + Expected unit-of-measure, not type + + + Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets. + + + Unit-of-measure cannot be used in type constructor application + + + This control construct may only be used if the computation expression builder defines a '{0}' method + + + This type has no nested types + + + Unexpected {0} in type expression + + + Type parameter cannot be used as type constructor + + + Illegal syntax in type expression + + + Anonymous unit-of-measure cannot be nested inside another unit-of-measure expression + + + Anonymous type variables are not permitted in this declaration + + + Unexpected / in type + + + Unexpected type arguments + + + Optional arguments are only permitted on type members + + + Name '{0}' not bound in pattern context + + + Non-primitive numeric literal constants cannot be used in pattern matches because they can be mapped to multiple different types through the use of a NumericLiteral module. Consider using replacing with a variable, and use 'when <variable> = <constant>' at the end of the match clause. + + + Type arguments cannot be specified here + + + Only active patterns returning exactly one result may accept arguments + + + Invalid argument to parameterized pattern label + + + Internal error. Invalid index into active pattern array + + + This union case does not take arguments + + + This union case takes one argument + + + This union case expects {0} arguments in tupled form + + + Field '{0}' is not static + + + This field is not a literal and cannot be used in a pattern + + + This is not a variable, constant, active recognizer or literal + + + This is not a valid pattern + + + Character range matches have been removed in F#. Consider using a 'when' pattern guard instead. + + + Illegal pattern + + + Syntax error - unexpected '?' symbol + + + Expected {0} expressions, got {1} + + + TcExprUndelayed: delayed + + + This expression form may only be used in sequence and computation expressions + + + Invalid object expression. Objects without overrides or interfaces should use the expression form 'new Type(args)' without braces. + + + Invalid object, sequence or record expression + + + Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' + + + This list or array expression includes an element of the form 'if ... then ... else'. Parenthesize this expression to indicate it is an individual element of the list or array, to disambiguate this from a list generated using a sequence expression + + + Unable to parse format string '{0}' + + + This list expression exceeds the maximum size for list literals. Use an array for larger literals and call Array.ToList. + + + The expression form 'expr then expr' may only be used as part of an explicit object constructor + + + Named arguments cannot be given to member trait calls + + + This is not a valid name for an enumeration case + + + This field is not mutable + + + This construct may only be used within list, array and sequence expressions, e.g. expressions of the form 'seq {{ ... }}', '[ ... ]' or '[| ... |]'. These use the syntax 'for ... in ... do ... yield...' to generate elements + + + This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. + + + This construct may only be used within sequence or computation expressions + + + This construct may only be used within computation expressions + + + Invalid indexer expression + + + The operator 'expr.[idx]' has been used on an object of indeterminate type based on information prior to this program point. Consider adding further type constraints + + + Cannot inherit from a variable type + + + Calls to object constructors on type parameters cannot be given arguments + + + The 'CompiledName' attribute cannot be used with this language element + + + '{0}' may only be used with named types + + + 'inherit' cannot be used on interface types. Consider implementing the interface by using 'interface ... with ... end' instead. + + + 'new' cannot be used on interface types. Consider using an object expression '{{ new ... with ... }}' instead. + + + Instances of this type cannot be created since it has been marked abstract or not all methods have been given implementations. Consider using an object expression '{{ new ... with ... }}' instead. + + + It is recommended that objects supporting the IDisposable interface are created using the syntax 'new Type(args)', rather than 'Type(args)' or 'Type' as a function value representing the constructor, to indicate that resources may be owned by the generated value + + + '{0}' may only be used to construct object types + + + Constructors for the type '{0}' must directly or indirectly call its implicit object constructor. Use a call to the implicit object constructor instead of a record expression. + + + The field '{0}' has been given a value, but is not present in the type '{1}' + + + No assignment given for field '{0}' of type '{1}' + + + Extraneous fields have been given values + + + Only overrides of abstract and virtual members may be specified in object expressions + + + The member '{0}' does not correspond to any abstract or virtual method available to override or implement. + + + The type {0} contains the member '{1}' but it is not a virtual or abstract method that is available to override or implement. + + + The member '{0}' does not accept the correct number of arguments. {1} argument(s) are expected, but {2} were given. The required signature is '{3}'.{4} + + + The member '{0}' does not accept the correct number of arguments. One overload accepts {1} arguments, but {2} were given. The required signature is '{3}'.{4} + + + A simple method name is required here + + + The types System.ValueType, System.Enum, System.Delegate, System.MulticastDelegate and System.Array cannot be used as super types in an object expression or class + + + 'new' must be used with a named type + + + Cannot create an extension of a sealed type + + + No arguments may be given when constructing a record value + + + Interface implementations cannot be given on construction expressions + + + Object construction expressions may only be used to implement constructors in class types + + + Only simple bindings of the form 'id = expr' can be used in construction expressions + + + Objects must be initialized by an object construction expression that calls an inherited object constructor and assigns a value to each field + + + Expected an interface type + + + Constructor expressions for interfaces do not take arguments + + + This object constructor requires arguments + + + 'new' may only be used with object constructors + + + At least one override did not correctly implement its corresponding abstract member + + + This numeric literal requires that a module '{0}' defining functions FromZero, FromOne, FromInt32, FromInt64 and FromString be in scope + + + Invalid record construction + + + The expression form {{ expr with ... }} may only be used with record types. To build object types use {{ new Type(...) with ... }} + + + The inherited type is not an object model type + + + Object construction expressions (i.e. record expressions with inheritance specifications) may only be used to implement constructors in object model types. Use 'new ObjectType(args)' to construct instances of object model types outside of constructors + + + '{{ }}' is not a valid expression. Records must include at least one field. Empty sequences are specified by using Seq.empty or an empty list '[]'. + + + This type is not a record type. Values of class and struct types must be created using calls to object constructors. + + + This type is not a record type + + + This construct is ambiguous as part of a computation expression. Nested expressions may be written using 'let _ = (...)' and nested computations using 'let! res = builder {{ ... }}'. + + + This construct is ambiguous as part of a sequence expression. Nested expressions may be written using 'let _ = (...)' and nested sequences using 'yield! seq {{... }}'. + + + 'do!' cannot be used within sequence expressions + + + The use of 'let! x = coll' in sequence expressions is not permitted. Use 'for x in coll' instead. + + + 'try'/'with' cannot be used within sequence expressions + + + In sequence expressions, multiple results are generated using 'yield!' + + + Invalid assignment + + + Invalid use of a type name + + + This type has no accessible object constructors + + + Invalid use of an interface type + + + Invalid use of a delegate constructor. Use the syntax 'new Type(args)' or just 'Type(args)'. + + + Property '{0}' is not static + + + Property '{0}' is not readable + + + This lookup cannot be used here + + + Property '{0}' is static + + + Property '{0}' cannot be set + + + Constructors must be applied to arguments and cannot be used as first-class values. If necessary use an anonymous function '(fun arg1 ... argN -> new Type(arg1,...,argN))'. + + + The syntax 'expr.id' may only be used with record labels, properties and fields + + + Event '{0}' is static + + + Event '{0}' is not static + + + The named argument '{0}' did not match any argument or mutable property + + + One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form. + + + The unnamed arguments do not form a prefix of the arguments of the method called + + + Static optimization conditionals are only for use within the F# library + + + The corresponding formal argument is not optional + + + Invalid optional assignment to a property or field + + + A delegate constructor must be passed a single function value + + + A binding cannot be marked both 'use' and 'rec' + + + The 'VolatileField' attribute may only be used on 'let' bindings in classes + + + Attributes are not permitted on 'let' bindings in expressions + + + The 'DefaultValue' attribute may only be used on 'val' declarations + + + The 'ConditionalAttribute' attribute may only be used on members + + + This is not a valid name for an active pattern + + + The 'EntryPointAttribute' attribute may only be used on function definitions in modules + + + Mutable values cannot be marked 'inline' + + + Mutable values cannot have generic parameters + + + Mutable function values should be written 'let mutable f = (fun args -> ...)' + + + Only functions may be marked 'inline' + + + A literal value cannot be given the [<ThreadStatic>] or [<ContextStatic>] attributes + + + A literal value cannot be marked 'mutable' + + + A literal value cannot be marked 'inline' + + + Literal values cannot have generic parameters + + + This is not a valid constant expression + + + This type is not accessible from this code location + + + Unexpected condition in imported assembly: failed to decode AttributeUsage attribute + + + Unrecognized attribute target. Valid attribute targets are 'assembly', 'module', 'type', 'method', 'property', 'return', 'param', 'field', 'event', 'constructor'. + + + This attribute is not valid for use on this language element. Assembly attributes should be attached to a 'do ()' declaration, if necessary within an F# module. + + + This attribute is not valid for use on this language element + + + Optional arguments cannot be used in custom attributes + + + This property cannot be set + + + This property or field was not found on this custom attribute type + + + A custom attribute must be a reference type + + + The number of args for a custom attribute does not match the expected number of args for the attribute constructor + + + A custom attribute must invoke an object constructor + + + Attribute expressions must be calls to object constructors + + + This attribute cannot be used in this version of F# + + + Invalid inline specification + + + 'use' bindings must be of the form 'use <var> = <expr>' + + + Abstract members are not permitted in an augmentation - they must be defined as part of the type itself + + + Method overrides and interface implementations are not permitted here + + + No abstract or interface member was found that corresponds to this override + + + This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:{0} + + + This method already has a default implementation + + + The method implemented by this default is ambiguous + + + No abstract property was found that corresponds to this override + + + This property overrides or implements an abstract property but the abstract property doesn't have a corresponding {0} + + + Invalid signature for set member + + + This new member hides the abstract member '{0}'. Rename the member or use 'override' instead. + + + This new member hides the abstract member '{0}' once tuples, functions, units of measure and/or provided types are erased. Rename the member or use 'override' instead. + + + Interfaces cannot contain definitions of static initializers + + + Interfaces cannot contain definitions of object constructors + + + Interfaces cannot contain definitions of member overrides + + + Interfaces cannot contain definitions of concrete members. You may need to define a constructor on your type to indicate that the type is a class. + + + Constructors cannot be specified in exception augmentations + + + Structs cannot have an object constructor with no arguments. This is a restriction imposed on all CLI languages as structs automatically support a default constructor. + + + Constructors cannot be defined for this type + + + Recursive bindings that include member specifications can only occur as a direct augmentation of a type + + + Only simple variable patterns can be bound in 'let rec' constructs + + + Only record fields and simple, non-recursive 'let' bindings may be marked mutable + + + This member is not sufficiently generic + + + A declaration may only be the [<Literal>] attribute if a constant value is also given, e.g. 'val x : int = 1' + + + A declaration may only be given a value in a signature if the declaration has the [<Literal>] attribute + + + Thread-static and context-static variables must be static and given the [<DefaultValue>] attribute to indicate that the value is initialized to the default value on each new thread + + + Volatile fields must be marked 'mutable' and cannot be thread-static + + + Uninitialized 'val' fields must be mutable and marked with the '[<DefaultValue>]' attribute. Consider using a 'let' binding instead of a 'val' field. + + + Static 'val' fields in types must be mutable, private and marked with the '[<DefaultValue>]' attribute. They are initialized to the 'null' or 'zero' value for their type. Consider also using a 'static let mutable' binding in a class type. + + + This field requires a name + + + Invalid namespace, module, type or union case name + + + Explicit type declarations for constructors must be of the form 'ty1 * ... * tyN -> resTy'. Parentheses may be required around 'resTy' + + + Return types of union cases must be identical to the type being defined, up to abbreviations + + + This is not a valid value for an enumeration literal + + + The type '{0}' is not an interface type + + + Duplicate specification of an interface + + + A field/val declaration is not permitted here + + + A inheritance declaration is not permitted here + + + This declaration opens the module '{0}', which is marked as 'RequireQualifiedAccess'. Adjust your code to use qualified references to the elements of the module instead, e.g. 'List.map' instead of 'map'. This change will ensure that your code is robust as new constructs are added to libraries. + + + This declaration opens the namespace or module '{0}' through a partially qualified path. Adjust this code to use the full path of the namespace. This change will make your code more robust as new constructs are added to the F# and CLI libraries. + + + Local class bindings cannot be marked inline. Consider lifting the definition out of the class or else do not mark it as inline. + + + Type abbreviations cannot have members + + + As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors. + + + Enumerations cannot have members + + + Measure declarations may have only static members + + + Structs cannot contain 'do' bindings because the default constructor for structs would not execute these bindings + + + Structs cannot contain value definitions because the default constructor for structs will not execute these bindings. Consider adding additional arguments to the primary constructor for the type. + + + Static value definitions may only be used in types with a primary constructor. Consider adding arguments to the type definition, e.g. 'type X(args) = ...'. + + + Measure declarations may have only static members: constructors are not available + + + A member and a local class binding both have the name '{0}' + + + Type abbreviations cannot have interface declarations + + + Enumerations cannot have interface declarations + + + This type is not an interface type + + + All implemented interfaces should be declared on the initial declaration of the type + + + A default implementation of this interface has already been added because the explicit implementation of the interface was not specified at the definition of the type + + + This member is not permitted in an interface implementation + + + This declaration element is not permitted in an augmentation + + + Types cannot contain nested type definitions + + + type, exception or module + + + type or module + + + The struct, record or union type '{0}' implements the interface 'System.IStructuralEquatable' explicitly. Apply the 'CustomEquality' attribute to the type. + + + The struct, record or union type '{0}' implements the interface 'System.IEquatable<_>' explicitly. Apply the 'CustomEquality' attribute to the type and provide a consistent implementation of the non-generic override 'System.Object.Equals(obj)'. + + + Explicit type specifications cannot be used for exception constructors + + + Exception abbreviations should not have argument lists + + + Abbreviations for Common IL exceptions cannot take arguments + + + Exception abbreviations must refer to existing exceptions or F# types deriving from System.Exception + + + Abbreviations for Common IL exception types must have a matching object constructor + + + Not an exception + + + Invalid module name + + + Invalid type extension + + + The attributes of this type specify multiple kinds for the type + + + The kind of the type specified by its attributes does not match the kind implied by its definition + + + Measure definitions cannot have type parameters + + + This type requires a definition + + + This type abbreviation has one or more declared type parameters that do not appear in the type being abbreviated. Type abbreviations must use all declared type parameters in the type being abbreviated. Consider removing one or more type parameters, or use a concrete type definition that wraps an underlying type, such as 'type C<'a> = C of ...'. + + + Structs, interfaces, enums and delegates cannot inherit from other types + + + Types cannot inherit from multiple concrete types + + + Records, union, abbreviations and struct types cannot have the 'AllowNullLiteral' attribute + + + Types with the 'AllowNullLiteral' attribute may only inherit from or implement types which also allow the use of the null literal + + + Generic types cannot be given the 'StructLayout' attribute + + + Only structs and classes without primary constructors may be given the 'StructLayout' attribute + + + The representation of this type is hidden by the signature. It must be given an attribute such as [<Sealed>], [<Class>] or [<Interface>] to indicate the characteristics of the type. + + + Only classes may be given the 'AbstractClass' attribute + + + Only types representing units-of-measure may be given the 'Measure' attribute + + + Accessibility modifiers are not permitted on overrides or interface implementations + + + Discriminated union types are always sealed + + + Record types are always sealed + + + Assembly code types are always sealed + + + Struct types are always sealed + + + Delegate types are always sealed + + + Enum types are always sealed + + + Interface types and delegate types cannot contain fields + + + Abbreviated types cannot be given the 'Sealed' attribute + + + Cannot inherit a sealed type + + + Cannot inherit from interface type. Use interface ... with instead. + + + Struct types cannot contain abstract members + + + Interface types cannot be sealed + + + Delegate specifications must be of the form 'typ -> typ' + + + Delegate specifications must not be curried types. Use 'typ * ... * typ -> typ' for multi-argument delegates, and 'typ -> (typ -> typ)' for delegates returning function values. + + + Literal enumerations must have type int, uint, int16, uint16, int64, uint64, byte, sbyte or char + + + This type definition involves an immediate cyclic reference through an abbreviation + + + This type definition involves an immediate cyclic reference through a struct field or inheritance relation + + + The syntax 'type X with ...' is reserved for augmentations. Types whose representations are hidden but which have members are now declared in signatures using 'type X = ...'. You may also need to add the '[<Sealed>] attribute to the type definition in the signature + + + Members that extend interface, delegate or enum types must be placed in a module separate to the definition of the type. This module must either have the AutoOpen attribute or be opened explicitly by client code to bring the extension members into scope. + + + One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '{0}' + + + Type definitions may only have one 'inherit' specification and it must be the first declaration + + + 'let' and 'do' bindings must come before member and interface definitions in type definitions + + + This 'inherit' declaration specifies the inherited type but no arguments. Consider supplying arguments, e.g. 'inherit BaseType(args)'. + + + This 'inherit' declaration has arguments, but is not in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + + + This definition may only be used in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + + + Type abbreviations cannot have augmentations + + + The path '{0}' is a namespace. A module abbreviation may not abbreviate a namespace. + + + The type '{0}' is used in an invalid way. A value prior to '{1}' has an inferred type involving '{2}', which is an invalid forward reference. + + + The member '{0}' is used in an invalid way. A use of '{1}' has been inferred prior to the definition of '{2}', which is an invalid forward reference. + + + The attribute 'AutoOpen(\"{0}\")' in the assembly '{1}' did not refer to a valid module or namespace in that assembly and has been ignored + + + Undefined value '{0}' + + + Label {0} not found + + + Incorrect number of type arguments to local call + + + Dynamic invocation of {0} is not supported + + + Taking the address of a literal field is invalid + + + This operation involves taking the address of a value '{0}' represented using a local variable or other special representation. This is invalid. + + + Custom marshallers cannot be specified in F# code. Consider using a C# helper function. + + + The MarshalAs attribute could not be decoded + + + The signature for this external function contains type parameters. Constrain the argument and return types to indicate the types of the corresponding C function. + + + The DllImport attribute could not be decoded + + + Literal fields cannot be set + + + GenSetStorage: {0} was represented as a static method but was not an appropriate lambda expression + + + Mutable variables cannot escape their method + + + Compiler error: unexpected unrealized value + + + Main module of program is empty: nothing will happen when it is run + + + This type cannot be used for a literal field + + + Unexpected GetSet annotation on a property + + + The FieldOffset attribute could not be decoded + + + The StructLayout attribute could not be decoded + + + The DefaultAugmentation attribute could not be decoded + + + Reflected definitions cannot contain uses of the prefix splice operator '%' + + + Problem with codepage '{0}': {1} + + + Copyright (c) Microsoft Corporation. All Rights Reserved. + + + Freely distributed under the MIT Open Source License. https://github.com/Microsoft/visualfsharp/blob/master/License.txt + + + Name of the output file (Short form: -o) + + + Build a console executable + + + Build a Windows executable + + + Build a library (Short form: -a) + + + Build a module that can be added to another assembly + + + Delay-sign the assembly using only the public portion of the strong name key + + + Public-sign the assembly using only the public portion of the strong name key, and mark the assembly as signed + + + Write the xmldoc of the assembly to the given file + + + Specify a strong name key file + + + Specify a strong name key container + + + Limit which platforms this code can run on: x86, Itanium, x64, anycpu32bitpreferred, or anycpu. The default is anycpu. + + + Only include optimization information essential for implementing inlined constructs. Inhibits cross-module inlining but improves binary compatibility. + + + Don't add a resource to the generated assembly containing F#-specific metadata + + + Print the inferred interface of the assembly to a file + + + Reference an assembly (Short form: -r) + + + Specify a Win32 resource file (.res) + + + Specify a Win32 manifest file + + + Do not include the default Win32 manifest + + + Embed all source files in the portable PDB file + + + Embed specific source files in the portable PDB file + + + Source link information file to embed in the portable PDB file + + + --embed switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) + + + --sourcelink switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) + + + Source file is too large to embed in a portable PDB + + + Embed the specified managed resource + + + Link the specified resource to this assembly where the resinfo format is <file>[,<string name>[,public|private]] + + + Emit debug information (Short form: -g) + + + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + + + Enable optimizations (Short form: -O) + + + Enable or disable tailcalls + + + Produce a deterministic assembly (including module version GUID and timestamp) + + + Enable or disable cross-module optimizations + + + Report all warnings as errors + + + Report specific warnings as errors + + + Set a warning level (0-5) + + + Disable specific warning messages + + + Enable specific warnings that may be off by default + + + Generate overflow checks + + + Define conditional compilation symbols (Short form: -d) + + + Ignore ML compatibility warnings + + + Suppress compiler copyright message + + + Display this usage message (Short form: -?) + + + Read response file for more options + + + Specify the codepage used to read source files + + + Output messages in UTF-8 encoding + + + Output messages with fully qualified paths + + + Specify a directory for the include path which is used to resolve source files and assemblies (Short form: -I) + + + Base address for the library to be built + + + Do not reference the default CLI assemblies by default + + + Statically link the F# library and all referenced DLLs that depend on it into the assembly being generated + + + Statically link the given assembly and all referenced DLLs that depend on this assembly. Use an assembly name e.g. mylib, not a DLL name. + + + Use a resident background compilation service to improve compiler startup times. + + + Name the output debug file + + + Resolve assembly references using directory-based rules rather than MSBuild resolution + + + Unrecognized target '{0}', expected 'exe', 'winexe', 'library' or 'module' + + + Unrecognized debug type '{0}', expected 'pdbonly' or 'full' + + + Invalid warning level '{0}' + + + Short form of '{0}' + + + The command-line option '--cliroot' has been deprecated. Use an explicit reference to a specific copy of mscorlib.dll instead. + + + Use to override where the compiler looks for mscorlib.dll and framework components + + + - OUTPUT FILES - + + + - INPUT FILES - + + + - RESOURCES - + + + - CODE GENERATION - + + + - ADVANCED - + + + - MISCELLANEOUS - + + + - LANGUAGE - + + + - ERRORS AND WARNINGS - + + + Unknown --test argument: '{0}' + + + Unrecognized platform '{0}', valid values are 'x86', 'x64', 'Itanium', 'anycpu32bitpreferred', and 'anycpu' + + + The command-line option '{0}' is for test purposes only + + + The command-line option '{0}' has been deprecated + + + The command-line option '{0}' has been deprecated. Use '{1}' instead. + + + The command-line option '{0}' has been deprecated. HTML document generation is now part of the F# Power Pack, via the tool FsHtmlDoc.exe. + + + Output warning and error messages in color + + + Enable high-entropy ASLR + + + Specify subsystem version of this assembly + + + Specify target framework profile of this assembly. Valid values are mscorlib, netcore or netstandard. Default - mscorlib + + + Emit debug information in quotations + + + Specify the preferred output language culture name (e.g. es-ES, ja-JP) + + + Don't copy FSharp.Core.dll along the produced binaries + + + Invalid version '{0}' for '--subsystemversion'. The version must be 4.00 or greater. + + + Invalid value '{0}' for '--targetprofile', valid values are 'mscorlib', 'netcore' or 'netstandard'. + + + Full name + + + and {0} other overloads + + + union case + + + active pattern result + + + active recognizer + + + field + + + event + + + property + + + extension + + + custom operation + + + argument + + + patvar + + + namespace + + + module + + + namespace/module + + + from {0} + + + also from {0} + + + generated property + + + generated type + + + Found by AssemblyFolders registry key + + + Found by AssemblyFoldersEx registry key + + + .NET Framework + + + Global Assembly Cache + + + Recursive class hierarchy in type '{0}' + + + Invalid recursive reference to an abstract slot + + + The event '{0}' has a non-standard type. If this event is declared in another CLI language, you may need to access this event using the explicit {1} and {2} methods for the event. If this event is declared in F#, make the type of the event an instantiation of either 'IDelegateEvent<_>' or 'IEvent<_,_>'. + + + The type '{0}' is not accessible from this code location + + + The union cases or fields of the type '{0}' are not accessible from this code location + + + The value '{0}' is not accessible from this code location + + + The union case '{0}' is not accessible from this code location + + + The record, struct or class field '{0}' is not accessible from this code location + + + The struct or class field '{0}' is not accessible from this code location + + + This construct is experimental + + + No Invoke methods found for delegate type + + + More than one Invoke method found for delegate type + + + Delegates are not allowed to have curried signatures + + + Unexpected Expr.TyChoose + + + Note: Lambda-lifting optimizations have not been applied because of the use of this local constrained generic function as a first class value. Adding type constraints may resolve this condition. + + + Identifiers containing '@' are reserved for use in F# code generation + + + The identifier '{0}' is reserved for future use by F# + + + Missing variable '{0}' + + + Partial active patterns may only generate one result + + + The type '{0}' is required here and is unavailable. You must add a reference to assembly '{1}'. + + + A reference to the type '{0}' in assembly '{1}' was found, but the type could not be found in that assembly + + + Internal error or badly formed metadata: not enough type parameters were in scope while importing + + + A reference to the DLL {0} is required by assembly {1}. The imported type {2} is located in the first assembly and could not be resolved. + + + An imported assembly uses the type '{0}' but that type is not public + + + The value '{0}' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible + + + The value '{0}' was marked inline but was not bound in the optimization environment + + + Local value {0} not found during optimization + + + A value marked as 'inline' has an unexpected value + + + A value marked as 'inline' could not be inlined + + + Failed to inline the value '{0}' marked 'inline', perhaps because a recursive value was marked 'inline' + + + Recursive ValValue {0} + + + The indentation of this 'in' token is incorrect with respect to the corresponding 'let' + + + Possible incorrect indentation: this token is offside of context started at position {0}. Try indenting this token further or using standard formatting conventions. + + + The '|' tokens separating rules of this pattern match are misaligned by one column. Consider realigning your code or using further indentation. + + + Invalid module/expression/type + + + Multiple types exist called '{0}', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. '{1}'. + + + The instantiation of the generic type '{0}' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. '{1}'. + + + 'global' may only be used as the first name in a qualified path + + + This is not a constructor or literal, or a constructor is being used incorrectly + + + Unexpected empty long identifier + + + The record type '{0}' does not contain a label '{1}'. + + + Invalid field label + + + Invalid expression '{0}' + + + No constructors are available for the type '{0}' + + + The union type for union case '{0}' was defined with the RequireQualifiedAccessAttribute. Include the name of the union type ('{1}') in the name you are using. + + + The record type for the record field '{0}' was defined with the RequireQualifiedAccessAttribute. Include the name of the record type ('{1}') in the name you are using. + + + Unexpected error creating debug information file '{0}' + + + This number is outside the allowable range for this integer type + + + '{0}' is not permitted as a character in operator names and is reserved for future use + + + Unexpected character '{0}' + + + This byte array literal contains characters that do not encode as a single byte + + + Identifiers followed by '{0}' are reserved for future use + + + This number is outside the allowable range for 8-bit signed integers + + + This number is outside the allowable range for hexadecimal 8-bit signed integers + + + This number is outside the allowable range for 8-bit unsigned integers + + + This number is outside the allowable range for 16-bit signed integers + + + This number is outside the allowable range for 16-bit unsigned integers + + + This number is outside the allowable range for 32-bit signed integers + + + This number is outside the allowable range for 32-bit unsigned integers + + + This number is outside the allowable range for 64-bit signed integers + + + This number is outside the allowable range for 64-bit unsigned integers + + + This number is outside the allowable range for signed native integers + + + This number is outside the allowable range for unsigned native integers + + + Invalid floating point number + + + This number is outside the allowable range for decimal literals + + + This number is outside the allowable range for 32-bit floats + + + This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). + + + This is not a valid byte literal + + + This is not a valid character literal + + + This Unicode encoding is only valid in string literals + + + This token is reserved for future use + + + TABs are not allowed in F# code unless the #indent \"off\" option is used + + + Invalid line number: '{0}' + + + #if directive must appear as the first non-whitespace character on a line + + + #else has no matching #if + + + #endif required for #else + + + #else directive must appear as the first non-whitespace character on a line + + + #endif has no matching #if + + + #endif directive must appear as the first non-whitespace character on a line + + + #if directive should be immediately followed by an identifier + + + Syntax error. Wrong nested #endif, unexpected tokens before it. + + + #! may only appear as the first line at the start of a file. + + + Expected single line comment or end of line + + + Infix operator member '{0}' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + Infix operator member '{0}' has {1} initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + Infix operator member '{0}' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + All record, union and struct types in FSharp.Core.dll must be explicitly labelled with 'StructuralComparison' or 'NoComparison' + + + The struct, record or union type '{0}' has the 'StructuralComparison' attribute but the type parameter '{1}' does not satisfy the 'comparison' constraint. Consider adding the 'comparison' constraint to the type parameter + + + The struct, record or union type '{0}' has the 'StructuralComparison' attribute but the component type '{1}' does not satisfy the 'comparison' constraint + + + The struct, record or union type '{0}' is not structurally comparable because the type parameter {1} does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '{2}' to clarify that the type is not comparable + + + The struct, record or union type '{0}' is not structurally comparable because the type '{1}' does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '{2}' to clarify that the type is not comparable + + + The struct, record or union type '{0}' does not support structural equality because the type parameter {1} does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '{2}' to clarify that the type does not support structural equality + + + The struct, record or union type '{0}' does not support structural equality because the type '{1}' does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '{2}' to clarify that the type does not support structural equality + + + The struct, record or union type '{0}' has the 'StructuralEquality' attribute but the type parameter '{1}' does not satisfy the 'equality' constraint. Consider adding the 'equality' constraint to the type parameter + + + The struct, record or union type '{0}' has the 'StructuralEquality' attribute but the component type '{1}' does not satisfy the 'equality' constraint + + + Each argument of the primary constructor for a struct must be given a type, for example 'type S(x1:int, x2: int) = ...'. These arguments determine the fields of the struct. + + + The value '{0}' is unused + + + The recursive object reference '{0}' is unused. The presence of a recursive object reference adds runtime initialization checks to members in this and derived types. Consider removing this recursive object reference. + + + A getter property may have at most one argument group + + + A setter property may have at most two argument groups + + + Invalid property getter or setter + + + An indexer property must be given at least one argument + + + This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation + + + Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" + + + Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" + + + The use of the type syntax 'int C' and 'C <int>' is not permitted here. Consider adjusting this type to be written in the form 'C<int>' + + + The module/namespace '{0}' from compilation unit '{1}' did not contain the module/namespace '{2}' + + + The module/namespace '{0}' from compilation unit '{1}' did not contain the val '{2}' + + + The module/namespace '{0}' from compilation unit '{1}' did not contain the namespace, module or type '{2}' + + + The 'UseNullAsTrueValue' attribute flag may only be used with union types that have one nullary case and at least one non-nullary case + + + The parameter '{0}' was inferred to have byref type. Parameters of byref type must be given an explicit type annotation, e.g. 'x1: byref<int>'. When used, a byref parameter is implicitly dereferenced. + + + The generic member '{0}' has been used at a non-uniform instantiation prior to this program point. Consider reordering the members so this member occurs first. Alternatively, specify the full type of the member explicitly, including argument types, return type and any additional generic parameters and constraints. + + + The attribute '{0}' appears in both the implementation and the signature, but the attribute arguments differ. Only the attribute from the signature will be included in the compiled code. + + + Cannot call an abstract base member: '{0}' + + + Could not resolve the ambiguity in the use of a generic construct with an 'unmanaged' constraint at or near this position + + + This construct is for ML compatibility. {0}. You can disable this warning by using '--mlcompatibility' or '--nowarn:62'. + + + The type '{0}' has been marked as having an Explicit layout, but the field '{1}' has not been marked with the 'FieldOffset' attribute + + + Interfaces inherited by other interfaces should be declared using 'inherit ...' instead of 'interface ...' + + + Invalid prefix operator + + + Invalid operator definition. Prefix operator definitions must use a valid prefix operator name. + + + The file extensions '.ml' and '.mli' are for ML compatibility + + + Consider using a file with extension '.ml' or '.mli' instead + + + Active pattern '{0}' is not a function + + + Active pattern '{0}' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice<int,unit> = A x' + + + The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) + + + Optional arguments must come at the end of the argument list, after any non-optional arguments + + + Attribute 'System.Diagnostics.ConditionalAttribute' is only valid on methods or attribute classes + + + Extension members cannot provide operator overloads. Consider defining the operator as part of the type definition instead. + + + The name of the MDB file must be <assembly-file-name>.mdb. The --pdb option will be ignored. + + + MDB generation failed. Could not find compatible member {0} + + + Cannot generate MDB debug information. Failed to load the 'MonoSymbolWriter' type from the 'Mono.CompilerServices.SymbolWriter.dll' assembly. + + + The union case named '{0}' conflicts with the generated type '{1}' + + + ReflectedDefinitionAttribute may not be applied to an instance member on a struct type, because the instance member takes an implicit 'this' byref parameter + + + DLLImport bindings must be static members in a class or function definitions in a module + + + When mscorlib.dll or FSharp.Core.dll is explicitly referenced the {0} option must also be passed + + + FSharp.Core.sigdata not found alongside FSharp.Core. File expected in {0}. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. + + + File '{0}' not found alongside FSharp.Core. File expected in {1}. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. + + + Filename '{0}' contains invalid character '{1}' + + + 'use!' bindings must be of the form 'use! <var> = <expr>' + + + Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic. + + + The type '{0}' is not a valid enumerator type , i.e. does not have a 'MoveNext()' method returning a bool, and a 'Current' property + + + End of file in triple-quote string begun at or before here + + + End of file in triple-quote string embedded in comment begun at or before here + + + This type test or downcast will ignore the unit-of-measure '{0}' + + + Expected type argument or static argument + + + Unmatched '<'. Expected closing '>' + + + Unexpected quotation operator '<@' in type definition. If you intend to pass a verbatim string as a static argument to a type provider, put a space between the '<' and '@' characters. + + + Attempted to parse this as an operator name, but failed + + + \U{0} is not a valid Unicode character escape sequence + + + '{0}' must be applied to an argument of type '{1}', but has been applied to an argument of type '{2}' + + + '{0}' can only be applied to optional arguments + + + The specified .NET Framework version '{0}' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion. + + + Invalid Magic value in CLR Header + + + Bad image format + + + Private key expected + + + RSA key expected + + + Invalid bit Length + + + Invalid RSAParameters structure - '{{0}}' expected + + + Invalid algId - 'Exponent' expected + + + Invalid signature size + + + No signature directory + + + Invalid Public Key blob + + + Exiting - too many errors + + + The documentation file has no .xml suffix + + + No implementation files specified + + + An {0} specified version '{1}', but this value is invalid and has been ignored + + + Conflicting options specified: 'win32manifest' and 'win32res'. Only one of these can be used. + + + The code in assembly '{0}' makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. + + + Code in this assembly makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. + + + Static linking may not include a .EXE + + + Static linking may not include a mixed managed/unmanaged DLL + + + Ignoring mixed managed/unmanaged assembly '{0}' during static linking + + + Assembly '{0}' was referenced transitively and the assembly could not be resolved automatically. Static linking will assume this DLL has no dependencies on the F# library or other statically linked DLLs. Consider adding an explicit reference to this DLL. + + + Assembly '{0}' not found in dependency set of target binary. Statically linked roots should be specified using an assembly name, without a DLL or EXE extension. If this assembly was referenced explicitly then it is possible the assembly was not actually required by the generated binary, in which case it should not be statically linked. + + + The key file '{0}' could not be opened + + + A problem occurred writing the binary '{0}': {1} + + + The 'AssemblyVersionAttribute' has been ignored because a version was given using a command line option + + + Error emitting 'System.Reflection.AssemblyCultureAttribute' attribute -- 'Executables cannot be satellite assemblies, Culture should always be empty' + + + Option '--delaysign' overrides attribute 'System.Reflection.AssemblyDelaySignAttribute' given in a source file or added module + + + Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module + + + Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module + + + The assembly '{0}' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'. + + + The resident compilation service was not used because a problem occured in communicating with the server. + + + Problem with filename '{0}': Illegal characters in path. + + + Passing a .resx file ({0}) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an <EmbeddedResource> item in the .fsproj project file. + + + Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly). + + + An {0} specified version '{1}', but this value is a wildcard, and you have requested a deterministic build, these are in conflict. + + + Determinstic builds only support portable PDBs (--debug:portable or --debug:embedded) + + + Character '{0}' is not allowed in provided namespace name '{1}' + + + The provided type '{0}' returned a member with a null or empty member name + + + The provided type '{0}' returned a null member + + + The provided type '{0}' member info '{1}' has null declaring type + + + The provided type '{0}' has member '{1}' which has declaring type '{2}'. Expected declaring type to be the same as provided type. + + + Referenced assembly '{0}' has assembly level attribute '{1}' but no public type provider classes were found + + + Type '{0}' from type provider '{1}' has an empty namespace. Use 'null' for the global namespace. + + + Empty namespace found from the type provider '{0}'. Use 'null' for the global namespace. + + + Provided type '{0}' has 'IsGenericType' as true, but generic types are not supported. + + + Provided type '{0}' has 'IsArray' as true, but array types are not supported. + + + Invalid member '{0}' on provided type '{1}'. Provided type members must be public, and not be generic, virtual, or abstract. + + + Invalid member '{0}' on provided type '{1}'. Only properties, methods and constructors are allowed + + + Property '{0}' on provided type '{1}' has CanRead=true but there was no value from GetGetMethod() + + + Property '{0}' on provided type '{1}' has CanRead=false but GetGetMethod() returned a method + + + Property '{0}' on provided type '{1}' has CanWrite=true but there was no value from GetSetMethod() + + + Property '{0}' on provided type '{1}' has CanWrite=false but GetSetMethod() returned a method + + + One or more errors seen during provided type setup + + + Unexpected exception from provided type '{0}' member '{1}': {2} + + + Unsupported constant type '{0}'. Quotations provided by type providers can only contain simple constants. The implementation of the type provider may need to be adjusted by moving a value declared outside a provided quotation literal to be a 'let' binding inside the quotation literal. + + + Unsupported expression '{0}' from type provider. If you are the author of this type provider, consider adjusting it to provide a different provided expression. + + + Expected provided type named '{0}' but provided type has 'Name' with value '{1}' + + + Event '{0}' on provided type '{1}' has no value from GetAddMethod() + + + Event '{0}' on provided type '{1}' has no value from GetRemoveMethod() + + + Assembly attribute '{0}' refers to a designer assembly '{1}' which cannot be loaded or doesn't exist. {2} + + + The type provider does not have a valid constructor. A constructor taking either no arguments or one argument of type 'TypeProviderConfig' was expected. + + + The type provider '{0}' reported an error: {1} + + + The type provider '{0}' used an invalid parameter in the ParameterExpression: {1} + + + The type provider '{0}' provided a method with a name '{1}' and metadata token '{2}', which is not reported among its methods of its declaring type '{3}' + + + The type provider '{0}' provided a constructor which is not reported among the constructors of its declaring type '{1}' + + + A direct reference to the generated type '{0}' is not permitted. Instead, use a type definition, e.g. 'type TypeAlias = <path>'. This indicates that a type provider adds generated types to your assembly. + + + Expected provided type with path '{0}' but provided type has path '{1}' + + + Unexpected 'null' return value from provided type '{0}' member '{1}' + + + Unexpected exception from member '{0}' of provided type '{1}' member '{2}': {3} + + + Nested provided types do not take static arguments or generic parameters + + + Invalid static argument to provided type. Expected an argument of kind '{0}'. + + + An error occured applying the static arguments to a provided type + + + Unknown static argument kind '{0}' when resolving a reference to a provided type or method '{1}' + + + invalid namespace for provided type + + + invalid full name for provided type + + + The type provider returned 'null', which is not a valid return value from '{0}' + + + The type provider constructor has thrown an exception: {0} + + + Type provider '{0}' returned null from GetInvokerExpression. + + + The type provider '{0}' returned an invalid type from 'ApplyStaticArguments'. A type with name '{1}' was expected, but a type with name '{2}' was returned. + + + The type provider '{0}' returned an invalid method from 'ApplyStaticArgumentsForMethod'. A method with name '{1}' was expected, but a method with name '{2}' was returned. + + + This type test or downcast will erase the provided type '{0}' to the type '{1}' + + + This downcast will erase the provided type '{0}' to the type '{1}'. + + + This type test with a provided type '{0}' is not allowed because this provided type will be erased to '{1}' at runtime. + + + Cannot inherit from erased provided type + + + Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + + + Invalid member name. Members may not have name '.ctor' or '.cctor' + + + The function or member '{0}' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '{1}'. + + + The number of type arguments did not match: '{0}' given, '{1}' expected. This may be related to a previously reported error. + + + Cannot override inherited member '{0}' because it is sealed + + + The type provider '{0}' reported an error in the context of provided type '{1}', member '{2}'. The error: {3} + + + An exception occurred when accessing the '{0}' of a provided type: {1} + + + The '{0}' of a provided type was null or empty. + + + Character '{0}' is not allowed in provided type name '{1}' + + + In queries, '{0}' must use a simple pattern + + + A custom query operation for '{0}' is required but not specified + + + Named static arguments must come after all unnamed static arguments + + + The static parameter '{0}' of the provided type or method '{1}' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. '{2}<{3}=...>'. + + + No static parameter exists with name '{0}' + + + The static parameter '{0}' has already been given a value + + + Multiple static parameters exist with name '{0}' + + + A custom operation may not be used in conjunction with a non-value or recursive 'let' binding in another part of this computation expression + + + A custom operation may not be used in conjunction with 'use', 'try/with', 'try/finally', 'if/then/else' or 'match' operators within this computation expression + + + The custom operation '{0}' refers to a method which is overloaded. The implementations of custom operations may not be overloaded. + + + An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. + + + Invalid argument to 'methodhandleof' during codegen + + + A reference to a provided type was missing a value for the static parameter '{0}'. You may need to recompile one or more referenced assemblies. + + + A reference to a provided type had an invalid value '{0}' for a static parameter. You may need to recompile one or more referenced assemblies. + + + '{0}' is not used correctly. This is a custom operation in this query or computation expression. + + + '{0}' is not used correctly. Usage: {1}. This is a custom operation in this query or computation expression. + + + {0} var in collection {1} (outerKey = innerKey). Note that parentheses are required after '{2}' + + + {0} var in collection {1} (outerKey = innerKey) into group. Note that parentheses are required after '{2}' + + + {0} var in collection + + + '{0}' must be followed by a variable name. Usage: {1}. + + + Incorrect syntax for '{0}'. Usage: {1}. + + + '{0}' must come after a 'for' selection clause and be followed by the rest of the query. Syntax: ... {1} ... + + + '{0}' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected {1} argument(s), but given {2}. + + + Expected an expression after this point + + + Expected a type after this point + + + Unmatched '[<'. Expected closing '>]' + + + Unexpected end of input in 'match' expression. Expected 'match <expr> with | <pat> -> <expr> | <pat> -> <expr> ...'. + + + Unexpected end of input in 'try' expression. Expected 'try <expr> with <rules>' or 'try <expr> finally <expr>'. + + + Unexpected end of input in 'while' expression. Expected 'while <expr> do <expr>'. + + + Unexpected end of input in 'for' expression. Expected 'for <pat> in <expr> do <expr>'. + + + Unexpected end of input in 'match' or 'try' expression + + + Unexpected end of input in 'then' branch of conditional expression. Expected 'if <expr> then <expr>' or 'if <expr> then <expr> else <expr>'. + + + Unexpected end of input in 'else' branch of conditional expression. Expected 'if <expr> then <expr>' or 'if <expr> then <expr> else <expr>'. + + + Unexpected end of input in body of lambda expression. Expected 'fun <pat> ... <pat> -> <expr>'. + + + Unexpected end of input in type arguments + + + Unexpected end of input in type signature + + + Unexpected end of input in type definition + + + Unexpected end of input in object members + + + Unexpected end of input in value, function or member definition + + + Unexpected end of input in expression + + + Unexpected end of type. Expected a name after this point. + + + Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + + + Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let!' keyword. + + + Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use!' keyword. + + + Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use' keyword. + + + Missing 'do' in 'while' expression. Expected 'while <expr> do <expr>'. + + + Missing 'do' in 'for' expression. Expected 'for <pat> in <expr> do <expr>'. + + + Invalid join relation in '{0}'. Expected 'expr <op> expr', where <op> is =, =?, ?= or ?=?. + + + Calls + + + Invalid number of generic arguments to type '{0}' in provided type. Expected '{1}' arguments, given '{2}'. + + + Invalid value '{0}' for unit-of-measure parameter '{1}' + + + Invalid value unit-of-measure parameter '{0}' + + + Property '{0}' on provided type '{1}' is neither readable nor writable as it has CanRead=false and CanWrite=false + + + A use of 'into' must be followed by the remainder of the computation + + + The operator '{0}' does not accept the use of 'into' + + + The definition of the custom operator '{0}' does not use a valid combination of attribute flags + + + This type definition may not have the 'CLIMutable' attribute. Only record types may have this attribute. + + + 'member val' definitions are only permitted in types with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. + + + Property definitions may not be declared mutable. To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. + + + To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. + + + Type '{0}' is illegal because in byref<T>, T cannot contain byref types. + + + F# supports array ranks between 1 and 32. The value {0} is not allowed. + + + In queries, use the form 'for x in n .. m do ...' for ranging over integers + + + 'while' expressions may not be used in queries + + + 'try/finally' expressions may not be used in queries + + + 'use' expressions may not be used in queries + + + 'let!', 'use!' and 'do!' expressions may not be used in queries + + + 'return' and 'return!' may not be used in queries + + + This is not a known query operator. Query operators are identifiers such as 'select', 'where', 'sortBy', 'thenBy', 'groupBy', 'groupValBy', 'join', 'groupJoin', 'sumBy' and 'averageBy', defined using corresponding methods on the 'QueryBuilder' type. + + + 'try/with' expressions may not be used in queries + + + This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. + + + Too many static parameters. Expected at most {0} parameters, but got {1} unnamed and {2} named parameters. + + + Invalid provided literal value '{0}' + + + The 'anycpu32bitpreferred' platform can only be used with EXE targets. You must use 'anycpu' instead. + + + This member, function or value declaration may not be declared 'inline' + + + The provider '{0}' returned a non-generated type '{1}' in the context of a set of generated types. Consider adjusting the type provider to only return generated types. + + + Arguments to query operators may require parentheses, e.g. 'where (x > y)' or 'groupBy (x.Length / 10)' + + + A quotation may not involve an assignment to or taking the address of a captured local variable + + + + 1 overload + + + + {0} overloads + + + Erased to + + + Unexpected token '{0}' or incomplete expression + + + Cannot find code target for this attribute, possibly because the code after the attribute is incomplete. + + + Type name cannot be empty. + + + Problem reading assembly '{0}': {1} + + + Invalid provided field. Provided fields of erased provided types must be literals. + + + (loading description...) + + + (description unavailable...) + + + A type variable has been constrained by multiple different class types. A type variable may only have one class constraint. + + + 'match' expressions may not be used in queries + + + Infix operator member '{0}' has {1} initial argument(s). Expected a tuple of 3 arguments + + + The operator '{0}' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. + + + '{0}' must be followed by 'in'. Usage: {1}. + + + Neither 'member val' nor 'override val' definitions are permitted in object expressions. + + + Copy-and-update record expressions must include at least one field. + + + '_' cannot be used as field name + + + The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'. + + + A property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + + + Array method '{0}' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. + + + Union case/exception '{0}' does not have field named '{1}'. + + + Union case/exception field '{0}' cannot be used more than once. + + + Named field '{0}' is used more than once. + + + Named field '{0}' conflicts with autogenerated name for anonymous field. + + + This literal expression or attribute argument results in an arithmetic overflow. + + + This is not valid literal expression. The [<Literal>] attribute will be ignored. + + + System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes. + + + The mutable local '{0}' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed. + + + A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid + + + An error occured applying the static arguments to a provided method + + + Unexpected character '{0}' in preprocessor expression + + + Unexpected token '{0}' in preprocessor expression + + + Incomplete preprocessor expression + + + Missing token '{0}' in preprocessor expression + + + An error occurred while reading the F# metadata node at position {0} in table '{1}' of assembly '{2}'. The node had no matching declaration. Please report this warning. You may need to recompile the F# assembly you are using. + + + Type inference caused the type variable {0} to escape its scope. Consider adding an explicit type parameter declaration or adjusting your code to be less generic. + + + Type inference caused an inference type variable to escape its scope. Consider adding type annotations to make your code less generic. + + + Redundant arguments are being ignored in function '{0}'. Expected {1} but got {2} arguments. + + + Lowercase literal '{0}' is being shadowed by a new pattern with the same name. Only uppercase and module-prefixed literals can be used as named patterns. + + + This literal pattern does not take arguments + + + Constructors are not permitted as extension members - they must be defined as part of the original definition of the type + + + Invalid response file '{0}' ( '{1}' ) + + + Response file '{0}' not found in '{1}' + + + Response file name '{0}' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long + + + Cannot find FSharp.Core.dll in compiler's directory + + + One tuple type is a struct tuple, the other is a reference tuple + + + This provided method requires static parameters + + + The conversion from {0} to {1} is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'. + + + The conversion from {0} to {1} is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator. + + + The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored + + + In a recursive declaration group, 'open' declarations must come first in each module + + + In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations + + + This declaration is not supported in recursive declaration groups + + + Invalid use of 'rec' keyword + + + If a union type has more than one case and is a struct, then all fields within the union type must be given unique names. + + + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. + + + Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' + + + Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression. + + + The address of the variable '{0}' cannot be used at this point. A method or function may not return the address of this local value. + + + {0} is an active pattern and cannot be treated as a discriminated union case with named fields. + + + The default value does not have the same type as the argument. The DefaultParameterValue attribute and any Optional attribute will be ignored. Note: 'null' needs to be annotated with the correct type, e.g. 'DefaultParameterValue(null:obj)'. + + + The system type '{0}' was required but no referenced system DLL contained this type + + + The member '{0}' matches multiple overloads of the same method.\nPlease restrict it to one of the following:{1}. + + + Method or object constructor '{0}' is not static + + + Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? + + + Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. + + + Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. + + + Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. + + + Used to verify code during debugging. + + + Used as the name of the base class object. + + + In verbose syntax, indicates the start of a code block. + + + In verbose syntax, indicates the start of a class definition. + + + Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. + + + Used to declare a delegate. + + + Used in looping constructs or to execute imperative code. + + + In verbose syntax, indicates the end of a block of code in a looping expression. + + + Used to convert to a type that is lower in the inheritance chain. + + + In a for expression, used when counting in reverse. + + + Used in conditional branching. A short form of else if. + + + Used in conditional branching. + + + In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. + + + Used to declare an exception type. + + + Indicates that a declared program element is defined in another binary or assembly. + + + Used as a Boolean literal. + + + Used together with try to introduce a block of code that executes regardless of whether an exception occurs. + + + Used in looping constructs. + + + Used in lambda expressions, also known as anonymous functions. + + + Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. + + + Used to reference the top-level .NET namespace. + + + Used in conditional branching constructs. + + + Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. + + + Used to specify a base class or base interface. + + + Used to indicate a function that should be integrated directly into the caller's code. + + + Used to declare and implement interfaces. + + + Used to specify that a member is visible inside an assembly but not outside it. + + + Used to specify a computation that is to be performed only when a result is needed. + + + Used to associate, or bind, a name to a value or function. + + + Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type. + + + Used to branch by comparing a value to a pattern. + + + Used to declare a property or method in an object type. + + + Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. + + + Used to declare a variable, that is, a value that can be changed. + + + Used to associate a name with a group of related types and modules, to logically separate it from other code. + + + Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. + + + Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. + + + Indicates the absence of an object. Also used in generic parameter constraints. + + + Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. + + + Used to make the contents of a namespace or module available without qualification. + + + Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. + + + Used to implement a version of an abstract or virtual method that differs from the base version. + + + Restricts access to a member to code in the same type or module. + + + Allows access to a member from outside the type. + + + Used to indicate that a function is recursive. + + + Used to indicate a value to provide as the result of a computation expression. + + + Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression. + + + Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. + + + Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. + + + Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. + + + Used in conditional expressions. Also used to perform side effects after object construction. + + + Used in for loops to indicate a range. + + + Used to introduce a block of code that might generate an exception. Used together with with or finally. + + + Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. + + + Used to convert to a type that is higher in the inheritance chain. + + + Used instead of let for values that require Dispose to be called to free resources. + + + Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources. + + + Used in a signature to indicate a value, or in a type to declare a member, in limited situations. + + + Indicates the .NET void type. Used when interoperating with other .NET languages. + + + Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. + + + Introduces a looping construct. + + + Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. + + + Used in a sequence expression to produce a value for a sequence. + + + Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. + + + In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions + + + Assigns a value to a variable. + + + Converts a type to type that is higher in the hierarchy. + + + Converts a type to a type that is lower in the hierarchy. + + + Delimits a typed code quotation. + + + Delimits a untyped code quotation. + + + {0} '{1}' not found in assembly '{2}'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. + + + {0} '{1}' not found in type '{2}' from assembly '{3}'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. + + + is + + + This value is not a function and cannot be applied. + + + This value is not a function and cannot be applied. Did you intend to access the indexer via {0}.[index] instead? + + + This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? + + + + + + + This value is not a function and cannot be applied. Did you forget to terminate a declaration? + + + The argument names in the signature '{0}' and implementation '{1}' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. + + + An error occurred while reading the F# metadata of assembly '{0}'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. + + \ No newline at end of file diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.fs b/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.fs new file mode 100644 index 00000000000..94cd9e3b429 --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.fs @@ -0,0 +1,333 @@ +// This is a generated file; the original input is '..\fsi\FSIstrings.txt' +namespace FSIstrings + +open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators +open Microsoft.FSharp.Reflection +open System.Reflection +// (namespaces below for specific case of using the tool to compile FSharp.Core itself) +open Microsoft.FSharp.Core +open Microsoft.FSharp.Core.Operators +open Microsoft.FSharp.Text +open Microsoft.FSharp.Collections +open Printf + +type internal SR private() = + + // BEGIN BOILERPLATE + + static let getCurrentAssembly () = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + typeof.GetTypeInfo().Assembly + #else + System.Reflection.Assembly.GetExecutingAssembly() + #endif + + static let getTypeInfo (t: System.Type) = + #if DNXCORE50 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 + t.GetTypeInfo() + #else + t + #endif + + static let resources = lazy (new System.Resources.ResourceManager("FSIstrings", getCurrentAssembly())) + + static let GetString(name:string) = + let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) + #if DEBUG + if null = s then + System.Diagnostics.Debug.Assert(false, sprintf "**RESOURCE ERROR**: Resource token %s does not exist!" name) + #endif + s + + static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = + FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) + + static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() + + static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) + static let isFunctionType (ty1:System.Type) = + isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) + + static let rec destFunTy (ty:System.Type) = + if isFunctionType ty then + ty, ty.GetGenericArguments() + else + match getTypeInfo(ty).BaseType with + | null -> failwith "destFunTy: not a function type" + | b -> destFunTy b + + static let buildFunctionForOneArgPat (ty: System.Type) impl = + let _,tys = destFunTy ty + let rty = tys.[1] + // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf "%x"') + mkFunctionValue tys (fun inp -> impl rty inp) + + static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = + match fmt.[i] with + | '%' -> go args ty (i+1) + | 'd' + | 'f' + | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) + | _ -> failwith "bad format specifier" + + // newlines and tabs get converted to strings when read from a resource file + // this will preserve their original intention + static let postProcessString (s : string) = + s.Replace("\\n","\n").Replace("\\t","\t").Replace("\\r","\r").Replace("\\\"", "\"") + + static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = + let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt + let len = fmt.Length + + /// Function to capture the arguments and then run. + let rec capture args ty i = + if i >= len || (fmt.[i] = '%' && i+1 >= len) then + let b = new System.Text.StringBuilder() + b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore + box(b.ToString()) + // REVIEW: For these purposes, this should be a nop, but I'm leaving it + // in incase we ever decide to support labels for the error format string + // E.g., "%s%d" + elif System.Char.IsSurrogatePair(fmt,i) then + capture args ty (i+2) + else + match fmt.[i] with + | '%' -> + let i = i+1 + capture1 fmt i args ty capture + | _ -> + capture args ty (i+1) + + (unbox (capture [] (typeof<'T>) 0) : 'T) + + static let mutable swallowResourceText = false + + static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = + if swallowResourceText then + sprintf fmt + else + let mutable messageString = GetString(messageID) + messageString <- postProcessString messageString + createMessageString messageString fmt + + /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). + static member SwallowResourceText with get () = swallowResourceText + and set (b) = swallowResourceText <- b + // END BOILERPLATE + + /// Stopped due to error\n + /// (Originally from ..\fsi\FSIstrings.txt:2) + static member stoppedDueToError() = (GetStringFunc("stoppedDueToError",",,,") ) + /// Usage: %s [script.fsx []] + /// (Originally from ..\fsi\FSIstrings.txt:3) + static member fsiUsage(a0 : System.String) = (GetStringFunc("fsiUsage",",,,%s,,,") a0) + /// - INPUT FILES - + /// (Originally from ..\fsi\FSIstrings.txt:4) + static member fsiInputFiles() = (GetStringFunc("fsiInputFiles",",,,") ) + /// - CODE GENERATION - + /// (Originally from ..\fsi\FSIstrings.txt:5) + static member fsiCodeGeneration() = (GetStringFunc("fsiCodeGeneration",",,,") ) + /// - ERRORS AND WARNINGS - + /// (Originally from ..\fsi\FSIstrings.txt:6) + static member fsiErrorsAndWarnings() = (GetStringFunc("fsiErrorsAndWarnings",",,,") ) + /// - LANGUAGE - + /// (Originally from ..\fsi\FSIstrings.txt:7) + static member fsiLanguage() = (GetStringFunc("fsiLanguage",",,,") ) + /// - MISCELLANEOUS - + /// (Originally from ..\fsi\FSIstrings.txt:8) + static member fsiMiscellaneous() = (GetStringFunc("fsiMiscellaneous",",,,") ) + /// - ADVANCED - + /// (Originally from ..\fsi\FSIstrings.txt:9) + static member fsiAdvanced() = (GetStringFunc("fsiAdvanced",",,,") ) + /// Exception raised when starting remoting server.\n%s + /// (Originally from ..\fsi\FSIstrings.txt:10) + static member fsiExceptionRaisedStartingServer(a0 : System.String) = (GetStringFunc("fsiExceptionRaisedStartingServer",",,,%s,,,") a0) + /// Use the given file on startup as initial input + /// (Originally from ..\fsi\FSIstrings.txt:11) + static member fsiUse() = (GetStringFunc("fsiUse",",,,") ) + /// #load the given file on startup + /// (Originally from ..\fsi\FSIstrings.txt:12) + static member fsiLoad() = (GetStringFunc("fsiLoad",",,,") ) + /// Treat remaining arguments as command line arguments, accessed using fsi.CommandLineArgs + /// (Originally from ..\fsi\FSIstrings.txt:13) + static member fsiRemaining() = (GetStringFunc("fsiRemaining",",,,") ) + /// Display this usage message (Short form: -?) + /// (Originally from ..\fsi\FSIstrings.txt:14) + static member fsiHelp() = (GetStringFunc("fsiHelp",",,,") ) + /// Exit fsi after loading the files or running the .fsx script given on the command line + /// (Originally from ..\fsi\FSIstrings.txt:15) + static member fsiExec() = (GetStringFunc("fsiExec",",,,") ) + /// Execute interactions on a Windows Forms event loop (on by default) + /// (Originally from ..\fsi\FSIstrings.txt:16) + static member fsiGui() = (GetStringFunc("fsiGui",",,,") ) + /// Suppress fsi writing to stdout + /// (Originally from ..\fsi\FSIstrings.txt:17) + static member fsiQuiet() = (GetStringFunc("fsiQuiet",",,,") ) + /// Support TAB completion in console (on by default) + /// (Originally from ..\fsi\FSIstrings.txt:18) + static member fsiReadline() = (GetStringFunc("fsiReadline",",,,") ) + /// Emit debug information in quotations + /// (Originally from ..\fsi\FSIstrings.txt:19) + static member fsiEmitDebugInfoInQuotations() = (GetStringFunc("fsiEmitDebugInfoInQuotations",",,,") ) + /// For help type #help;; + /// (Originally from ..\fsi\FSIstrings.txt:20) + static member fsiBanner3() = (GetStringFunc("fsiBanner3",",,,") ) + /// A problem occurred starting the F# Interactive process. This may be due to a known problem with background process console support for Unicode-enabled applications on some Windows systems. Try selecting Tools->Options->F# Interactive for Visual Studio and enter '--fsi-server-no-unicode'. + /// (Originally from ..\fsi\FSIstrings.txt:21) + static member fsiConsoleProblem() = (GetStringFunc("fsiConsoleProblem",",,,") ) + /// '%s' is not a valid assembly name + /// (Originally from ..\fsi\FSIstrings.txt:22) + static member fsiInvalidAssembly(a0 : System.String) = (2301, GetStringFunc("fsiInvalidAssembly",",,,%s,,,") a0) + /// Directory '%s' doesn't exist + /// (Originally from ..\fsi\FSIstrings.txt:23) + static member fsiDirectoryDoesNotExist(a0 : System.String) = (2302, GetStringFunc("fsiDirectoryDoesNotExist",",,,%s,,,") a0) + /// Invalid directive '#%s %s' + /// (Originally from ..\fsi\FSIstrings.txt:24) + static member fsiInvalidDirective(a0 : System.String, a1 : System.String) = (GetStringFunc("fsiInvalidDirective",",,,%s,,,%s,,,") a0 a1) + /// Warning: line too long, ignoring some characters\n + /// (Originally from ..\fsi\FSIstrings.txt:25) + static member fsiLineTooLong() = (GetStringFunc("fsiLineTooLong",",,,") ) + /// Real: %s, CPU: %s, GC %s + /// (Originally from ..\fsi\FSIstrings.txt:26) + static member fsiTimeInfoMainString(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("fsiTimeInfoMainString",",,,%s,,,%s,,,%s,,,") a0 a1 a2) + /// gen + /// (Originally from ..\fsi\FSIstrings.txt:27) + static member fsiTimeInfoGCGenerationLabelSomeShorthandForTheWordGeneration() = (GetStringFunc("fsiTimeInfoGCGenerationLabelSomeShorthandForTheWordGeneration",",,,") ) + /// \n\nException raised during pretty printing.\nPlease report this so it can be fixed.\nTrace: %s\n + /// (Originally from ..\fsi\FSIstrings.txt:28) + static member fsiExceptionDuringPrettyPrinting(a0 : System.String) = (GetStringFunc("fsiExceptionDuringPrettyPrinting",",,,%s,,,") a0) + /// F# Interactive directives: + /// (Originally from ..\fsi\FSIstrings.txt:29) + static member fsiIntroTextHeader1directives() = (GetStringFunc("fsiIntroTextHeader1directives",",,,") ) + /// Reference (dynamically load) the given DLL + /// (Originally from ..\fsi\FSIstrings.txt:30) + static member fsiIntroTextHashrInfo() = (GetStringFunc("fsiIntroTextHashrInfo",",,,") ) + /// Add the given search path for referenced DLLs + /// (Originally from ..\fsi\FSIstrings.txt:31) + static member fsiIntroTextHashIInfo() = (GetStringFunc("fsiIntroTextHashIInfo",",,,") ) + /// Load the given file(s) as if compiled and referenced + /// (Originally from ..\fsi\FSIstrings.txt:32) + static member fsiIntroTextHashloadInfo() = (GetStringFunc("fsiIntroTextHashloadInfo",",,,") ) + /// Toggle timing on/off + /// (Originally from ..\fsi\FSIstrings.txt:33) + static member fsiIntroTextHashtimeInfo() = (GetStringFunc("fsiIntroTextHashtimeInfo",",,,") ) + /// Display help + /// (Originally from ..\fsi\FSIstrings.txt:34) + static member fsiIntroTextHashhelpInfo() = (GetStringFunc("fsiIntroTextHashhelpInfo",",,,") ) + /// Exit + /// (Originally from ..\fsi\FSIstrings.txt:35) + static member fsiIntroTextHashquitInfo() = (GetStringFunc("fsiIntroTextHashquitInfo",",,,") ) + /// F# Interactive command line options: + /// (Originally from ..\fsi\FSIstrings.txt:36) + static member fsiIntroTextHeader2commandLine() = (GetStringFunc("fsiIntroTextHeader2commandLine",",,,") ) + /// See '%s' for options + /// (Originally from ..\fsi\FSIstrings.txt:37) + static member fsiIntroTextHeader3(a0 : System.String) = (GetStringFunc("fsiIntroTextHeader3",",,,%s,,,") a0) + /// Loading + /// (Originally from ..\fsi\FSIstrings.txt:38) + static member fsiLoadingFilesPrefixText() = (GetStringFunc("fsiLoadingFilesPrefixText",",,,") ) + /// \n- Interrupt\n + /// (Originally from ..\fsi\FSIstrings.txt:39) + static member fsiInterrupt() = (GetStringFunc("fsiInterrupt",",,,") ) + /// \n- Exit...\n + /// (Originally from ..\fsi\FSIstrings.txt:40) + static member fsiExit() = (GetStringFunc("fsiExit",",,,") ) + /// - Aborting main thread... + /// (Originally from ..\fsi\FSIstrings.txt:41) + static member fsiAbortingMainThread() = (GetStringFunc("fsiAbortingMainThread",",,,") ) + /// Failed to install ctrl-c handler - Ctrl-C handling will not be available. Error was:\n\t%s + /// (Originally from ..\fsi\FSIstrings.txt:42) + static member fsiCouldNotInstallCtrlCHandler(a0 : System.String) = (GetStringFunc("fsiCouldNotInstallCtrlCHandler",",,,%s,,,") a0) + /// --> Referenced '%s' + /// (Originally from ..\fsi\FSIstrings.txt:43) + static member fsiDidAHashr(a0 : System.String) = (GetStringFunc("fsiDidAHashr",",,,%s,,,") a0) + /// --> Referenced '%s' (file may be locked by F# Interactive process) + /// (Originally from ..\fsi\FSIstrings.txt:44) + static member fsiDidAHashrWithLockWarning(a0 : System.String) = (GetStringFunc("fsiDidAHashrWithLockWarning",",,,%s,,,") a0) + /// --> Referenced '%s' (an assembly with a different timestamp has already been referenced from this location, reset fsi to load the updated assembly) + /// (Originally from ..\fsi\FSIstrings.txt:45) + static member fsiDidAHashrWithStaleWarning(a0 : System.String) = (GetStringFunc("fsiDidAHashrWithStaleWarning",",,,%s,,,") a0) + /// --> Added '%s' to library include path + /// (Originally from ..\fsi\FSIstrings.txt:46) + static member fsiDidAHashI(a0 : System.String) = (GetStringFunc("fsiDidAHashI",",,,%s,,,") a0) + /// --> Timing now on + /// (Originally from ..\fsi\FSIstrings.txt:47) + static member fsiTurnedTimingOn() = (GetStringFunc("fsiTurnedTimingOn",",,,") ) + /// --> Timing now off + /// (Originally from ..\fsi\FSIstrings.txt:48) + static member fsiTurnedTimingOff() = (GetStringFunc("fsiTurnedTimingOff",",,,") ) + /// - Unexpected ThreadAbortException (Ctrl-C) during event handling: Trying to restart... + /// (Originally from ..\fsi\FSIstrings.txt:49) + static member fsiUnexpectedThreadAbortException() = (GetStringFunc("fsiUnexpectedThreadAbortException",",,,") ) + /// Failed to resolve assembly '%s' + /// (Originally from ..\fsi\FSIstrings.txt:50) + static member fsiFailedToResolveAssembly(a0 : System.String) = (GetStringFunc("fsiFailedToResolveAssembly",",,,%s,,,") a0) + /// Binding session to '%s'... + /// (Originally from ..\fsi\FSIstrings.txt:51) + static member fsiBindingSessionTo(a0 : System.String) = (GetStringFunc("fsiBindingSessionTo",",,,%s,,,") a0) + /// Microsoft (R) F# Interactive version %s + /// (Originally from ..\fsi\FSIstrings.txt:52) + static member fsiProductName(a0 : System.String) = (GetStringFunc("fsiProductName",",,,%s,,,") a0) + /// F# Interactive for F# %s + /// (Originally from ..\fsi\FSIstrings.txt:53) + static member fsiProductNameCommunity(a0 : System.String) = (GetStringFunc("fsiProductNameCommunity",",,,%s,,,") a0) + /// Prevents references from being locked by the F# Interactive process + /// (Originally from ..\fsi\FSIstrings.txt:54) + static member shadowCopyReferences() = (GetStringFunc("shadowCopyReferences",",,,") ) + + /// Call this method once to validate that all known resources are valid; throws if not + static member RunStartupValidation() = + ignore(GetString("stoppedDueToError")) + ignore(GetString("fsiUsage")) + ignore(GetString("fsiInputFiles")) + ignore(GetString("fsiCodeGeneration")) + ignore(GetString("fsiErrorsAndWarnings")) + ignore(GetString("fsiLanguage")) + ignore(GetString("fsiMiscellaneous")) + ignore(GetString("fsiAdvanced")) + ignore(GetString("fsiExceptionRaisedStartingServer")) + ignore(GetString("fsiUse")) + ignore(GetString("fsiLoad")) + ignore(GetString("fsiRemaining")) + ignore(GetString("fsiHelp")) + ignore(GetString("fsiExec")) + ignore(GetString("fsiGui")) + ignore(GetString("fsiQuiet")) + ignore(GetString("fsiReadline")) + ignore(GetString("fsiEmitDebugInfoInQuotations")) + ignore(GetString("fsiBanner3")) + ignore(GetString("fsiConsoleProblem")) + ignore(GetString("fsiInvalidAssembly")) + ignore(GetString("fsiDirectoryDoesNotExist")) + ignore(GetString("fsiInvalidDirective")) + ignore(GetString("fsiLineTooLong")) + ignore(GetString("fsiTimeInfoMainString")) + ignore(GetString("fsiTimeInfoGCGenerationLabelSomeShorthandForTheWordGeneration")) + ignore(GetString("fsiExceptionDuringPrettyPrinting")) + ignore(GetString("fsiIntroTextHeader1directives")) + ignore(GetString("fsiIntroTextHashrInfo")) + ignore(GetString("fsiIntroTextHashIInfo")) + ignore(GetString("fsiIntroTextHashloadInfo")) + ignore(GetString("fsiIntroTextHashtimeInfo")) + ignore(GetString("fsiIntroTextHashhelpInfo")) + ignore(GetString("fsiIntroTextHashquitInfo")) + ignore(GetString("fsiIntroTextHeader2commandLine")) + ignore(GetString("fsiIntroTextHeader3")) + ignore(GetString("fsiLoadingFilesPrefixText")) + ignore(GetString("fsiInterrupt")) + ignore(GetString("fsiExit")) + ignore(GetString("fsiAbortingMainThread")) + ignore(GetString("fsiCouldNotInstallCtrlCHandler")) + ignore(GetString("fsiDidAHashr")) + ignore(GetString("fsiDidAHashrWithLockWarning")) + ignore(GetString("fsiDidAHashrWithStaleWarning")) + ignore(GetString("fsiDidAHashI")) + ignore(GetString("fsiTurnedTimingOn")) + ignore(GetString("fsiTurnedTimingOff")) + ignore(GetString("fsiUnexpectedThreadAbortException")) + ignore(GetString("fsiFailedToResolveAssembly")) + ignore(GetString("fsiBindingSessionTo")) + ignore(GetString("fsiProductName")) + ignore(GetString("fsiProductNameCommunity")) + ignore(GetString("shadowCopyReferences")) + () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.resx b/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.resx new file mode 100644 index 00000000000..38a86b6e259 --- /dev/null +++ b/src/buildfromsource/FSharp.Compiler.Private/FSIstrings.resx @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Stopped due to error\n + + + Usage: {0} <options> [script.fsx [<arguments>]] + + + - INPUT FILES - + + + - CODE GENERATION - + + + - ERRORS AND WARNINGS - + + + - LANGUAGE - + + + - MISCELLANEOUS - + + + - ADVANCED - + + + Exception raised when starting remoting server.\n{0} + + + Use the given file on startup as initial input + + + #load the given file on startup + + + Treat remaining arguments as command line arguments, accessed using fsi.CommandLineArgs + + + Display this usage message (Short form: -?) + + + Exit fsi after loading the files or running the .fsx script given on the command line + + + Execute interactions on a Windows Forms event loop (on by default) + + + Suppress fsi writing to stdout + + + Support TAB completion in console (on by default) + + + Emit debug information in quotations + + + For help type #help;; + + + A problem occurred starting the F# Interactive process. This may be due to a known problem with background process console support for Unicode-enabled applications on some Windows systems. Try selecting Tools->Options->F# Interactive for Visual Studio and enter '--fsi-server-no-unicode'. + + + '{0}' is not a valid assembly name + + + Directory '{0}' doesn't exist + + + Invalid directive '#{0} {1}' + + + Warning: line too long, ignoring some characters\n + + + Real: {0}, CPU: {1}, GC {2} + + + gen + + + \n\nException raised during pretty printing.\nPlease report this so it can be fixed.\nTrace: {0}\n + + + F# Interactive directives: + + + Reference (dynamically load) the given DLL + + + Add the given search path for referenced DLLs + + + Load the given file(s) as if compiled and referenced + + + Toggle timing on/off + + + Display help + + + Exit + + + F# Interactive command line options: + + + See '{0}' for options + + + Loading + + + \n- Interrupt\n + + + \n- Exit...\n + + + - Aborting main thread... + + + Failed to install ctrl-c handler - Ctrl-C handling will not be available. Error was:\n\t{0} + + + --> Referenced '{0}' + + + --> Referenced '{0}' (file may be locked by F# Interactive process) + + + --> Referenced '{0}' (an assembly with a different timestamp has already been referenced from this location, reset fsi to load the updated assembly) + + + --> Added '{0}' to library include path + + + --> Timing now on + + + --> Timing now off + + + - Unexpected ThreadAbortException (Ctrl-C) during event handling: Trying to restart... + + + Failed to resolve assembly '{0}' + + + Binding session to '{0}'... + + + Microsoft (R) F# Interactive version {0} + + + F# Interactive for F# {0} + + + Prevents references from being locked by the F# Interactive process + + \ No newline at end of file diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 6dee1958bf0..bc676dbbef6 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -24,12 +24,14 @@ assemblyinfo.FSharp.Compiler.Private.dll.fs - - FSComp.txt - + + FSComp.resx + FSStrings.resx + + Reflection\reshapedreflection.fs @@ -604,9 +606,9 @@ - - FSIstrings.txt - + + FSIstrings.resx + InteractiveSession\fsi.fsi diff --git a/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj b/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj index 70d5835c025..3737779f560 100644 --- a/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj +++ b/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj @@ -14,12 +14,12 @@ - $([System.DateTime]::Now.ToString(`yyMMdd`)) + $([System.DateTime]::Now.ToString(`yyMMdd`)) https://github.com/Microsoft/visualfsharp/blob/master/License.txt https://github.com/Microsoft/visualfsharp Microsoft and F# Software Foundation Visual F# Compiler FSharp functional programming - -$(BuildRevision.Trim())-0 + -rc-$(BuildRevision.Trim())-0 4.2.0$(PreReleaseSuffix) -prop "licenseUrl=$(PackageLicenceUrl)" -prop "version=$(PackageVersion)" -prop "authors=$(PackageAuthors)" -prop "projectUrl=$(PackageProjectUrl)" -prop "tags=$(PackageTags)" diff --git a/src/buildfromsource/NuGet.config b/src/buildfromsource/NuGet.config new file mode 100644 index 00000000000..6fd4b1873bb --- /dev/null +++ b/src/buildfromsource/NuGet.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/buildfromsource/buildtools/fslex/fslex.fsproj b/src/buildfromsource/buildtools/fslex/fslex.fsproj new file mode 100644 index 00000000000..c110c53d3d6 --- /dev/null +++ b/src/buildfromsource/buildtools/fslex/fslex.fsproj @@ -0,0 +1,14 @@ + + + + netcoreapp2.0 + INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) + true + + + + + + + + diff --git a/src/buildfromsource/buildtools/fsyacc/fsyacc.fsproj b/src/buildfromsource/buildtools/fsyacc/fsyacc.fsproj new file mode 100644 index 00000000000..701126cb37e --- /dev/null +++ b/src/buildfromsource/buildtools/fsyacc/fsyacc.fsproj @@ -0,0 +1,14 @@ + + + + netcoreapp2.0 + INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) + true + + + + + + + + From cea9284349e6ecc803cc39b67096b83010f0416d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 8 Nov 2017 14:29:53 +0000 Subject: [PATCH 108/150] Use NO_EXTENSIONTYPING for better compiler debugging in normal case (#3912) * Use NO_EXTENSIONTYPING for better compiler debugging in normal case * Update Fsc.fsproj --- .../FSharp.Compiler.Service.Tests.fsproj | 1 - ...FSharp.Compiler.Service.netstandard.fsproj | 1 + .../FSharp.Compiler.Service.fsproj | 1 - fcs/samples/FscExe/FscExe.fsproj | 1 - src/absil/il.fsi | 2 +- ...Sharp.Compiler.Interactive.Settings.fsproj | 1 - .../FSharp.Compiler.Private.fsproj | 2 +- src/buildfromsource/Fsc/Fsc.fsproj | 2 +- src/buildfromsource/Fsi/Fsi.fsproj | 2 +- src/fsharp/AccessibilityLogic.fs | 8 +- src/fsharp/AttributeChecking.fs | 34 ++-- src/fsharp/CompileOps.fs | 56 +++--- src/fsharp/CompileOps.fsi | 16 +- src/fsharp/CompileOptions.fs | 2 +- src/fsharp/ConstraintSolver.fs | 4 +- src/fsharp/ExtensionTyping.fs | 2 +- src/fsharp/ExtensionTyping.fsi | 2 +- .../FSharp.Build.UnitTests.fsproj | 2 +- ...Sharp.Compiler.Interactive.Settings.fsproj | 1 - .../FSharp.Compiler.Private.fsproj | 1 - .../FSharp.Compiler.Unittests.fsproj | 3 - .../FSharp.Core.Unittests.fsproj | 2 +- src/fsharp/Fsc-proto/Fsc-proto.fsproj | 1 + src/fsharp/Fsc/Fsc.fsproj | 1 - src/fsharp/IlxGen.fs | 4 +- src/fsharp/InfoReader.fs | 10 +- src/fsharp/MethodCalls.fs | 10 +- src/fsharp/MethodOverrides.fs | 4 +- src/fsharp/NameResolution.fs | 26 +-- src/fsharp/NicePrint.fs | 10 +- src/fsharp/PostInferenceChecks.fs | 2 +- src/fsharp/QuotationTranslator.fs | 8 +- src/fsharp/SignatureConformance.fs | 6 +- src/fsharp/TastOps.fs | 38 ++-- src/fsharp/TastOps.fsi | 6 +- src/fsharp/TastPickle.fs | 4 +- src/fsharp/TypeChecker.fs | 22 +-- src/fsharp/fsc.fs | 10 +- src/fsharp/fsi/Fsi.fsproj | 1 - src/fsharp/fsi/fsi.fs | 4 +- src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj | 1 - src/fsharp/import.fs | 10 +- src/fsharp/import.fsi | 6 +- src/fsharp/infos.fs | 168 +++++++++--------- src/fsharp/symbols/SymbolHelpers.fs | 28 +-- src/fsharp/symbols/SymbolHelpers.fsi | 2 +- src/fsharp/symbols/SymbolPatterns.fs | 6 +- src/fsharp/symbols/SymbolPatterns.fsi | 4 +- src/fsharp/symbols/Symbols.fs | 18 +- src/fsharp/symbols/Symbols.fsi | 8 +- src/fsharp/tainted.fs | 2 +- src/fsharp/tainted.fsi | 2 +- src/fsharp/tast.fs | 42 ++--- src/fsharp/vs/IncrementalBuild.fs | 4 +- src/fsharp/vs/IncrementalBuild.fsi | 2 +- src/fsharp/vs/ServiceAssemblyContent.fs | 4 +- src/fsharp/vs/ServiceDeclarationLists.fs | 10 +- src/fsharp/vs/service.fs | 4 +- tests/service/Common.fs | 2 +- tests/service/ExprTests.fs | 2 +- tests/service/ProjectAnalysisTests.fs | 12 +- .../unittests/VisualFSharp.Unittests.fsproj | 1 - 62 files changed, 320 insertions(+), 331 deletions(-) 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 d53494b86f2..8686318fe23 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -17,7 +17,6 @@ LIBRARY 58;75 v4.6 - EXTENSIONTYPING;$(DefineConstants) false ..\..\$(Configuration)\fcs\net45\ true diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index b756152b993..dd1add15a55 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -13,6 +13,7 @@ $(DefineConstants);COMPILER_SERVICE $(DefineConstants);COMPILER_SERVICE_ASSUMES_FSHARP_CORE_4_4_0_0 $(DefineConstants);EXTENSIBLE_DUMPER + $(DefineConstants);NO_EXTENSIONTYPING $(DefineConstants);FSHARP_CORE_4_5 $(DefineConstants);FX_PORTABLE_OR_NETSTANDARD $(DefineConstants);FX_ATLEAST_PORTABLE diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index a955e015b80..b1cebac3a08 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -24,7 +24,6 @@ v4.5 - $(DefineConstants);EXTENSIONTYPING $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT $(DefineConstants);COMPILER diff --git a/fcs/samples/FscExe/FscExe.fsproj b/fcs/samples/FscExe/FscExe.fsproj index e0ef6ebd4da..946034ec67c 100644 --- a/fcs/samples/FscExe/FscExe.fsproj +++ b/fcs/samples/FscExe/FscExe.fsproj @@ -15,7 +15,6 @@ $(NoWarn);62;44 FscExe FscExe - EXTENSIONTYPING;$(DefineConstants) COMPILER;$(DefineConstants) FX_RESIDENT_COMPILER;$(DefineConstants) true diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 8b4743bb72b..a4621052292 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -287,7 +287,7 @@ type ILTypeRef = member QualifiedName: string -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member QualifiedNameWithNoShortPrimaryAssembly: string #endif diff --git a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj index a8c1de7f177..e8a37a4ac28 100644 --- a/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj @@ -9,7 +9,6 @@ $(NoWarn);45;55;62;75;1182;1204 true true - EXTENSIONTYPING;$(DefineConstants) $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index bc676dbbef6..a35c9a3bdf4 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -8,7 +8,7 @@ FSharp.Compiler.Private $(NoWarn);45;55;62;75;1204 true - $(DefineConstants);EXTENSIONTYPING;COMPILER + $(DefineConstants);COMPILER $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 diff --git a/src/buildfromsource/Fsc/Fsc.fsproj b/src/buildfromsource/Fsc/Fsc.fsproj index c40121222e6..572a8c8efaf 100644 --- a/src/buildfromsource/Fsc/Fsc.fsproj +++ b/src/buildfromsource/Fsc/Fsc.fsproj @@ -9,7 +9,7 @@ fsc $(NoWarn);45;55;62;75;1204 true - $(DefineConstants);EXTENSIONTYPING;COMPILER + $(DefineConstants);COMPILER $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 diff --git a/src/buildfromsource/Fsi/Fsi.fsproj b/src/buildfromsource/Fsi/Fsi.fsproj index d06056fe096..9ecd22b7265 100644 --- a/src/buildfromsource/Fsi/Fsi.fsproj +++ b/src/buildfromsource/Fsi/Fsi.fsproj @@ -9,7 +9,7 @@ fsi $(NoWarn);45;55;62;75;1204 true - $(DefineConstants);BUILD_FROM_SOURCE;COMPILER;EXTENSIONTYPING + $(DefineConstants);BUILD_FROM_SOURCE;COMPILER $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 diff --git a/src/fsharp/AccessibilityLogic.fs b/src/fsharp/AccessibilityLogic.fs index 6c4362d9a4f..c69d00cd0a0 100644 --- a/src/fsharp/AccessibilityLogic.fs +++ b/src/fsharp/AccessibilityLogic.fs @@ -14,7 +14,7 @@ open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -228,7 +228,7 @@ let ComputeILAccess isPublic isFamily isFamilyOrAssembly isFamilyAndAssembly = let IsILFieldInfoAccessible g amap m ad x = match x with | ILFieldInfo (tinfo,fd) -> IsILTypeAndMemberAccessible g amap m ad ad tinfo fd.Access -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField (amap, tpfi, m) as pfi -> let access = tpfi.PUntaint((fun fi -> ComputeILAccess fi.IsPublic fi.IsFamily fi.IsFamilyOrAssembly fi.IsFamilyAndAssembly), m) IsProvidedMemberAccessible amap m ad pfi.EnclosingType access @@ -314,7 +314,7 @@ let IsTypeAndMethInfoAccessible amap m adTyp ad = function | ILMeth (g,x,_) -> IsILMethInfoAccessible g amap m adTyp ad x | FSMeth (_,_,vref,_) -> IsValAccessible ad vref | DefaultStructCtor(g,typ) -> IsTypeAccessible g amap m ad typ -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,tpmb,_,m) as etmi -> let access = tpmb.PUntaint((fun mi -> ComputeILAccess mi.IsPublic mi.IsFamily mi.IsFamilyOrAssembly mi.IsFamilyAndAssembly), m) IsProvidedMemberAccessible amap m ad etmi.EnclosingType access @@ -325,7 +325,7 @@ let IsPropInfoAccessible g amap m ad = function | ILProp (_,x) -> IsILPropInfoAccessible g amap m ad x | FSProp (_,_,Some vref,_) | FSProp (_,_,_,Some vref) -> IsValAccessible ad vref -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp (amap, tppi, m) as pp-> let access = let a = tppi.PUntaint((fun ppi -> diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs index ccd5c6d2706..d3902075119 100644 --- a/src/fsharp/AttributeChecking.fs +++ b/src/fsharp/AttributeChecking.fs @@ -19,7 +19,7 @@ open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif @@ -130,7 +130,7 @@ let AttribInfosOfFS g attribs = let GetAttribInfosOfEntity g amap m (tcref:TyconRef) = match metadataOfTycon tcref.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // TODO: provided attributes | ProvidedTypeMetadata _info -> [] //let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) @@ -149,7 +149,7 @@ let GetAttribInfosOfMethod amap m minfo = | ILMeth (g,ilminfo,_) -> ilminfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilminfo.MetadataScope m | FSMeth (g,_,vref,_) -> vref.Attribs |> AttribInfosOfFS g | DefaultStructCtor _ -> [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // TODO: provided attributes | ProvidedMeth (_,_mi,_,_m) -> [] @@ -162,7 +162,7 @@ let GetAttribInfosOfProp amap m pinfo = | FSProp(g,_,Some vref,_) | FSProp(g,_,_,Some vref) -> vref.Attribs |> AttribInfosOfFS g | FSProp _ -> failwith "GetAttribInfosOfProp: unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // TODO: provided attributes | ProvidedProp _ -> [] #endif @@ -171,7 +171,7 @@ let GetAttribInfosOfEvent amap m einfo = match einfo with | ILEvent(g, x) -> x.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap x.ILTypeInfo.ILScopeRef m | FSEvent(_, pi, _vref1, _vref2) -> GetAttribInfosOfProp amap m pi -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // TODO: provided attributes | ProvidedEvent _ -> [] #endif @@ -183,7 +183,7 @@ let GetAttribInfosOfEvent amap m einfo = let TryBindTyconRefAttribute g m (AttribInfo (atref,_) as args) (tcref:TyconRef) f1 f2 f3 = ignore m; ignore f3 match metadataOfTycon tcref.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with @@ -207,14 +207,14 @@ let BindMethInfoAttributes m minfo f1 f2 f3 = | ILMeth (_,x,_) -> f1 x.RawMetadata.CustomAttrs | FSMeth (_,_,vref,_) -> f2 vref.Attribs | DefaultStructCtor _ -> f2 [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth (_,mi,_,_) -> f3 (mi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) #endif /// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and /// provided attributes. let TryBindMethInfoAttribute g m (AttribInfo(atref,_) as attribSpec) minfo f1 f2 f3 = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING #else // to prevent unused parameter warning ignore f3 @@ -222,7 +222,7 @@ let TryBindMethInfoAttribute g m (AttribInfo(atref,_) as attribSpec) minfo f1 f2 BindMethInfoAttributes m minfo (fun ilAttribs -> TryDecodeILAttribute g atref ilAttribs |> Option.bind f1) (fun fsAttribs -> TryFindFSharpAttribute g attribSpec fsAttribs |> Option.bind f2) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING (fun provAttribs -> match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with | Some args -> f3 args @@ -316,7 +316,7 @@ let CheckFSharpAttributes g attribs m = CompleteD ) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Check a list of provided attributes for 'ObsoleteAttribute', returning errors and warnings as data let private CheckProvidedAttributes (g: TcGlobals) m (provAttribs: Tainted) = let (AttribInfo(tref,_)) = g.attrib_SystemObsolete @@ -368,7 +368,7 @@ let CheckFSharpAttributesForUnseen g attribs _m = (CheckFSharpAttributesForObsolete g attribs || CheckFSharpAttributesForHidden g attribs) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Indicate if a list of provided attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. let CheckProvidedAttributesForUnseen (provAttribs: Tainted) m = provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome),m) @@ -381,7 +381,7 @@ let CheckPropInfoAttributes pinfo m = | FSProp(g,_,Some vref,_) | FSProp(g,_,_,Some vref) -> CheckFSharpAttributes g vref.Attribs m | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp (amap,pi,m) -> CheckProvidedAttributes amap.g m (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) @@ -393,7 +393,7 @@ let CheckILFieldAttributes g (finfo:ILFieldInfo) m = match finfo with | ILFieldInfo(_,pd) -> CheckILAttributes g pd.CustomAttrs m |> CommitOperationResult -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField (amap,fi,m) -> CheckProvidedAttributes amap.g m (fi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) |> CommitOperationResult #endif @@ -411,7 +411,7 @@ let CheckMethInfoAttributes g m tyargsOpt minfo = else CompleteD) Some res) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING (fun provAttribs -> Some (CheckProvidedAttributes g m provAttribs)) #else (fun _provAttribs -> None) @@ -427,7 +427,7 @@ let MethInfoIsUnseen g m typ minfo = match BindMethInfoAttributes m minfo (fun ilAttribs -> Some(CheckILAttributesForUnseen g ilAttribs m)) (fun fsAttribs -> Some(CheckFSharpAttributesForUnseen g fsAttribs m)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING (fun provAttribs -> Some(CheckProvidedAttributesForUnseen provAttribs m)) #else (fun _provAttribs -> None) @@ -437,7 +437,7 @@ let MethInfoIsUnseen g m typ minfo = | None -> false let isUnseenByHidingAttribute = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING not (isObjTy g typ) && isAppTy g typ && isObjTy g minfo.EnclosingType && @@ -470,7 +470,7 @@ let PropInfoIsUnseen m pinfo = | FSProp (g,_,Some vref,_) | FSProp (g,_,_,Some vref) -> CheckFSharpAttributesForUnseen g vref.Attribs m | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp (_amap,pi,m) -> CheckProvidedAttributesForUnseen (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) m #endif diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0d35f05dc1c..adb43bcef77 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -49,7 +49,7 @@ open Microsoft.FSharp.Compiler.PrettyNaming open Microsoft.FSharp.Compiler.Import -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif @@ -101,7 +101,7 @@ exception HashLoadedScriptConsideredSource of range let GetRangeOfDiagnostic(err:PhasedDiagnostic) = let rec RangeFromException = function | ErrorFromAddingConstraint(_, err2, _) -> RangeFromException err2 -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ExtensionTyping.ProvidedTypeResolutionNoRange(e) -> RangeFromException e | ExtensionTyping.ProvidedTypeResolution(m, _) #endif @@ -233,7 +233,7 @@ let GetRangeOfDiagnostic(err:PhasedDiagnostic) = // Strip TargetInvocationException wrappers | :? System.Reflection.TargetInvocationException as e -> RangeFromException e.InnerException -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | :? TypeProviderError as e -> e.Range |> Some #endif @@ -352,7 +352,7 @@ let GetDiagnosticNumber(err:PhasedDiagnostic) = | UnresolvedConversionOperator _ -> 93 // avoid 94-100 for safety | ObsoleteError _ -> 101 -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ExtensionTyping.ProvidedTypeResolutionNoRange _ | ExtensionTyping.ProvidedTypeResolution _ -> 103 #endif @@ -369,7 +369,7 @@ let GetDiagnosticNumber(err:PhasedDiagnostic) = | Failure _ -> 192 | NumberedError((n, _), _) -> n | IllegalFileNameChar(fileName, invalidChar) -> fst (FSComp.SR.buildUnexpectedFileNameCharacter(fileName, string invalidChar)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | :? TypeProviderError as e -> e.Number #endif | ErrorsFromAddingSubsumptionConstraint (_, _, _, _, _, ContextInfo.DowncastUsedInsteadOfUpcast _, _) -> fst (FSComp.SR.considerUpcast("", "")) @@ -747,7 +747,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = | ErrorFromAddingConstraint(_, e, _) -> OutputExceptionR os e -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ExtensionTyping.ProvidedTypeResolutionNoRange(e) | ExtensionTyping.ProvidedTypeResolution(_, e) -> @@ -1726,7 +1726,7 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt relatedErrors |> List.iter OutputRelatedError match err with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | {Exception = (:? TypeProviderError as tpe)} -> tpe.Iter (fun e -> let newErr = {err with Exception = e} @@ -2137,14 +2137,14 @@ type AssemblyReference = override x.ToString() = sprintf "AssemblyReference(%s)" x.Text type UnresolvedAssemblyReference = UnresolvedAssemblyReference of string * AssemblyReference list -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING type ResolvedExtensionReference = ResolvedExtensionReference of string * AssemblyReference list * Tainted list #endif type ImportedBinary = { FileName: string RawMetadata: IRawFSharpAssemblyData -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING ProviderGeneratedAssembly: System.Reflection.Assembly option IsProviderGenerated: bool ProviderGeneratedStaticLinkMap : ProvidedAssemblyStaticLinkingMap option @@ -2157,7 +2157,7 @@ type ImportedAssembly = FSharpViewOfMetadata: CcuThunk AssemblyAutoOpenAttributes: string list AssemblyInternalsVisibleToAttributes: string list -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING IsProviderGenerated: bool mutable TypeProviders: Tainted list #endif @@ -2291,7 +2291,7 @@ type TcConfigBuilder = mutable showTimes : bool mutable showLoadedAssemblies : bool mutable continueAfterParseFailure : bool -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// show messages about extension type resolution? mutable showExtensionTypeMessages : bool #endif @@ -2450,7 +2450,7 @@ type TcConfigBuilder = showTimes = false showLoadedAssemblies = false continueAfterParseFailure = false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING showExtensionTypeMessages = false #endif pause = false @@ -2916,7 +2916,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = member x.showTimes = data.showTimes member x.showLoadedAssemblies = data.showLoadedAssemblies member x.continueAfterParseFailure = data.continueAfterParseFailure -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member x.showExtensionTypeMessages = data.showExtensionTypeMessages #endif member x.pause = data.pause @@ -3913,7 +3913,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let mutable disposed = false let mutable ilGlobalsOpt = ilGlobalsOpt let mutable tcGlobals = None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let mutable generatedTypeRoots = new System.Collections.Generic.Dictionary() #endif @@ -4032,7 +4032,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti | UnresolvedImportedAssembly _ -> UnresolvedCcu(assref.QualifiedName) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member tcImports.GetProvidedAssemblyInfo(ctok, m, assembly: Tainted) = let anameOpt = assembly.PUntaint((fun assembly -> match assembly with null -> None | a -> Some (a.GetName())), m) match anameOpt with @@ -4183,7 +4183,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti { new Import.AssemblyLoader with member x.FindCcuFromAssemblyRef (ctok, m, ilAssemblyRef) = tcImports.FindCcuFromAssemblyRef (ctok, m, ilAssemblyRef) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member x.GetProvidedAssemblyInfo (ctok, m, assembly) = tcImports.GetProvidedAssemblyInfo (ctok, m, assembly) member x.RecordGeneratedTypeRoot root = tcImports.RecordGeneratedTypeRoot root #endif @@ -4215,7 +4215,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti CheckDisposed() tcGlobals <- Some g -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member private tcImports.InjectProvidedNamespaceOrTypeIntoEntity (typeProviderEnvironment, tcConfig:TcConfig, @@ -4413,14 +4413,14 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti ILScopeRef = ilScopeRef AssemblyAutoOpenAttributes = GetAutoOpenAttributes ilg ilModule AssemblyInternalsVisibleToAttributes = GetInternalsVisibleToAttributes ilg ilModule -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING IsProviderGenerated = false TypeProviders = [] #endif FSharpOptimizationData = notlazy None } tcImports.RegisterCcu(ccuinfo) let phase2 () = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING ccuinfo.TypeProviders <- tcImports.ImportTypeProviderExtensions (ctok, tcConfig, filename, ilScopeRef, ilModule.ManifestOfAssembly.CustomAttrs.AsList, ccu.Contents, invalidateCcu, m) #endif [ResolvedImportedAssembly(ccuinfo)] @@ -4428,7 +4428,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti member tcImports.PrepareToImportReferencedFSharpAssembly (ctok, m, filename, dllinfo:ImportedBinary) = CheckDisposed() -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let tcConfig = tcConfigP.Get(ctok) #endif let ilModule = dllinfo.RawMetadata @@ -4448,7 +4448,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let minfo : PickledCcuInfo = data.RawData let mspec = minfo.mspec -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let invalidateCcu = new Event<_>() #endif @@ -4461,7 +4461,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti SourceCodeDirectory = codeDir (* note: in some cases we fix up this information later *) IsFSharp=true Contents = mspec -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING InvalidateEvent=invalidateCcu.Publish IsProviderGenerated = false ImportProvidedType = (fun ty -> Import.ImportProvidedType (tcImports.GetImportMap()) m ty) @@ -4489,13 +4489,13 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti AssemblyAutoOpenAttributes = ilModule.GetAutoOpenAttributes(ilg) AssemblyInternalsVisibleToAttributes = ilModule.GetInternalsVisibleToAttributes(ilg) FSharpOptimizationData=optdata -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING IsProviderGenerated = false TypeProviders = [] #endif ILScopeRef = ilScopeRef } let phase2() = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match ilModule.TryGetRawILModule() with | None -> () // no type providers can be used without a real IL Module present | Some ilModule -> @@ -4511,7 +4511,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti (* Relink *) (* dprintf "Phase2: %s\n" filename; REMOVE DIAGNOSTICS *) ccuRawDataAndInfos |> List.iter (fun (data, _, _) -> data.OptionalFixup(fun nm -> availableToOptionalCcu(tcImports.FindCcu(ctok, m, nm, lookupOnly=false))) |> ignore) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING ccuRawDataAndInfos |> List.iter (fun (_, _, phase2) -> phase2()) #endif ccuRawDataAndInfos |> List.map p23 |> List.map ResolvedImportedAssembly @@ -4549,7 +4549,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let dllinfo = { RawMetadata=assemblyData FileName=filename -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING ProviderGeneratedAssembly=None IsProviderGenerated=false ProviderGeneratedStaticLinkMap = None @@ -4616,7 +4616,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti if tryFile (assemblyName + ".dll") then () else tryFile (assemblyName + ".exe") |> ignore -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING 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 @@ -5359,7 +5359,7 @@ let GetInitialTcState(m, ccuName, tcConfig:TcConfig, tcGlobals, tcImports:TcImpo let ccuData : CcuData = { IsFSharp=true UsesFSharp20PlusQuotations=false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING InvalidateEvent=(new Event<_>()).Publish IsProviderGenerated = false ImportProvidedType = (fun ty -> Import.ImportProvidedType (tcImports.GetImportMap()) m ty) diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index c5f14dc8bcf..8f782ccee16 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -23,7 +23,7 @@ open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.ReferenceResolver open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Core.CompilerServices -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -207,7 +207,7 @@ type AssemblyResolution = type UnresolvedAssemblyReference = UnresolvedAssemblyReference of string * AssemblyReference list -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING type ResolvedExtensionReference = ResolvedExtensionReference of string * AssemblyReference list * Tainted list #endif @@ -347,7 +347,7 @@ type TcConfigBuilder = mutable showTimes: bool mutable showLoadedAssemblies: bool mutable continueAfterParseFailure: bool -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING mutable showExtensionTypeMessages: bool #endif mutable pause: bool @@ -499,7 +499,7 @@ type TcConfig = member showTimes: bool member showLoadedAssemblies: bool member continueAfterParseFailure: bool -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member showExtensionTypeMessages: bool #endif member pause: bool @@ -555,7 +555,7 @@ type TcConfigProvider = type ImportedBinary = { FileName: string RawMetadata: IRawFSharpAssemblyData -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING ProviderGeneratedAssembly: System.Reflection.Assembly option IsProviderGenerated: bool ProviderGeneratedStaticLinkMap: ProvidedAssemblyStaticLinkingMap option @@ -570,7 +570,7 @@ type ImportedAssembly = FSharpViewOfMetadata: CcuThunk AssemblyAutoOpenAttributes: string list AssemblyInternalsVisibleToAttributes: string list -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING IsProviderGenerated: bool mutable TypeProviders: Tainted list #endif @@ -599,7 +599,7 @@ type TcImports = member FindDllInfo: CompilationThreadToken * range * string -> ImportedBinary member TryFindDllInfo: CompilationThreadToken * range * string * lookupOnly: bool -> option member FindCcuFromAssemblyRef: CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member ProviderGeneratedTypeRoots: ProviderGeneratedType list #endif member GetImportMap: unit -> Import.ImportMap @@ -617,7 +617,7 @@ type TcImports = /// Try to find the given assembly reference. member TryFindExistingFullyQualifiedPathByExactAssemblyRef: CompilationThreadToken * ILAssemblyRef -> string option -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Try to find a provider-generated assembly member TryFindProviderGeneratedAssemblyByName: CompilationThreadToken * assemblyName:string -> System.Reflection.Assembly option #endif diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index ce26cafde0a..1c78fd9aa33 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -903,7 +903,7 @@ let internalFlags (tcConfigB:TcConfigBuilder) = CompilerOption("splitting", tagNone, OptionSwitch(splittingSwitch tcConfigB),Some(InternalCommandLineOption("splitting", rangeCmdArgs)), None) CompilerOption("versionfile", tagString, OptionString (fun s -> tcConfigB.version <- VersionFile s), Some(InternalCommandLineOption("versionfile", rangeCmdArgs)), None) CompilerOption("times" , tagNone, OptionUnit (fun () -> tcConfigB.showTimes <- true), Some(InternalCommandLineOption("times", rangeCmdArgs)), None) // "Display timing profiles for compilation") -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING CompilerOption("showextensionresolution" , tagNone, OptionUnit (fun () -> tcConfigB.showExtensionTypeMessages <- true), Some(InternalCommandLineOption("showextensionresolution", rangeCmdArgs)), None) // "Display information about extension type resolution") #endif (* BEGIN: Consider as public Retail option? *) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 8529b3f0c4e..0ec8f9f832a 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -1333,7 +1333,7 @@ and RecordMemberConstraintSolution css m trace traitInfo res = /// Convert a MethInfo into the data we save in the TAST and MemberConstraintSolutionOfMethInfo css m minfo minst = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING #else // to prevent unused parameter warning ignore css @@ -1347,7 +1347,7 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst = FSMethSln(typ, vref, minst) | MethInfo.DefaultStructCtor _ -> error(InternalError("the default struct constructor was the unexpected solution to a trait constraint", m)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap, mi, _, m) -> let g = amap.g let minst = [] // GENERIC TYPE PROVIDERS: for generics, we would have an minst here diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 57ddfff1a6e..dade9c9650e 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -4,7 +4,7 @@ namespace Microsoft.FSharp.Compiler -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING module internal ExtensionTyping = open System diff --git a/src/fsharp/ExtensionTyping.fsi b/src/fsharp/ExtensionTyping.fsi index 7ac14362cbc..f796881c357 100755 --- a/src/fsharp/ExtensionTyping.fsi +++ b/src/fsharp/ExtensionTyping.fsi @@ -4,7 +4,7 @@ namespace Microsoft.FSharp.Compiler -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING module internal ExtensionTyping = diff --git a/src/fsharp/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj b/src/fsharp/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj index f81d227e8d6..b68ab16911c 100644 --- a/src/fsharp/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj +++ b/src/fsharp/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj @@ -20,7 +20,7 @@ netcore - $(DefineConstants);EXTENSIONTYPING;$(TargetDotnetProfile.ToLower()) + $(DefineConstants);$(TargetDotnetProfile.ToLower()) true diff --git a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj index 257443d115b..554547215cd 100644 --- a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj +++ b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj @@ -10,7 +10,6 @@ AnyCPU {649FA588-F02E-457C-9FCF-87E46407481E} Library - EXTENSIONTYPING;$(DefineConstants) FSharp.Compiler.Interactive.Settings 512 diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index e68a817dbba..dccca2632f1 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -10,7 +10,6 @@ AnyCPU Library FSharp.Compiler.Private - EXTENSIONTYPING;$(DefineConstants) COMPILER;$(DefineConstants) $(NoWarn);62;9 {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} diff --git a/src/fsharp/FSharp.Compiler.Unittests/FSharp.Compiler.Unittests.fsproj b/src/fsharp/FSharp.Compiler.Unittests/FSharp.Compiler.Unittests.fsproj index 1e4f6603e7d..765e8cc5bb9 100644 --- a/src/fsharp/FSharp.Compiler.Unittests/FSharp.Compiler.Unittests.fsproj +++ b/src/fsharp/FSharp.Compiler.Unittests/FSharp.Compiler.Unittests.fsproj @@ -17,9 +17,6 @@ false false - - $(DefineConstants);EXTENSIONTYPING - true false diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 379990b793b..9a655b05f7d 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -24,7 +24,7 @@ $(NoWarn);217 - $(DefineConstants);EXTENSIONTYPING;$(TargetDotnetProfile.ToLower()) + $(DefineConstants);$(TargetDotnetProfile.ToLower()) true diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj index 047e70052fb..82219020124 100644 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ b/src/fsharp/Fsc-proto/Fsc-proto.fsproj @@ -11,6 +11,7 @@ Exe $(NoWarn);62 fsc-proto + NO_EXTENSIONTYPING;$(DefineConstants) BUILDING_PROTO;$(DefineConstants) BUILDING_WITH_LKG;$(DefineConstants) COMPILER;$(DefineConstants) diff --git a/src/fsharp/Fsc/Fsc.fsproj b/src/fsharp/Fsc/Fsc.fsproj index 9775469cf1c..127f1c4753a 100644 --- a/src/fsharp/Fsc/Fsc.fsproj +++ b/src/fsharp/Fsc/Fsc.fsproj @@ -18,7 +18,6 @@ Exe $(NoWarn);62 fsc - EXTENSIONTYPING;$(DefineConstants) COMPILER;$(DefineConstants) true $(OtherFlags) --warnon:1182 diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index dcc82333144..e0311b39529 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -400,7 +400,7 @@ and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = 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 EXTENSIONTYPING +#if !NO_EXTENSIONTYPING 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 -> @@ -6179,7 +6179,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then () else match tycon.TypeReprInfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> () | TProvidedTypeExtensionPoint _ -> () #endif diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 375571f1afe..c6f8a7629ce 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -53,7 +53,7 @@ let GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ = let minfos = match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType let meths = @@ -122,7 +122,7 @@ let GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ = let pinfos = match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType let matchingProps = @@ -185,7 +185,7 @@ type InfoReader(g:TcGlobals, amap:Import.ImportMap) = let GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ = let infos = match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType match optFilter with @@ -210,7 +210,7 @@ type InfoReader(g:TcGlobals, amap:Import.ImportMap) = let ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ = let infos = match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType match optFilter with @@ -426,7 +426,7 @@ let GetIntrinsicConstructorInfosOfType (infoReader:InfoReader) m ty = let amap = infoReader.amap if isAppTy g ty then match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType [ for ci in st.PApplyArray((fun st -> st.GetConstructors()), "GetConstructors", m) do diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index ab6d2c0c762..8221e808746 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -27,7 +27,7 @@ open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.TypeRelations -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -654,7 +654,7 @@ let MakeMethInfoCall amap m minfo minst args = BuildFSharpMethodCall g m (typ,vref) valUseFlags minst args |> fst | DefaultStructCtor(_,typ) -> mkDefault (m,typ) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,m) -> let isProp = false // not necessarily correct, but this is only used post-creflect where this flag is irrelevant let ilMethodRef = Import.ImportProvidedMethodBaseAsILMethodRef amap m mi @@ -668,7 +668,7 @@ let MakeMethInfoCall amap m minfo minst args = #endif -#if EXTENSIONTYPING +#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 methodName = mbase.PUntaint((fun x -> x.Name),m) @@ -718,7 +718,7 @@ let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objA valUseFlags match minfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // By this time this is an erased method info, e.g. one returned from an expression // REVIEW: copied from tastops, which doesn't allow protected methods | ProvidedMeth (amap,providedMeth,_,_) -> @@ -835,7 +835,7 @@ let CoerceFromFSharpFuncToDelegate g amap infoReader ad callerArgTy m callerArgE //------------------------------------------------------------------------- -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // This file is not a great place for this functionality to sit, it's here because of BuildMethodCall module ProvidedMethodCalls = diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index 56092362db0..a326248b553 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -650,7 +650,7 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, // Note you only have to explicitly implement 'System.IComparable' to customize structural comparison AND equality on F# types if isImplementation && -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING not tycon.IsProvidedGeneratedTycon && #endif Option.isNone tycon.GeneratedCompareToValues && @@ -667,7 +667,7 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, 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 if isImplementation -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING && not tycon.IsProvidedGeneratedTycon #endif then diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 5a30b96cd2f..1962251c389 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -27,7 +27,7 @@ open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.PrettyNaming open System.Collections.Generic -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -1068,7 +1068,7 @@ type PermitDirectReferenceToGeneratedType = | No -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Check for direct references to generated provided types. let CheckForDirectReferenceToGeneratedType (tcref: TyconRef, genOk, m) = @@ -1143,7 +1143,7 @@ let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNam match LookupTypeNameInEntityHaveArity nm staticResInfo mtyp with | Some tycon -> [modref.NestedTyconRef tycon] | None -> [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let tcrefs = match tcrefs with | [] -> ResolveProvidedTypeNameInEntity (amap, m, nm, modref) @@ -1173,7 +1173,7 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec let tycon = tcref.Deref let mty = tycon.ModuleOrNamespaceType // No dotting through type generators to get to a nested type! -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if checkForGenerated then CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #else @@ -1185,7 +1185,7 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, m, ad, nm, staticResInfo, tcref) tcrefs |> List.map (MakeNestedType ncenv tinst m) | None -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> [ for nestedType in info.ProvidedType.PApplyArray((fun sty -> sty.GetNestedTypes()), "GetNestedTypes", m) do @@ -1729,7 +1729,7 @@ let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities | _ -> tcrefs -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING for (_,tcref) in tcrefs do // Type generators can't be returned by name resolution, unless PermitDirectReferenceToGeneratedType.Yes CheckForDirectReferenceToGeneratedType (tcref, genOk, m) @@ -1933,7 +1933,7 @@ let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m // F#-defined IL-style extension methods are not seen as extension methods in F# code | FSMeth(g,_,vref,_) -> yield (FSMeth(g, apparentTy, vref, Some pri)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // // Provided extension methods are not yet supported | ProvidedMeth(amap,providedMeth,_,m) -> yield (ProvidedMeth(amap, providedMeth, Some pri,m)) @@ -1991,7 +1991,7 @@ let CoreDisplayName(pinfo:PropInfo) = | FSProp(_,_,Some get,_) -> get.CoreDisplayName | FSProp _ -> failwith "unexpected (property must have either getter or setter)" | ILProp(_,ILPropInfo(_,def)) -> def.Name -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.Name), m) #endif @@ -2164,7 +2164,7 @@ let ResolveLongIdentInType sink ncenv nenv lookupKind m ad lid findFlag typeName item,rest let private ResolveLongIdentInTyconRef (ncenv:NameResolver) nenv lookupKind resInfo depth m ad lid typeNameResInfo tcref = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // No dotting through type generators to get to a member! CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #endif @@ -2720,7 +2720,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo match lid with | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(),m)) | [id] -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // No dotting through type generators to get to a nested type! CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #endif @@ -2738,7 +2738,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) | id::rest -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // No dotting through type generators to get to a nested type! CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #endif @@ -3565,7 +3565,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso if addersAndRemovers.IsEmpty then minfos else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // Filter out the ones with mangled names from applying static parameters let minfos = let methsWithStaticParams = @@ -4191,7 +4191,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics typ if addersAndRemovers.IsEmpty then minfos else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) - #if EXTENSIONTYPING + #if !NO_EXTENSIONTYPING // Filter out the ones with mangled names from applying static parameters let minfos = let methsWithStaticParams = diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 2387b0365c3..258f12a520c 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -27,7 +27,7 @@ open Microsoft.FSharp.Compiler.PrettyNaming open Microsoft.FSharp.Core.Printf -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif @@ -1370,7 +1370,7 @@ module InfoMemberPrinting = let prettyTyparInst, prettyMethInfo, minst = prettifyILMethInfo amap m methInfo typarInst ilminfo let resL = layoutMethInfoCSharpStyle amap m denv prettyMethInfo minst prettyTyparInst, resL -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> let prettyTyparInst, _ = PrettyTypes.PrettifyInst amap.g typarInst prettyTyparInst, layoutMethInfoCSharpStyle amap m denv methInfo methInfo.FormalMethodInst @@ -1469,7 +1469,7 @@ module private TastDefinitionPrinting = | TAsmRepr _ | TILObjectRepr _ | TMeasureableRepr _ -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint _ | TProvidedNamespaceExtensionPoint _ #endif @@ -1477,7 +1477,7 @@ module private TastDefinitionPrinting = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING 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)) @@ -1642,7 +1642,7 @@ module private TastDefinitionPrinting = let tpsL = layoutTyparDecls denv nameL tycon.IsPrefixDisplay tps typewordL ^^ tpsL let start = Option.map tagKeyword start -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match tycon.IsProvided with | true -> layoutProvidedTycon denv infoReader ad m start lhsL ty diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 029de52c39f..8906c9a4e8f 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1379,7 +1379,7 @@ let CheckRecdField isUnion cenv env (tycon:Tycon) (rfield:RecdField) = CheckForByrefLikeType cenv env rfield.FormalType (fun () -> errorR(Error(FSComp.SR.chkCantStoreByrefValue(), tycon.Range))) let CheckEntityDefn cenv env (tycon:Entity) = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if not tycon.IsProvidedGeneratedTycon then #endif let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute tycon.Attribs } diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 5ca9483fe8a..0f599ff60fd 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -802,7 +802,7 @@ and ConvType cenv env m typ = | TType_ucase(UCRef(tcref,_),tyargs) // Note: we erase union case 'types' when converting to quotations | TType_app(tcref,tyargs) -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match TryElimErasableTyconRef cenv m tcref with | Some baseTy -> ConvType cenv env m baseTy | _ -> @@ -926,7 +926,7 @@ and ConvDecisionTree cenv env tgs typR x = and IsILTypeRefStaticLinkLocal cenv m (tr:ILTypeRef) = ignore cenv; ignore m match tr.Scope with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ILScopeRef.Assembly aref when not cenv.g.isInteractive && aref.Name <> cenv.g.ilg.primaryAssemblyName && // optimization to avoid this check in the common case @@ -985,7 +985,7 @@ and ConvILType cenv env m ty = | ILType.FunctionPointer _ -> wfail(Error(FSComp.SR.crefQuotationsCantContainThisType(), m)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING and TryElimErasableTyconRef cenv m (tcref:TyconRef) = match tcref.TypeReprInfo with // Get the base type @@ -994,7 +994,7 @@ and TryElimErasableTyconRef cenv m (tcref:TyconRef) = #endif and ConvTyconRef cenv (tcref:TyconRef) m = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match TryElimErasableTyconRef cenv m tcref with | Some baseTy -> ConvTyconRef cenv (tcrefOfAppTy cenv.g baseTy) m | None -> diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index cd41c20fca9..21d2fd06132 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -17,7 +17,7 @@ open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Infos -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -446,7 +446,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | (TRecdRepr _ | TUnionRepr _ | TILObjectRepr _ -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint _ | TProvidedNamespaceExtensionPoint _ #endif @@ -498,7 +498,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | (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) | TNoRepr, TNoRepr -> true -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint info1 , TProvidedTypeExtensionPoint info2 -> Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType,info2.ProvidedType) | TProvidedNamespaceExtensionPoint _, TProvidedNamespaceExtensionPoint _ -> diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 5b0c0eaf0aa..d2d378508de 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -22,7 +22,7 @@ open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.Layout.TaggedTextOps open Microsoft.FSharp.Compiler.PrettyNaming -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -627,14 +627,14 @@ let reduceTyconRefAbbrev (tcref:TyconRef) tyargs = reduceTyconAbbrev tcref.Deref tyargs let reduceTyconMeasureableOrProvided (g:TcGlobals) (tycon:Tycon) tyargs = -#if !EXTENSIONTYPING +#if NO_EXTENSIONTYPING ignore g // otherwise g would be unused #endif let repr = tycon.TypeReprInfo match repr with | TMeasureableRepr ty -> if isNil tyargs then ty else instType (mkTyconInst tycon tyargs) ty -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint info when info.IsErased -> info.BaseTypeForErased (range0, g.obj_ty) #endif | _ -> invalidArg "tc" "this type definition is not a refinement" @@ -921,7 +921,7 @@ let measureEquiv g m1 m2 = measureAEquiv g TypeEquivEnv.Empty m1 m2 let isErasedType g ty = match stripTyEqns g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TType_app (tcref, _) -> tcref.IsProvidedErasedTycon #endif | _ -> false @@ -1516,19 +1516,19 @@ let isILAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> 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, _) -> tyconRefEq g g.byref_tcr tcref | _ -> false) let isByrefLikeTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> isByrefLikeTyconRef g tcref | _ -> false) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let extensionInfoOfTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.TypeReprInfo | _ -> TNoRepr) #endif type TypeDefMetadata = | ILTypeMetadata of TILObjectReprData | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata of TProvidedTypeInfo #endif let metadataOfTycon (tycon:Tycon) = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> ProvidedTypeMetadata info | _ -> @@ -1540,7 +1540,7 @@ let metadataOfTycon (tycon:Tycon) = let metadataOfTy g ty = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match extensionInfoOfTy g ty with | TProvidedTypeExtensionPoint info -> ProvidedTypeMetadata info | _ -> @@ -1554,7 +1554,7 @@ let metadataOfTy g ty = let isILReferenceTy g ty = match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> not info.IsStructOrEnum #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> not td.IsStructOrEnum @@ -1562,7 +1562,7 @@ let isILReferenceTy g ty = let isILInterfaceTycon (tycon:Tycon) = match metadataOfTycon tycon with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsInterface #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Interface) @@ -1594,7 +1594,7 @@ let isFSharpInterfaceTy g ty = let isDelegateTy g ty = match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsDelegate () #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Delegate) @@ -1605,7 +1605,7 @@ let isDelegateTy g ty = let isInterfaceTy g ty = match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsInterface #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Interface) @@ -1613,7 +1613,7 @@ let isInterfaceTy g ty = let isClassTy g ty = match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsClass #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Class) @@ -2781,7 +2781,7 @@ let TryFindILAttributeOpt attr attrs = let TryBindTyconRefAttribute g (m:range) (AttribInfo (atref, _) as args) (tcref:TyconRef) f1 f2 f3 = ignore m; ignore f3 match metadataOfTycon tcref.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)), m) match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)), m) with @@ -3394,7 +3394,7 @@ module DebugPrint = begin | _ -> failwith "unreachable" let reprL = match tycon.TypeReprInfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint _ | TProvidedNamespaceExtensionPoint _ #endif @@ -4443,7 +4443,7 @@ let InferArityOfExprBinding g allowTypeDirectedDetupling (v:Val) e = let underlyingTypeOfEnumTy (g: TcGlobals) typ = assert(isEnumTy g typ) match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.UnderlyingTypeOfEnum() #endif | ILTypeMetadata (TILObjectReprData(_, _, tdef)) -> @@ -4885,7 +4885,7 @@ and remapTyconRepr g tmenv repr = | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) | TUnionRepr x -> TUnionRepr (remapUnionCases g tmenv x) | TILObjectRepr _ -> failwith "cannot remap IL type definitions" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> repr | TProvidedTypeExtensionPoint info -> TProvidedTypeExtensionPoint @@ -6324,7 +6324,7 @@ 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 EXTENSIONTYPING +#if !NO_EXTENSIONTYPING //---------------------------------------------------------------------------- // Decode extensible typing attributes //---------------------------------------------------------------------------- @@ -7319,7 +7319,7 @@ let isSealedTy g ty = isArrayTy g ty || match metadataOfTy g ty with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata st -> st.IsSealed #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> td.IsSealed diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 38220852ecc..04410eae1c1 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -19,7 +19,7 @@ open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.Lib -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -993,7 +993,7 @@ val mkPrintfFormatTy : TcGlobals -> TType -> TType -> TType -> TType -> TType -> type TypeDefMetadata = | ILTypeMetadata of TILObjectReprData | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata of TProvidedTypeInfo #endif @@ -1286,7 +1286,7 @@ val TyconRefHasAttribute : TcGlobals -> range -> BuiltinAttribInfo -> TyconRef - /// Try to find the AttributeUsage attribute, looking for the value of the AllowMultiple named parameter val TryFindAttributeUsageAttribute : TcGlobals -> range -> TyconRef -> bool option -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// returns Some(assemblyName) for success val TryDecodeTypeProviderAssemblyAttr : ILGlobals -> ILAttribute -> string option #endif diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 10e8897d60e..18307ce1559 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -665,7 +665,7 @@ 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) = -#if EXTENSIONTYPING +#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 = @@ -1646,7 +1646,7 @@ and p_tycon_repr x st = | TFSharpObjectRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_typ ty st; false | TNoRepr -> p_byte 0 st; false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint info -> if info.IsErased then // Pickle erased type definitions as a NoRepr diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 9cb244a4669..a0dc645905d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -40,7 +40,7 @@ open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.PrettyNaming open Microsoft.FSharp.Compiler.InfoReader -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -3016,7 +3016,7 @@ let BuildPossiblyConditionalMethodCall cenv env isMutable m isProp minfo valUseF mkUnit cenv.g m, cenv.g.unit_ty | _ -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match minfo with | ProvidedMeth(_, mi, _, _) -> // BuildInvokerExpressionForProvidedMethodCall converts references to F# intrinsics back to values @@ -3080,7 +3080,7 @@ let BuildILFieldGet g amap m objExpr (finfo:ILFieldInfo) = let valu = if isValueType then AsValue else AsObject let tinst = finfo.TypeInst let fieldType = finfo.FieldType (amap, m) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let ty = tyOfExpr g objExpr match finfo with | ProvidedField _ when (isErasedType g ty) -> @@ -4719,7 +4719,7 @@ and TcTyparConstraints cenv newOk checkCxs occ env tpenv wcs = let _, tpenv = List.fold (fun (ridx, tpenv) tc -> ridx - 1, TcTyparConstraint ridx cenv newOk checkCxs occ env tpenv tc) (List.length wcs - 1, tpenv) wcs tpenv -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING 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 = @@ -4908,7 +4908,7 @@ and TcTypeApp cenv newOk checkCxs occ env tpenv m tcref pathTypeArgs (synArgTys: CheckTyconAccessible cenv.amap m env.eAccessRights tcref |> ignore CheckEntityAttributes cenv.g tcref m |> CommitOperationResult -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // Provided types are (currently) always non-generic. Their names may include mangled // static parameters, which are passed by the provider. if tcref.Deref.IsProvided then TcProvidedTypeApp cenv env tpenv tcref synArgTys m else @@ -8623,7 +8623,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | (DelayedTypeApp(tys, mTypeArgs, mExprAndTypeArgs) :: otherDelayed) -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, Some (tys, mTypeArgs), mExprAndTypeArgs, mItem) with | Some minfoAfterStaticArguments -> @@ -8654,7 +8654,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del TcMethodApplicationThen cenv env overallTy None tpenv (Some tyargs) [] mExprAndTypeArgs mItem methodName ad NeverMutates false meths afterResolution NormalValUse [] ExprAtomicFlag.Atomic otherDelayed | _ -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if not minfos.IsEmpty && minfos.[0].ProvidedStaticParameterInfo.IsSome then error(Error(FSComp.SR.etMissingStaticArgumentsToMethod(), mItem)) #endif @@ -8676,7 +8676,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let objTyAfterTyArgs, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv mExprAndTypeArgs objTy tyargs CallExprHasTypeSink cenv.tcSink (mExprAndArg, env.NameEnv, objTyAfterTyArgs, env.DisplayEnv, env.eAccessRights) let itemAfterTyArgs, minfosAfterTyArgs = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // If the type is provided and took static arguments then the constructor will have changed // to a provided constructor on the statically instantiated type. Re-resolve that constructor. match objTyAfterTyArgs with @@ -9039,7 +9039,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela // To get better warnings we special case some of the few known mutate-a-struct method names let mutates = (if methodName = "MoveNext" || methodName = "GetNextArg" then DefinitelyMutates else PossiblyMutates) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, tyargsOpt, mExprAndItem, mItem) with | Some minfoAfterStaticArguments -> // Replace the resolution including the static parameters, plus the extra information about the original method info @@ -14703,7 +14703,7 @@ module EstablishTypeDefinitionCores = tycon.entity_tycon_repr <- repr attrs, getFinalAttrs -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Get the items on the r.h.s. of a 'type X = ABC<...>' definition let private TcTyconDefnCore_GetGenerateDeclaration_Rhs rhsType = match rhsType with @@ -14926,7 +14926,7 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.Ok, rhsType, m) -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // Check we have not already decided that this is a generative provided type definition. If we have already done this (i.e. this is the second pass // for a generative provided type definition, then there is no more work to do). if (match tycon.entity_tycon_repr with TNoRepr -> true | _ -> false) then diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index b880d24dfb6..8aea32c097e 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -53,7 +53,7 @@ open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -1103,7 +1103,7 @@ module StaticLinker = // Don't save interface, optimization or resource definitions for provider-generated assemblies. // These are "fake". let isProvided (ccu: CcuThunk option) = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match ccu with | Some c -> c.IsProviderGenerated | None -> false @@ -1333,7 +1333,7 @@ module StaticLinker = // prior to this point. let StaticLink (ctok, tcConfig:TcConfig, tcImports:TcImports, ilGlobals:ILGlobals) = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let providerGeneratedAssemblies = [ // Add all EST-generated assemblies into the static linking set @@ -1347,7 +1347,7 @@ module StaticLinker = (fun ilxMainModule -> LegacyFindAndAddMscorlibTypesForStaticLinkingIntoFSharpCoreLibraryForNet20 (tcConfig, ilGlobals, ilxMainModule)) elif not tcConfig.standalone && tcConfig.extraStaticLinkRoots.IsEmpty -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING && providerGeneratedAssemblies.IsEmpty #endif then @@ -1360,7 +1360,7 @@ module StaticLinker = ReportTime tcConfig "Static link" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING Morphs.enableMorphCustomAttributeData() let providerGeneratedILModules = FindProviderGeneratedILModules (ctok, tcImports, providerGeneratedAssemblies) diff --git a/src/fsharp/fsi/Fsi.fsproj b/src/fsharp/fsi/Fsi.fsproj index 66b633519ad..ea99ddf1486 100644 --- a/src/fsharp/fsi/Fsi.fsproj +++ b/src/fsharp/fsi/Fsi.fsproj @@ -18,7 +18,6 @@ $(NoWarn);62 fsi 0x0A000000 - EXTENSIONTYPING;$(DefineConstants) COMPILER;$(DefineConstants) FSI_SHADOW_COPY_REFERENCES;$(DefineConstants) FSI_SERVER;$(DefineConstants) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index c5e3d54509b..7cf093f9bef 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1671,7 +1671,7 @@ module internal MagicAssemblyResolution = | Some (OkResult (warns,[r])) -> OkResult (warns, Choice1Of2 r.resolvedPath) | _ -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match tcImports.TryFindProviderGeneratedAssemblyByName(ctok, simpleAssemName) with | Some(assembly) -> OkResult([],Choice2Of2 assembly) | None -> @@ -2564,7 +2564,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i // Explanation: This callback is invoked during compilation to resolve assembly references // We don't yet propagate the ctok through these calls (though it looks plausible to do so). let ctok = AssumeCompilationThreadWithoutEvidence () -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match tcImports.TryFindProviderGeneratedAssemblyByName (ctok, aref.Name) with | Some assembly -> Some (Choice2Of2 assembly) | None -> diff --git a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj index 0e8d910cb99..ff1fe0c1176 100644 --- a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj +++ b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj @@ -13,7 +13,6 @@ $(NoWarn);62 fsiAnyCpu 0x0A000000 - EXTENSIONTYPING;$(DefineConstants) COMPILER;$(DefineConstants) FSI_SHADOW_COPY_REFERENCES;$(DefineConstants) FSI_SERVER;$(DefineConstants) diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index f444cca7e52..9d89864908c 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -17,7 +17,7 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -27,7 +27,7 @@ type AssemblyLoader = /// Resolve an Abstract IL assembly reference to a Ccu abstract FindCcuFromAssemblyRef : CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Get a flag indicating if an assembly is a provided assembly, plus the /// table of information recording remappings from type names in the provided assembly to type @@ -100,7 +100,7 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = fakeTyconRef.Deref with _ -> error (Error(FSComp.SR.impReferencedTypeCouldNotBeFoundInAssembly(String.concat "." (Array.append path [| typeName |]), ccu.AssemblyName),m)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING // Validate (once because of caching) match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> @@ -195,7 +195,7 @@ let rec CanImportILType (env:ImportMap) m typ = | ILType.Modified(_,_,ty) -> CanImportILType env m ty | ILType.TypeVar _u16 -> true -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Import a provided type reference as an F# type TyconRef let ImportProvidedNamedType (env:ImportMap) (m:range) (st:Tainted) = @@ -566,7 +566,7 @@ let ImportILAssembly(amap:(unit -> ImportMap),m,auxModuleLoader,sref,sourceDir,f let ccuData : CcuData = { IsFSharp=false UsesFSharp20PlusQuotations=false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING InvalidateEvent=invalidateCcu IsProviderGenerated = false ImportProvidedType = (fun ty -> ImportProvidedType (amap()) m ty) diff --git a/src/fsharp/import.fsi b/src/fsharp/import.fsi index d13328d3360..02415e922f8 100644 --- a/src/fsharp/import.fsi +++ b/src/fsharp/import.fsi @@ -8,7 +8,7 @@ open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping #endif @@ -21,7 +21,7 @@ type AssemblyLoader = /// Resolve an Abstract IL assembly reference to a Ccu abstract FindCcuFromAssemblyRef : CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Get a flag indicating if an assembly is a provided assembly, plus the /// table of information recording remappings from type names in the provided assembly to type /// names in the statically linked, embedded assembly. @@ -60,7 +60,7 @@ val internal ImportILType : ImportMap -> range -> TType list -> ILType -> TType /// Pre-check for ability to import an IL type as an F# type. val internal CanImportILType : ImportMap -> range -> ILType -> bool -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Import a provided type as an F# type. val internal ImportProvidedType : ImportMap -> range -> (* TType list -> *) Tainted -> TType diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 96d8ec9aba8..5ac157c8d42 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -23,7 +23,7 @@ open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Core.Printf -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif @@ -55,14 +55,14 @@ let isExnDeclTy g typ = /// 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 typ = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let typ = (if isAppTy g typ && (tcrefOfAppTy g typ).IsProvided then stripTyEqns g typ else stripTyEqnsAndMeasureEqns g typ) #else let typ = stripTyEqnsAndMeasureEqns g typ #endif match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> let st = info.ProvidedType let superOpt = st.PApplyOption((fun st -> match st.BaseType with null -> None | t -> Some t),m) @@ -125,7 +125,7 @@ let rec GetImmediateInterfacesOfType skipUnref g amap m typ = yield mkAppTy g.system_GenericIEquatable_tcref [typ]] else match metadataOfTy g typ with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> [ for ity in info.ProvidedType.PApplyArray((fun st -> st.GetInterfaces()), "GetInterfaces", m) do yield Import.ImportProvidedType amap m ity ] @@ -398,7 +398,7 @@ type ValRef with // as backing data for MethInfo, PropInfo etc. -#if EXTENSIONTYPING +#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 = @@ -583,7 +583,7 @@ type ParamData = //------------------------------------------------------------------------- // Helper methods associated with type providers -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING type ILFieldInit with /// Compute the ILFieldInit for the given provided constant value for a provided enum type. @@ -862,7 +862,7 @@ type MethInfo = /// Describes a use of a pseudo-method corresponding to the default constructor for a .NET struct type | DefaultStructCtor of TcGlobals * TType -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Describes a use of a method backed by provided metadata | ProvidedMeth of Import.ImportMap * Tainted * ExtensionMethodPriority option * range #endif @@ -876,7 +876,7 @@ type MethInfo = | ILMeth(_g,ilminfo,_) -> ilminfo.ApparentEnclosingType | FSMeth(_g,typ,_,_) -> typ | DefaultStructCtor(_g,typ) -> typ -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,m) -> Import.ImportProvidedType amap m (mi.PApply((fun mi -> mi.DeclaringType),m)) #endif @@ -895,7 +895,7 @@ type MethInfo = match x with | ILMeth _ -> None | FSMeth _ -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth (_, mb, _, m) -> let staticParams = mb.PApplyWithProvider((fun (mb,provider) -> mb.GetStaticParametersForMethod(provider)), range=m) let staticParams = staticParams.PApplyArray(id, "GetStaticParametersForMethod", m) @@ -911,7 +911,7 @@ type MethInfo = match x with | ILMeth(_,_,pri) -> pri | FSMeth(_,_,_,pri) -> pri -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,_,pri,_) -> pri #endif | DefaultStructCtor _ -> None @@ -927,7 +927,7 @@ type MethInfo = match x with | ILMeth(_,y,_) -> "ILMeth: " + y.ILName | FSMeth(_,_,vref,_) -> "FSMeth: " + vref.LogicalName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> "ProvidedMeth: " + mi.PUntaint((fun mi -> mi.Name),m) #endif | DefaultStructCtor _ -> ".ctor" @@ -938,7 +938,7 @@ type MethInfo = match x with | ILMeth(_,y,_) -> y.ILName | FSMeth(_,_,vref,_) -> vref.LogicalName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.Name),m) #endif | DefaultStructCtor _ -> ".ctor" @@ -953,7 +953,7 @@ type MethInfo = member x.HasDirectXmlComment = match x with | FSMeth(g,_,vref,_) -> valRefInThisAssembly g.compilingFslib vref -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> true #endif | _ -> false @@ -972,7 +972,7 @@ type MethInfo = | ILMeth(g,_,_) -> g | FSMeth(g,_,_,_) -> g | DefaultStructCtor (g,_) -> g -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,_,_,_) -> amap.g #endif @@ -986,7 +986,7 @@ type MethInfo = let _,memberMethodTypars,_,_ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (typ,vref) memberMethodTypars | DefaultStructCtor _ -> [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> [] // There will already have been an error if there are generic parameters here. #endif @@ -1001,7 +1001,7 @@ type MethInfo = | ILMeth(_,_,_) -> XmlDoc.Empty | FSMeth(_,_,vref,_) -> vref.XmlDoc | DefaultStructCtor _ -> XmlDoc.Empty -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m)-> XmlDoc (mi.PUntaint((fun mix -> (mix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(mi.TypeProvider.PUntaintNoFailure(id))),m)) #endif @@ -1020,7 +1020,7 @@ type MethInfo = | ILMeth(_,ilminfo,_) -> [ilminfo.NumParams] | FSMeth(g,_,vref,_) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.map List.length | DefaultStructCtor _ -> [0] -#if EXTENSIONTYPING +#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 #endif @@ -1032,7 +1032,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsInstance | FSMeth(_,_,vref,_) -> vref.IsInstanceMember || x.IsCSharpStyleExtensionMember | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> not mi.IsConstructor && not mi.IsStatic),m) #endif @@ -1046,7 +1046,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsProtectedAccessibility | FSMeth _ -> false | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsFamily), m) #endif @@ -1055,7 +1055,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsVirtual | FSMeth(_,_,vref,_) -> vref.IsVirtualMember | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsVirtual), m) #endif @@ -1064,7 +1064,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsConstructor | FSMeth(_g,_,vref,_) -> (vref.MemberInfo.Value.MemberFlags.MemberKind = MemberKind.Constructor) | DefaultStructCtor _ -> true -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsConstructor), m) #endif @@ -1076,7 +1076,7 @@ type MethInfo = | VSome x -> x.IsClassConstructor | _ -> false | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsConstructor && mi.IsStatic), m) // Note: these are never public anyway #endif @@ -1087,7 +1087,7 @@ type MethInfo = isInterfaceTy g x.EnclosingType || vref.MemberInfo.Value.MemberFlags.IsDispatchSlot | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> x.IsVirtual // Note: follow same implementation as ILMeth #endif @@ -1098,7 +1098,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsFinal | FSMeth(_g,_,_vref,_) -> false | DefaultStructCtor _ -> true -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsFinal), m) #endif @@ -1113,7 +1113,7 @@ type MethInfo = | ILMeth(_,ilmeth,_) -> ilmeth.IsAbstract | FSMeth(g,_,vref,_) -> isInterfaceTy g minfo.EnclosingType || vref.IsDispatchSlotMember | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsAbstract), m) #endif @@ -1123,7 +1123,7 @@ type MethInfo = (match x with | ILMeth(_,x,_) -> x.IsNewSlot | FSMeth(_,_,vref,_) -> vref.IsDispatchSlotMember -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsHideBySig), m) // REVIEW: Check this is correct #endif | DefaultStructCtor _ -> false)) @@ -1134,7 +1134,7 @@ type MethInfo = | ILMeth _ -> false | FSMeth(g,_,vref,_) -> vref.IsFSharpExplicitInterfaceImplementation g | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> false #endif @@ -1144,7 +1144,7 @@ type MethInfo = | ILMeth _ -> false | FSMeth(_,_,vref,_) -> vref.IsDefiniteFSharpOverrideMember | DefaultStructCtor _ -> false -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> false #endif @@ -1183,7 +1183,7 @@ type MethInfo = member x.IsFSharpEventPropertyMethod = match x with | FSMeth(g,_,vref,_) -> vref.IsFSharpEventProperty(g) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> false #endif | _ -> false @@ -1216,7 +1216,7 @@ type MethInfo = | ILMeth(_,x1,_), ILMeth(_,x2,_) -> (x1.RawMetadata === x2.RawMetadata) | FSMeth(g,_,vref1,_), FSMeth(_,_,vref2,_) -> valRefEq g vref1 vref2 | DefaultStructCtor(g,ty1), DefaultStructCtor(_,ty2) -> tyconRefEq g (tcrefOfAppTy g ty1) (tcrefOfAppTy g ty2) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi1,_,_),ProvidedMeth(_,mi2,_,_) -> ProvidedMethodBase.TaintedEquals (mi1, mi2) #endif | _ -> false @@ -1229,7 +1229,7 @@ type MethInfo = | 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 EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_,mi,_,_) -> ProvidedMethodInfo.TaintedGetHashCode(mi) #endif @@ -1242,7 +1242,7 @@ type MethInfo = | ILMethInfo(_,typ,Some declaringTyconRef,md,_) -> MethInfo.CreateILExtensionMeth(amap, m, instType inst typ, declaringTyconRef, pri, md) | FSMeth(g,typ,vref,pri) -> FSMeth(g,instType inst typ,vref,pri) | DefaultStructCtor(g,typ) -> DefaultStructCtor(g,instType inst typ) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> match inst with | [] -> x @@ -1259,7 +1259,7 @@ type MethInfo = let _,_,retTy,_ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (typ,vref) retTy |> Option.map (instType inst) | DefaultStructCtor _ -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,m) -> GetCompiledReturnTyOfProvidedMethodInfo amap m mi #endif @@ -1279,7 +1279,7 @@ type MethInfo = let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (typ,vref,minst) paramTypes |> List.mapSquared (fun (ParamNameAndType(_,ty)) -> instType inst ty) | DefaultStructCtor _ -> [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,m) -> // A single group of tupled arguments [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters",m) do @@ -1302,7 +1302,7 @@ type MethInfo = [ typ ] else [] | DefaultStructCtor _ -> [] -#if EXTENSIONTYPING +#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 else [] @@ -1405,7 +1405,7 @@ type MethInfo = | DefaultStructCtor _ -> [[]] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,_) -> // A single group of tupled arguments [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do @@ -1468,7 +1468,7 @@ type MethInfo = let paramType = ImportILTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInst formalMethTyparTys p.Type yield TSlotParam(p.Name, paramType, p.IsIn, p.IsOut, p.IsOptional, []) ] ] formalRetTy, formalParams -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | 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 @@ -1498,7 +1498,7 @@ type MethInfo = items |> ParamNameAndType.InstantiateCurried inst | DefaultStructCtor _ -> [[]] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(amap,mi,_,_) -> // A single set of tupled parameters [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do @@ -1538,7 +1538,7 @@ type MethInfo = memberParentTypars | DefaultStructCtor(g,typ) -> (tcrefOfAppTy g typ).Typars(m) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth (amap,_,_,_) -> (tcrefOfAppTy amap.g x.EnclosingType).Typars(m) #endif @@ -1552,7 +1552,7 @@ type MethInfo = type ILFieldInfo = /// Represents a single use of a field backed by Abstract IL metadata | ILFieldInfo of ILTypeInfo * ILFieldDef // .NET IL fields -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Represents a single use of a field backed by provided metadata | ProvidedField of Import.ImportMap * Tainted * range #endif @@ -1561,7 +1561,7 @@ type ILFieldInfo = member x.EnclosingType = match x with | ILFieldInfo(tinfo,_) -> tinfo.ToType -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(amap,fi,m) -> (Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.DeclaringType),m))) #endif @@ -1569,7 +1569,7 @@ type ILFieldInfo = member x.ILTypeRef = match x with | ILFieldInfo(tinfo,_) -> tinfo.ILTypeRef -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(amap,fi,m) -> (Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.DeclaringType),m))).TypeRef #endif @@ -1580,7 +1580,7 @@ type ILFieldInfo = member x.TypeInst = match x with | ILFieldInfo(tinfo,_) -> tinfo.TypeInst -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField _ -> [] /// GENERIC TYPE PROVIDERS #endif @@ -1588,7 +1588,7 @@ type ILFieldInfo = member x.FieldName = match x with | ILFieldInfo(_,pd) -> pd.Name -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.Name),m) #endif @@ -1596,7 +1596,7 @@ type ILFieldInfo = member x.IsInitOnly = match x with | ILFieldInfo(_,pd) -> pd.IsInitOnly -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsInitOnly),m) #endif @@ -1604,7 +1604,7 @@ type ILFieldInfo = member x.IsValueType = match x with | ILFieldInfo(tinfo,_) -> tinfo.IsValueType -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(amap,_,_) -> isStructTy amap.g x.EnclosingType #endif @@ -1612,7 +1612,7 @@ type ILFieldInfo = member x.IsStatic = match x with | ILFieldInfo(_,pd) -> pd.IsStatic -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsStatic),m) #endif @@ -1620,7 +1620,7 @@ type ILFieldInfo = member x.IsSpecialName = match x with | ILFieldInfo(_,pd) -> pd.IsSpecialName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsSpecialName),m) #endif @@ -1628,7 +1628,7 @@ type ILFieldInfo = member x.LiteralValue = match x with | ILFieldInfo(_,pd) -> if pd.IsLiteral then pd.LiteralValue else None -#if EXTENSIONTYPING +#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))) @@ -1640,7 +1640,7 @@ type ILFieldInfo = member x.ILFieldType = match x with | ILFieldInfo (_,fdef) -> fdef.Type -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(amap,fi,m) -> Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.FieldType),m)) #endif @@ -1648,14 +1648,14 @@ type ILFieldInfo = member x.FieldType(amap,m) = match x with | ILFieldInfo (tinfo,fdef) -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] fdef.Type -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(amap,fi,m) -> Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.FieldType),m)) #endif static member ILFieldInfosUseIdenticalDefinitions x1 x2 = match x1,x2 with | ILFieldInfo(_, x1), ILFieldInfo(_, x2) -> (x1 === x2) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField(_,fi1,_), ProvidedField(_,fi2,_)-> ProvidedFieldInfo.TaintedEquals (fi1, fi2) | _ -> false #endif @@ -1807,7 +1807,7 @@ type PropInfo = | FSProp of TcGlobals * TType * ValRef option * ValRef option /// An F# use of a property backed by Abstract IL metadata | ILProp of TcGlobals * ILPropInfo -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// An F# use of a property backed by provided metadata | ProvidedProp of Import.ImportMap * Tainted * range #endif @@ -1825,7 +1825,7 @@ type PropInfo = match x with | FSProp(g,_,Some vref,_) | FSProp(g,_,_,Some vref) -> valRefInThisAssembly g.compilingFslib vref -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp _ -> true #endif | _ -> false @@ -1836,7 +1836,7 @@ type PropInfo = | ILProp(_,x) -> x.PropertyName | FSProp(_,_,Some vref,_) | FSProp(_,_,_, Some vref) -> vref.PropertyName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.Name),m) #endif | FSProp _ -> failwith "unreachable" @@ -1846,7 +1846,7 @@ type PropInfo = match x with | ILProp(_,x) -> x.HasGetter | FSProp(_,_,x,_) -> Option.isSome x -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.CanRead),m) #endif @@ -1855,7 +1855,7 @@ type PropInfo = match x with | ILProp(_,x) -> x.HasSetter | FSProp(_,_,_,x) -> Option.isSome x -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.CanWrite),m) #endif @@ -1866,7 +1866,7 @@ type PropInfo = match x with | ILProp(_,x) -> x.ILTypeInfo.ToType | FSProp(_,typ,_,_) -> typ -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(amap,pi,m) -> Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.DeclaringType),m)) #endif @@ -1883,7 +1883,7 @@ type PropInfo = | FSProp(_,_,Some vref,_) | FSProp(_,_,_, Some vref) -> vref.IsVirtualMember | FSProp _-> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsVirtual), m) @@ -1896,7 +1896,7 @@ type PropInfo = | FSProp(_,_,Some vref,_) | FSProp(_,_,_, Some vref) -> vref.IsDispatchSlotMember | FSProp(_,_,None,None) -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsHideBySig), m) @@ -1912,7 +1912,7 @@ type PropInfo = | FSProp(g,typ,_, Some vref) -> isInterfaceTy g typ || (vref.MemberInfo.Value.MemberFlags.IsDispatchSlot) | FSProp _ -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsVirtual), m) @@ -1925,7 +1925,7 @@ type PropInfo = | FSProp(_,_,Some vref,_) | FSProp(_,_,_, Some vref) -> not vref.IsInstanceMember | FSProp(_,_,None,None) -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> (ArbitraryMethodInfoOfPropertyInfo pi m).PUntaint((fun mi -> mi.IsStatic), m) #endif @@ -1961,7 +1961,7 @@ type PropInfo = arginfos.Length = 1 && arginfos.Head.Length >= 2 | FSProp(_,_,None,None) -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.GetIndexParameters().Length), m)>0 #endif @@ -1970,7 +1970,7 @@ type PropInfo = member x.IsFSharpEventProperty = match x with | FSProp(g,_,Some vref,None) -> vref.IsFSharpEventProperty(g) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp _ -> false #endif | _ -> false @@ -1998,7 +1998,7 @@ type PropInfo = | FSProp(_,_,Some vref,_) | FSProp(_,_,_, Some vref) -> vref.XmlDoc | FSProp(_,_,None,None) -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> XmlDoc (pi.PUntaint((fun pix -> (pix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(pi.TypeProvider.PUntaintNoFailure(id))), m)) #endif @@ -2008,7 +2008,7 @@ type PropInfo = match x with | ILProp(g,_) -> g | FSProp(g,_,_,_) -> g -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(amap,_,_) -> amap.g #endif @@ -2028,7 +2028,7 @@ type PropInfo = ReturnTypeOfPropertyVal g vref.Deref |> instType inst | FSProp _ -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,m) -> Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.PropertyType),m)) #endif @@ -2045,7 +2045,7 @@ type PropInfo = let inst = GetInstantiationForPropertyVal g (typ,vref) ArgInfosOfPropertyVal g vref.Deref |> List.map (ParamNameAndType.FromArgInfo >> ParamNameAndType.Instantiate inst) | FSProp _ -> failwith "unreachable" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | 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) @@ -2067,7 +2067,7 @@ type PropInfo = match x with | ILProp(g,x) -> ILMeth(g,x.GetterMethod(g),None) | FSProp(g,typ,Some vref,_) -> FSMeth(g,typ,vref,None) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(amap,pi,m) -> let meth = GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetGetMethod()) FSComp.SR.etPropertyCanReadButHasNoGetter ProvidedMeth(amap, meth, None, m) @@ -2080,7 +2080,7 @@ type PropInfo = match x with | ILProp(g,x) -> ILMeth(g,x.SetterMethod(g),None) | FSProp(g,typ,_,Some vref) -> FSMeth(g,typ,vref,None) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(amap,pi,m) -> let meth = GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetSetMethod()) FSComp.SR.etPropertyCanWriteButHasNoSetter ProvidedMeth(amap, meth, None, m) @@ -2099,7 +2099,7 @@ type PropInfo = | ILProp(_, x1), ILProp(_, x2) -> (x1.RawMetadata === x2.RawMetadata) | FSProp(g, _, vrefa1, vrefb1), FSProp(_, _, vrefa2, vrefb2) -> (optVrefEq g (vrefa1, vrefa2)) && (optVrefEq g (vrefb1, vrefb2)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi1,_), ProvidedProp(_,pi2,_) -> ProvidedPropertyInfo.TaintedEquals (pi1, pi2) #endif | _ -> false @@ -2112,7 +2112,7 @@ type PropInfo = // Hash on option*option let vth = (vrefOpt1 |> Option.map (fun vr -> vr.LogicalName), (vrefOpt2 |> Option.map (fun vr -> vr.LogicalName))) hash vth -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_,pi,_) -> ProvidedPropertyInfo.TaintedGetHashCode(pi) #endif @@ -2191,7 +2191,7 @@ type EventInfo = | FSEvent of TcGlobals * PropInfo * ValRef * ValRef /// An F# use of an event backed by .NET metadata | ILEvent of TcGlobals * ILEventInfo -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// An F# use of an event backed by provided metadata | ProvidedEvent of Import.ImportMap * Tainted * range #endif @@ -2203,7 +2203,7 @@ type EventInfo = match x with | ILEvent(_,e) -> e.ILTypeInfo.ToType | FSEvent (_,p,_,_) -> p.EnclosingType -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (amap,ei,m) -> Import.ImportProvidedType amap m (ei.PApply((fun ei -> ei.DeclaringType),m)) #endif @@ -2211,7 +2211,7 @@ type EventInfo = member x.HasDirectXmlComment = match x with | FSEvent (_,p,_,_) -> p.HasDirectXmlComment -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent _ -> true #endif | _ -> false @@ -2221,7 +2221,7 @@ type EventInfo = match x with | ILEvent _ -> XmlDoc.Empty | FSEvent (_,p,_,_) -> p.XmlDoc -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei,m) -> XmlDoc (ei.PUntaint((fun eix -> (eix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(ei.TypeProvider.PUntaintNoFailure(id))), m)) #endif @@ -2231,7 +2231,7 @@ type EventInfo = match x with | ILEvent(_,e) -> e.Name | FSEvent (_,p,_,_) -> p.PropertyName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei,m) -> ei.PUntaint((fun ei -> ei.Name), m) #endif @@ -2240,7 +2240,7 @@ type EventInfo = match x with | ILEvent(g,e) -> e.IsStatic(g) | FSEvent (_,p,_,_) -> p.IsStatic -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei,m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetAddMethod()) FSComp.SR.etEventNoAdd meth.PUntaint((fun mi -> mi.IsStatic), m) @@ -2251,7 +2251,7 @@ type EventInfo = match x with | ILEvent(g,_) -> g | FSEvent(g,_,_,_) -> g -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (amap,_,_) -> amap.g #endif @@ -2265,7 +2265,7 @@ type EventInfo = match x with | ILEvent(g,e) -> ILMeth(g,e.AddMethod(g),None) | FSEvent(g,p,addValRef,_) -> FSMeth(g,p.EnclosingType,addValRef,None) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (amap,ei,m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetAddMethod()) FSComp.SR.etEventNoAdd ProvidedMeth(amap, meth, None, m) @@ -2276,7 +2276,7 @@ type EventInfo = match x with | ILEvent(g,e) -> ILMeth(g,e.RemoveMethod(g),None) | FSEvent(g,p,_,removeValRef) -> FSMeth(g,p.EnclosingType,removeValRef,None) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (amap,ei,m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetRemoveMethod()) FSComp.SR.etEventNoRemove ProvidedMeth(amap, meth, None, m) @@ -2299,7 +2299,7 @@ type EventInfo = | FSEvent(g,p,_,_) -> FindDelegateTypeOfPropertyEvent g amap x.EventName m (p.GetPropertyType(amap,m)) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei,_) -> Import.ImportProvidedType amap m (ei.PApply((fun ei -> ei.EventHandlerType), m)) #endif @@ -2311,7 +2311,7 @@ type EventInfo = | FSEvent(g, pi1, vrefa1, vrefb1), FSEvent(_, pi2, vrefa2, vrefb2) -> PropInfo.PropInfosUseIdenticalDefinitions pi1 pi2 && valRefEq g vrefa1 vrefa2 && valRefEq g vrefb1 vrefb2 | ILEvent(_, x1), ILEvent(_, x2) -> (x1.RawMetadata === x2.RawMetadata) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei1,_), ProvidedEvent (_,ei2,_) -> ProvidedEventInfo.TaintedEquals (ei1, ei2) #endif | _ -> false @@ -2321,7 +2321,7 @@ type EventInfo = match ei with | ILEvent(_, x1) -> hash x1.RawMetadata.Name | FSEvent(_, pi, vref1, vref2) -> hash ( pi.ComputeHashCode(), vref1.LogicalName, vref2.LogicalName) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_,ei,_) -> ProvidedEventInfo.TaintedGetHashCode(ei) #endif diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index ffb3f013be8..7b01319772e 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -341,14 +341,14 @@ module internal SymbolHelpers = let rangeOfPropInfo preferFlag (pinfo:PropInfo) = match pinfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp(_, pi, _) -> ComputeDefinitionLocationOfProvidedItem pi #endif | _ -> pinfo.ArbitraryValRef |> Option.map (rangeOfValRef preferFlag) let rangeOfMethInfo (g:TcGlobals) preferFlag (minfo:MethInfo) = match minfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth(_, mi, _, _) -> ComputeDefinitionLocationOfProvidedItem mi #endif | DefaultStructCtor(_, AppTy g (tcref, _)) -> Some(rangeOfEntityRef preferFlag tcref) @@ -356,7 +356,7 @@ module internal SymbolHelpers = let rangeOfEventInfo preferFlag (einfo:EventInfo) = match einfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent (_, ei, _) -> ComputeDefinitionLocationOfProvidedItem ei #endif | _ -> einfo.ArbitraryValRef |> Option.map (rangeOfValRef preferFlag) @@ -402,7 +402,7 @@ module internal SymbolHelpers = // Provided type definitions do not have a useful F# CCU for the purposes of goto-definition. let computeCcuOfTyconRef (tcref:TyconRef) = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if tcref.IsProvided then None else #endif ccuOfTyconRef tcref @@ -561,7 +561,7 @@ module internal SymbolHelpers = Some (ccuFileName, "M:"+actualTypeName+"."+normalizedName+genArity+XmlDocArgsEnc g (formalTypars, fmtps) args) | DefaultStructCtor _ -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> None #endif @@ -577,7 +577,7 @@ module internal SymbolHelpers = let GetXmlDocSigOfProp infoReader m pinfo = match pinfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp _ -> None // No signature is possible. If an xml comment existed it would have been returned by PropInfo.XmlDoc in infos.fs #endif | FSProp (g, typ, _, _) as fspinfo -> @@ -1230,7 +1230,7 @@ module internal SymbolHelpers = | _ -> FSharpStructuredToolTipElement.None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Determine if an item is a provided type let (|ItemIsProvidedType|_|) g item = @@ -1306,7 +1306,7 @@ module internal SymbolHelpers = sprintf "%s.%s%s" typeString minfo.RawMetadata.Name paramString |> Some | DefaultStructCtor _ -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _ -> None #endif @@ -1337,7 +1337,7 @@ module internal SymbolHelpers = match finfo with | ILFieldInfo(tinfo, fdef) -> (tinfo.TyconRef |> ticksAndArgCountTextOfTyconRef)+"."+fdef.Name |> Some -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedField _ -> None #endif | Item.Types(_, ((AppTy g (tcref, _)) :: _)) @@ -1363,7 +1363,7 @@ module internal SymbolHelpers = // namespaces from type providers need to be handled separately because they don't have compiled representation // otherwise we'll fail at tast.fs match modref.Deref.TypeReprInfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> modref.CompilationPathOpt |> Option.bind (fun path -> @@ -1391,7 +1391,7 @@ module internal SymbolHelpers = let tcref = tinfo.TyconRef (tcref |> ticksAndArgCountTextOfTyconRef)+"."+pdef.Name |> Some | FSProp _ -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedProp _ -> None #endif | Item.Property(_, []) -> None // Pathological case of the above @@ -1410,7 +1410,7 @@ module internal SymbolHelpers = | Parent tcref -> (tcref |> ticksAndArgCountTextOfTyconRef)+"."+vref.PropertyName|> Some | ParentNone -> None | None -> None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedEvent _ -> None #endif | Item.CtorGroup(_, minfos) -> @@ -1426,7 +1426,7 @@ module internal SymbolHelpers = | (DefaultStructCtor (g, typ) :: _) -> let tcref = tcrefOfAppTy g typ (ticksAndArgCountTextOfTyconRef tcref) + ".#ctor" |> Some -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedMeth _::_ -> None #endif | Item.CustomOperation (_, _, Some minfo) -> getKeywordForMethInfo minfo @@ -1466,7 +1466,7 @@ module internal SymbolHelpers = | Item.Property(_, pinfos) -> let pinfo = List.head pinfos if pinfo.IsIndexer then [item] else [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ItemIsWithStaticArguments m g _ -> [item] // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them #endif | Item.CustomOperation(_name, _helpText, _minfo) -> [item] diff --git a/src/fsharp/symbols/SymbolHelpers.fsi b/src/fsharp/symbols/SymbolHelpers.fsi index 216fecacb8e..1d1762a7f4f 100755 --- a/src/fsharp/symbols/SymbolHelpers.fsi +++ b/src/fsharp/symbols/SymbolHelpers.fsi @@ -212,7 +212,7 @@ module internal SymbolHelpers = val IsAttribute : InfoReader -> Item -> bool val IsExplicitlySuppressed : TcGlobals -> Item -> bool val FlattenItems : TcGlobals -> range -> Item -> Item list -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING val (|ItemIsProvidedType|_|) : TcGlobals -> Item -> TyconRef option val (|ItemIsWithStaticArguments|_|): range -> TcGlobals -> Item -> Tainted[] option val (|ItemIsProvidedTypeWithStaticArguments|_|): range -> TcGlobals -> Item -> Tainted[] option diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index aa4be5a32f8..8ae4b90bf9d 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -89,7 +89,7 @@ module Symbol = if e.IsEnum || e.IsValueType || hasAttribute e.Attributes then Some() else None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let (|Class|_|) (original: FSharpEntity, abbreviated: FSharpEntity, _) = if abbreviated.IsClass && (not abbreviated.IsStaticInstantiation || original.IsFSharpAbbreviation) then Some() @@ -114,7 +114,7 @@ module Symbol = || (e.IsFSharp && e.IsOpaque && not e.IsFSharpModule && not e.IsNamespace) then Some() else None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let (|ProvidedType|_|) (e: FSharpEntity) = if (e.IsProvided || e.IsProvidedAndErased || e.IsProvidedAndGenerated) && e.CompiledName = e.DisplayName then Some() @@ -126,7 +126,7 @@ module Symbol = let (|FSharpModule|_|) (entity: FSharpEntity) = if entity.IsFSharpModule then Some() else None let (|Namespace|_|) (entity: FSharpEntity) = if entity.IsNamespace then Some() else None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let (|ProvidedAndErasedType|_|) (entity: FSharpEntity) = if entity.IsProvidedAndErased then Some() else None #endif let (|Enum|_|) (entity: FSharpEntity) = if entity.IsEnum then Some() else None diff --git a/src/fsharp/symbols/SymbolPatterns.fsi b/src/fsharp/symbols/SymbolPatterns.fsi index e2c00c80ee7..4499e3098c8 100644 --- a/src/fsharp/symbols/SymbolPatterns.fsi +++ b/src/fsharp/symbols/SymbolPatterns.fsi @@ -31,14 +31,14 @@ module internal Symbol = val (|Interface|_|) : FSharpEntity -> unit option val (|AbstractClass|_|) : FSharpEntity -> unit option val (|FSharpType|_|) : FSharpEntity -> unit option -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING val (|ProvidedType|_|) : FSharpEntity -> unit option #endif val (|ByRef|_|) : FSharpEntity -> unit option val (|Array|_|) : FSharpEntity -> unit option val (|FSharpModule|_|) : FSharpEntity -> unit option val (|Namespace|_|) : FSharpEntity -> unit option -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING val (|ProvidedAndErasedType|_|) : FSharpEntity -> unit option #endif val (|Enum|_|) : FSharpEntity -> unit option diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index dd6c04451b4..20ec8c13b32 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -128,7 +128,7 @@ module Impl = /// Convert an IL type definition accessibility into an F# accessibility let getApproxFSharpAccessibilityOfEntity (entity: EntityRef) = match metadataOfTycon entity.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata _info -> // This is an approximation - for generative type providers some type definitions can be private. taccessPublic @@ -288,7 +288,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member x.QualifiedName = checkIsResolved() let fail() = invalidOp (sprintf "the type '%s' does not have a qualified name" x.LogicalName) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if entity.IsTypeAbbrev || entity.IsProvidedErasedTycon || entity.IsNamespace then fail() #else if entity.IsTypeAbbrev || entity.IsNamespace then fail() @@ -305,7 +305,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member x.TryFullName = if isUnresolved() then None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING elif entity.IsTypeAbbrev || entity.IsProvidedErasedTycon then None #else elif entity.IsTypeAbbrev then None @@ -346,7 +346,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member __.ArrayRank = checkIsResolved() rankOfArrayTyconRef cenv.g entity -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member __.IsProvided = isResolved() && entity.IsProvided @@ -366,7 +366,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member __.IsClass = isResolved() && match metadataOfTycon entity.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsClass #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Class) @@ -387,7 +387,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member __.IsDelegate = isResolved() && match metadataOfTycon entity.Deref with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsDelegate () #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> (td.tdKind = ILTypeDefKind.Delegate) @@ -530,7 +530,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member x.StaticParameters = match entity.TypeReprInfo with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint info -> let m = x.DeclarationLocation let typeBeforeArguments = info.ProvidedType @@ -2055,7 +2055,7 @@ and FSharpAttribute(cenv: cenv, attrib: AttribInfo) = override __.ToString() = if entityIsUnresolved attrib.TyconRef then "attribute ???" else "attribute " + attrib.TyconRef.CompiledName + "(...)" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING and FSharpStaticParameter(cenv, sp: Tainted< ExtensionTyping.ProvidedParameterInfo >, m) = inherit FSharpSymbol(cenv, (fun () -> @@ -2178,7 +2178,7 @@ and FSharpAssembly internal (cenv, ccu: CcuThunk) = member __.CodeLocation = ccu.SourceCodeDirectory member __.FileName = ccu.FileName member __.SimpleName = ccu.AssemblyName - #if EXTENSIONTYPING + #if !NO_EXTENSIONTYPING member __.IsProviderGenerated = ccu.IsProviderGenerated #endif member __.Contents = FSharpAssemblySignature(cenv, ccu) diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index e01c3d99422..2cfd8a2f47e 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -124,7 +124,7 @@ and [] internal FSharpAssembly = /// The simple name for the assembly member SimpleName : string -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Indicates if the assembly was generated by a type provider and is due for static linking member IsProviderGenerated : bool #endif @@ -208,7 +208,7 @@ and [] internal FSharpEntity = /// Get the rank of an array type member ArrayRank : int -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Indicates if the entity is a 'fake' symbol related to a static instantiation of a type provider member IsStaticInstantiation : bool @@ -226,7 +226,7 @@ and [] internal FSharpEntity = /// Get the generic parameters, possibly including unit-of-measure parameters member GenericParameters: IList -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Get the static parameters for a provided type member StaticParameters: IList #endif @@ -543,7 +543,7 @@ and [] internal FSharpGenericParameter = member Constraints: IList -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// A subtype of FSharpSymbol that represents a static parameter to an F# type provider #if COMPILER_PUBLIC_API and [] FSharpStaticParameter = diff --git a/src/fsharp/tainted.fs b/src/fsharp/tainted.fs index 74ee1836481..5d43f463900 100644 --- a/src/fsharp/tainted.fs +++ b/src/fsharp/tainted.fs @@ -2,7 +2,7 @@ namespace Microsoft.FSharp.Compiler -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open System open Microsoft.FSharp.Compiler.Range diff --git a/src/fsharp/tainted.fsi b/src/fsharp/tainted.fsi index aaec679bb0d..228efbf606f 100644 --- a/src/fsharp/tainted.fsi +++ b/src/fsharp/tainted.fsi @@ -2,7 +2,7 @@ namespace Microsoft.FSharp.Compiler -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open System diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 26a4c1178d8..8e5ba69dcd7 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -26,7 +26,7 @@ open Microsoft.FSharp.Compiler.QuotationPickler open Microsoft.FSharp.Core.Printf open Microsoft.FSharp.Compiler.Rational -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif @@ -472,7 +472,7 @@ let getNameOfScopeRef sref = | ILScopeRef.Assembly aref -> aref.Name -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING let ComputeDefinitionLocationOfProvidedItem (p : Tainted<#IProvidedCustomAttributeProvider>) = let attrs = p.PUntaintNoFailure(fun x -> x.GetDefinitionLocationAttribute(p.TypeProvider.PUntaintNoFailure(id))) match attrs with @@ -590,7 +590,7 @@ type Entity = /// The display name of the namespace, module or type, e.g. List instead of List`1, including static parameters if any member x.DisplayNameWithStaticParameters = x.GetDisplayName(true, false) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member x.IsStaticInstantiationTycon = x.IsProvidedErasedTycon && let _nm,args = PrettyNaming.demangleProvidedTypeName x.LogicalName @@ -609,7 +609,7 @@ type Entity = else nm -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if x.IsProvidedErasedTycon then let nm,args = PrettyNaming.demangleProvidedTypeName nm if withStaticParameters && args.Length > 0 then @@ -626,7 +626,7 @@ type Entity = /// The code location where the module, namespace or type is defined. member x.Range = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> match ComputeDefinitionLocationOfProvidedItem info.ProvidedType with @@ -663,7 +663,7 @@ type Entity = /// or comes from another F# assembly then it does not (because the documentation will get read from /// an XML file). member x.XmlDoc = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> XmlDoc (info.ProvidedType.PUntaintNoFailure(fun st -> (st :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(info.ProvidedType.TypeProvider.PUntaintNoFailure(id)))) | _ -> @@ -738,7 +738,7 @@ type Entity = /// Indicates if the entity is an F# module definition member x.IsModule = x.IsModuleOrNamespace && (match x.ModuleOrNamespaceType.ModuleOrNamespaceKind with Namespace -> false | _ -> true) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Indicates if the entity is a provided type or namespace definition member x.IsProvided = @@ -769,7 +769,7 @@ type Entity = /// Indicates if the entity is erased, either a measure definition, or an erased provided type definition member x.IsErased = x.IsMeasureableReprTycon -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING || x.IsProvidedErasedTycon #endif @@ -957,7 +957,7 @@ type Entity = /// Indicates if this is an enum type definition member x.IsEnumTycon = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> info.IsEnum | TProvidedNamespaceExtensionPoint _ -> false @@ -986,7 +986,7 @@ type Entity = /// Indicates if this is a struct or enum type definition , i.e. a value type definition member x.IsStructOrEnumTycon = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> info.IsStructOrEnum | TProvidedNamespaceExtensionPoint _ -> false @@ -1044,7 +1044,7 @@ type Entity = /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with // We should never be computing this property for erased types | TProvidedTypeExtensionPoint info when info.IsErased -> @@ -1220,7 +1220,7 @@ and /// Indicates the type is parameterized on a measure (e.g. float<_>) but erases to some other type (e.g. float) | TMeasureableRepr of TType -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// TProvidedTypeExtensionPoint /// /// Indicates the representation information for a provided type. @@ -1247,7 +1247,7 @@ and /// TILObjectReprData(scope, nesting, definition) TILObjectReprData = TILObjectReprData of ILScopeRef * ILTypeDef list * ILTypeDef -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING and [] @@ -1596,7 +1596,7 @@ and modulesByDemangledNameCache := None allEntitiesByMangledNameCache := None -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Mutation used in hosting scenarios to hold the hosted types in this module or namespace member mtyp.AddProvidedTypeEntity(entity:Entity) = entities <- QueueList.appendOne entities entity @@ -1734,7 +1734,7 @@ and Construct = static member NewEmptyModuleOrNamespaceType mkind = Construct.NewModuleOrNamespaceType mkind [] [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING static member NewProvidedTyconRepr(resolutionEnvironment,st:Tainted,importProvidedType,isSuppressRelocate,m) = @@ -2666,13 +2666,13 @@ and NonLocalEntityRef = let next = entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryFind(path.[i]) match next with | Some res -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), res) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | None -> NonLocalEntityRef.TryDerefEntityPathViaProvidedType(ccu, path, i, entity) #else | None -> VNone #endif -#if EXTENSIONTYPING +#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) = // Errors during linking are not necessarily given good ranges. This has always been the case in F# 2.0, but also applies to @@ -2998,7 +2998,7 @@ and /// Get a blob of data indicating how this type is nested inside other namespaces, modules and types. member x.CompilationPathOpt = x.Deref.CompilationPathOpt -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Indicates if the entity is a provided namespace fragment member x.IsProvided = x.Deref.IsProvided @@ -3596,7 +3596,7 @@ and /// Indicates that this DLL was compiled using the F# compiler and has F# metadata IsFSharp: bool -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Is the CCu an assembly injected by a type provider IsProviderGenerated: bool @@ -3687,7 +3687,7 @@ and CcuThunk = /// Holds the filename for the DLL, if any member ccu.FileName = ccu.Deref.FileName -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Is the CCu an EST injected assembly member ccu.IsProviderGenerated = ccu.Deref.IsProviderGenerated @@ -4672,7 +4672,7 @@ let tyconRefUsesLocalXmlDoc compilingFslib (x: TyconRef) = match x with | ERefLocal _ -> true | ERefNonLocal _ -> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint _ -> true | _ -> diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index 01bfd8d0188..5b429b2e708 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -1292,7 +1292,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput disposeCleanupItem() let! tcImports = TcImports.BuildNonFrameworkTcImports(ctok, tcConfigP, tcGlobals, frameworkTcImports, nonFrameworkResolutions, unresolvedReferences) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING tcImports.GetCcusExcludingBase() |> Seq.iter (fun ccu -> // When a CCU reports an invalidation, merge them together and just report a // general "imports invalidated". This triggers a rebuild. @@ -1555,7 +1555,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member __.ImportedCcusInvalidated = importsInvalidated.Publish member __.AllDependenciesDeprecated = allDependencies -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING member __.ThereAreLiveTypeProviders = let liveTPs = match cleanupItem with diff --git a/src/fsharp/vs/IncrementalBuild.fsi b/src/fsharp/vs/IncrementalBuild.fsi index e29f3408c6b..e664cadc78b 100755 --- a/src/fsharp/vs/IncrementalBuild.fsi +++ b/src/fsharp/vs/IncrementalBuild.fsi @@ -100,7 +100,7 @@ type internal IncrementalBuilder = /// The list of files the build depends on member AllDependenciesDeprecated : string[] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Whether there are any 'live' type providers that may need a refresh when a project is Cleaned member ThereAreLiveTypeProviders : bool #endif diff --git a/src/fsharp/vs/ServiceAssemblyContent.fs b/src/fsharp/vs/ServiceAssemblyContent.fs index 38a29545c5c..56fae895c6b 100644 --- a/src/fsharp/vs/ServiceAssemblyContent.fs +++ b/src/fsharp/vs/ServiceAssemblyContent.fs @@ -241,7 +241,7 @@ module AssemblyContentProvider = let rec private traverseEntity contentType (parent: Parent) (entity: FSharpEntity) = seq { -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if not entity.IsProvided then #endif match contentType, entity.Accessibility.IsPublic with @@ -317,7 +317,7 @@ module AssemblyContentProvider = // on-demand. However a more compete review may be warranted. use _ignoreAllDiagnostics = new ErrorScope() -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING match assemblies |> List.filter (fun x -> not x.IsProviderGenerated), fileName with #else match assemblies, fileName with diff --git a/src/fsharp/vs/ServiceDeclarationLists.fs b/src/fsharp/vs/ServiceDeclarationLists.fs index a36dc3ce69a..1a9a90c83c7 100644 --- a/src/fsharp/vs/ServiceDeclarationLists.fs +++ b/src/fsharp/vs/ServiceDeclarationLists.fs @@ -176,7 +176,7 @@ module internal DescriptionListsImpl = prettyTyparInst, parameters, prettyRetTyL, prettyConstraintsL -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING /// Get the set of static parameters associated with an item let StaticParamsOfItem (infoReader:InfoReader) m denv item = @@ -382,7 +382,7 @@ module internal DescriptionListsImpl = | ILTypeDefKind.Delegate -> FSharpGlyph.Delegate | TAsmRepr _ -> FSharpGlyph.Typedef | TMeasureableRepr _-> FSharpGlyph.Typedef -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint _-> FSharpGlyph.Typedef | TProvidedNamespaceExtensionPoint _-> FSharpGlyph.Typedef #endif @@ -470,7 +470,7 @@ module internal DescriptionListsImpl = | Item.Property(_,pinfos) -> let pinfo = List.head pinfos if pinfo.IsIndexer then [item] else [] -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | SymbolHelpers.ItemIsWithStaticArguments m g _ -> // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them [item] @@ -796,7 +796,7 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] ) let hasStaticParameters = match flatItem with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | SymbolHelpers.ItemIsProvidedTypeWithStaticArguments m g _ -> false #endif | _ -> true @@ -808,7 +808,7 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] ) parameters = (prettyParams |> Array.ofList), hasParameters = hasStaticParameters, hasParamArrayArg = hasParamArrayArg, -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING staticParameters = StaticParamsOfItem infoReader m denv flatItem #else staticParameters = [| |] diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index a49e0cf0cdb..63df7f33061 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -1183,7 +1183,7 @@ type TypeCheckInfo | None -> let fail defaultReason = match item.Item with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | SymbolHelpers.ItemIsProvidedType g (tcref) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedType(tcref.DisplayName)) | Item.CtorGroup(name, ProvidedMeth(_)::_) | Item.MethodGroup(name, ProvidedMeth(_)::_, _) @@ -1448,7 +1448,7 @@ module internal Parser = errorCount <- errorCount + 1 match exn with -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING | { Exception = (:? TypeProviderError as tpe) } -> tpe.Iter(fun e -> report { exn with Exception = e }) #endif | e -> report e diff --git a/tests/service/Common.fs b/tests/service/Common.fs index ef3049110e6..8b76fa107c7 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -236,7 +236,7 @@ let attribsOfSymbol (s:FSharpSymbol) = if v.IsFSharpUnion then yield "union" if v.IsInterface then yield "interface" if v.IsMeasure then yield "measure" -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING if v.IsProvided then yield "provided" if v.IsStaticInstantiation then yield "staticinst" if v.IsProvidedAndErased then yield "erased" diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index ed366d2d151..bf955c5aa63 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -528,7 +528,7 @@ let bool2 = false let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) //<@ let x = Some(3) in x.IsSome @> -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING [] let ``Test Declarations project1`` () = let wholeProjectResults = exprChecker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 1a345c4a76b..e4dea637cb0 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -109,7 +109,7 @@ let ``Test project1 whole project errors`` () = 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 EXTENSIONTYPING + #if !NO_EXTENSIONTYPING seq { if not entity.IsProvided && entity.Accessibility.IsPublic then #else seq { if entity.Accessibility.IsPublic then @@ -127,7 +127,7 @@ let ``Test Project1 should have protected FullName and TryFullName return same r 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) = - #if EXTENSIONTYPING + #if !NO_EXTENSIONTYPING seq { if not entity.IsProvided && entity.Accessibility.IsPublic then #else seq{ @@ -531,7 +531,7 @@ let ``Test project1 all uses of all symbols`` () = set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty (set expected = set allUsesOfAllSymbols) |> shouldEqual true -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING [] let ``Test file explicit parse symbols`` () = @@ -3950,7 +3950,7 @@ type Use() = let fileNames = [fileName1] let args = mkProjectCommandLineArgs (dllName, fileNames) let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) -#if EXTENSIONTYPING +#if !NO_EXTENSIONTYPING [] let ``Test project28 all symbols in signature`` () = let wholeProjectResults = checker.ParseAndCheckProject(Project28.options) |> Async.RunSynchronously @@ -3960,7 +3960,7 @@ let ``Test project28 all symbols in signature`` () = |> Seq.map (fun s -> let typeName = s.GetType().Name match s with - #if EXTENSIONTYPING + #if !NO_EXTENSIONTYPING | :? FSharpEntity as fse -> typeName, fse.DisplayName, fse.XmlDocSig #endif | :? FSharpField as fsf -> typeName, fsf.DisplayName, fsf.XmlDocSig @@ -3969,7 +3969,7 @@ let ``Test project28 all symbols in signature`` () = | :? FSharpActivePatternCase as ap -> typeName, ap.DisplayName, ap.XmlDocSig | :? FSharpGenericParameter as fsg -> typeName, fsg.DisplayName, "" | :? FSharpParameter as fsp -> typeName, fsp.DisplayName, "" - #if EXTENSIONTYPING + #if !NO_EXTENSIONTYPING | :? FSharpStaticParameter as fss -> typeName, fss.DisplayName, "" #endif | _ -> typeName, s.DisplayName, "unknown") diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index 177beb3bbd2..6875fb61864 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -17,7 +17,6 @@ 58;75 x86 v4.6 - EXTENSIONTYPING;$(DefineConstants) NO_PROJECTCRACKER;$(DefineConstants) From 9a38176ebd6ecd5cc8ea404958b0548cd7d2f6b5 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Wed, 8 Nov 2017 11:22:17 -0800 Subject: [PATCH 109/150] Fix build by removing PCL projects from the solution file (#3913) --- VisualFSharp.sln | 62 +----------------------------------------------- 1 file changed, 1 insertion(+), 61 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index 90a1a3a4e0a..0e584f0c9fa 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27005.2 +VisualStudioVersion = 15.0.27102.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Private", "src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject @@ -96,14 +96,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleProject", "vsintegra EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryProject", "vsintegration\ProjectTemplates\LibraryProject\LibraryProject.csproj", "{01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetCore78Project", "vsintegration\ProjectTemplates\NetCore78Project\NetCore78Project.csproj", "{1A8DBF70-4178-4AE3-AF5F-39DDD5692210}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetCore259Project", "vsintegration\ProjectTemplates\NetCore259Project\NetCore259Project.csproj", "{D9D95330-3626-4199-B7AF-17B8E4AF6D87}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetCoreProject", "vsintegration\ProjectTemplates\NetCoreProject\NetCoreProject.csproj", "{5B739CF3-1116-4EB4-B598-6C16BEA81CE5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortableLibraryProject", "vsintegration\ProjectTemplates\PortableLibraryProject\PortableLibraryProject.csproj", "{DB374A0C-7560-479F-9B21-D37C81F7624F}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TutorialProject", "vsintegration\ProjectTemplates\TutorialProject\TutorialProject.csproj", "{2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ItemTemplates", "ItemTemplates", "{F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}" @@ -564,54 +556,6 @@ Global {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|Any CPU.Build.0 = Release|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|x86.ActiveCfg = Release|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|x86.Build.0 = Release|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|x86.ActiveCfg = Debug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|x86.Build.0 = Debug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Proto|Any CPU.Build.0 = Proto|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Proto|x86.ActiveCfg = Proto|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Proto|x86.Build.0 = Proto|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|Any CPU.Build.0 = Release|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|x86.ActiveCfg = Release|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|x86.Build.0 = Release|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|x86.ActiveCfg = Debug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|x86.Build.0 = Debug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Proto|Any CPU.Build.0 = Proto|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Proto|x86.ActiveCfg = Proto|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Proto|x86.Build.0 = Proto|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|Any CPU.Build.0 = Release|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|x86.ActiveCfg = Release|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|x86.Build.0 = Release|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|x86.ActiveCfg = Debug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|x86.Build.0 = Debug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Proto|Any CPU.Build.0 = Proto|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Proto|x86.ActiveCfg = Proto|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Proto|x86.Build.0 = Proto|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|Any CPU.Build.0 = Release|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|x86.ActiveCfg = Release|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|x86.Build.0 = Release|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|x86.ActiveCfg = Debug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|x86.Build.0 = Debug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Proto|Any CPU.Build.0 = Proto|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Proto|x86.ActiveCfg = Proto|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Proto|x86.Build.0 = Proto|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|Any CPU.Build.0 = Release|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|x86.ActiveCfg = Release|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|x86.Build.0 = Release|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -858,10 +802,6 @@ Global {F7876C9B-FB6A-4EFB-B058-D6967DB75FB2} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} {604F0DAA-2D33-48DD-B162-EDF0B672803D} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} - {D9D95330-3626-4199-B7AF-17B8E4AF6D87} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} - {DB374A0C-7560-479F-9B21-D37C81F7624F} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} {6BA13AA4-C25F-480F-856B-8E8000299A72} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} From 72a14e1cf17571825d5d1655b0cc2a523fac5609 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 8 Nov 2017 17:26:34 -0800 Subject: [PATCH 110/150] Fixes --- Current master does not work on 15.4 (#3903) * Add binding redirect to latest System.Collections.Immutable for anything with the F# ProjectSystem installed. * Revert "Add binding redirect to latest System.Collections.Immutable for anything with the F# ProjectSystem installed." This reverts commit 99de19a8d30742fb12cfb592ff7b86f868b2aa81. * Reverse the timeflow and don'[t update quite so far into the future * Add trailing quote * typo --- .../FSharp.Compiler.Service.netstandard.fsproj | 2 +- fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj | 4 ++-- fcs/nuget/FSharp.Compiler.Service.nuspec | 2 +- packages.config | 4 ++-- setup/FSharp.SDK/component-groups/Compiler_Redist.wxs | 4 ++-- setup/packages.config | 4 ++-- src/FSharpSource.Settings.targets | 2 +- .../FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj | 4 ++-- .../FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj | 2 +- .../FSharp.Compiler.Private.netcore.nuspec | 4 ++-- src/fsharp/FSharp.Compiler.Private/project.json | 4 ++-- .../FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec | 4 ++-- .../FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec | 4 ++-- src/fsharp/Fsc-proto/Fsc-proto.fsproj | 2 +- .../tests/unittests/VisualFSharp.Unittests.dll.config | 2 +- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index dd1add15a55..253080552f3 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -653,7 +653,7 @@ - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index b1cebac3a08..eebbaa0a931 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -640,10 +640,10 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.4.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll diff --git a/fcs/nuget/FSharp.Compiler.Service.nuspec b/fcs/nuget/FSharp.Compiler.Service.nuspec index 3d4a1213bb0..ba4c2e7c3d5 100644 --- a/fcs/nuget/FSharp.Compiler.Service.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.nuspec @@ -14,7 +14,7 @@ F# compiler services for creating IDE tools, language extensions and for F# embedding. - + diff --git a/packages.config b/packages.config index 7667cd2d480..569ccb2745b 100644 --- a/packages.config +++ b/packages.config @@ -15,8 +15,8 @@ - - + + diff --git a/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs b/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs index a17daea8e54..c9d7182c018 100644 --- a/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs +++ b/setup/FSharp.SDK/component-groups/Compiler_Redist.wxs @@ -171,11 +171,11 @@ - + - + diff --git a/setup/packages.config b/setup/packages.config index 24b02a45ed8..036cb400855 100644 --- a/setup/packages.config +++ b/setup/packages.config @@ -1,7 +1,7 @@ - - + + diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 2fa8ed67d77..7f964f14beb 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -35,7 +35,7 @@ 2.3.0-beta2-61719-01 15.0 15.0.26201 - 1.4.0 + 1.3.1 Microsoft.VSSDK.BuildTools.15.0.26201 15.3.23 diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index a35c9a3bdf4..6e4a625372c 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -631,14 +631,14 @@ - + - + diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index dccca2632f1..528a5649fed 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -694,7 +694,7 @@ ..\..\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - ..\..\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + ..\..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\..\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec index 8c4bb2aedc0..2189cb861af 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec @@ -16,14 +16,14 @@ - + - + diff --git a/src/fsharp/FSharp.Compiler.Private/project.json b/src/fsharp/FSharp.Compiler.Private/project.json index 2264a6ce7c8..09cfefb19fc 100644 --- a/src/fsharp/FSharp.Compiler.Private/project.json +++ b/src/fsharp/FSharp.Compiler.Private/project.json @@ -1,14 +1,14 @@ { "dependencies": { "NETStandard.Library": "1.6.1", - "System.Collections.Immutable":"1.4.0", + "System.Collections.Immutable":"1.3.1", "System.Diagnostics.Process": "4.3.0", "System.Diagnostics.TraceSource": "4.3.0", "System.Linq.Expressions": "4.3.0", "System.Linq.Queryable": "4.3.0", "System.Net.Requests": "4.3.0", "System.Reflection.Emit": "4.3.0", - "System.Reflection.Metadata": "1.5.0", + "System.Reflection.Metadata": "1.4.2", "System.Reflection.TypeExtensions": "4.3.0", "System.Runtime": "4.3.0", "System.Runtime.InteropServices": "4.3.0", diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index edd278cf82f..0bc76eca2a0 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec index 27bfa91f071..4abfcc6130a 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj index 82219020124..43c8de3df64 100644 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ b/src/fsharp/Fsc-proto/Fsc-proto.fsproj @@ -460,7 +460,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.5.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config b/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config index 4a0c1ed3562..7aae3905c10 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.dll.config @@ -49,7 +49,7 @@ - + From 0b65191f65bb863c636e26290c5029386148a2d9 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 9 Nov 2017 09:37:44 +0300 Subject: [PATCH 111/150] do not provide completion after ' (#3911) --- src/fsharp/vs/service.fs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 63df7f33061..10f2c61926e 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -872,8 +872,17 @@ type TypeCheckInfo // Other completions | cc -> - let isInRangeOperator = (match cc with Some (CompletionContext.RangeOperator) -> true | _ -> false) - GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck, isInRangeOperator, getAllSymbols) + match residueOpt |> Option.bind Seq.tryHead with + | Some ''' -> + // The last token in + // let x = 'E + // is Ident with text "'E", however it's either unfinished char literal or generic parameter. + // We should not provide any completion in the former case, and we don't provide it for the latter one for now + // because providing generic parameters list is context aware, which we don't have here (yet). + None + | _ -> + let isInRangeOperator = (match cc with Some (CompletionContext.RangeOperator) -> true | _ -> false) + GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck, isInRangeOperator, getAllSymbols) res |> Option.map (fun (items, denv, m) -> items, denv, completionContext, m) From c0b044c6c578fe281b689bcd93cffb9def24e967 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 9 Nov 2017 01:27:03 -0800 Subject: [PATCH 112/150] Use WaitForExit(timeout) rather than loop on HasExited property for some tests (#3906) * bump * Remove reliance on HasExited, instead use WaitForExit(timeout) * Huge timeout in fcs tests * Remove bump space * Replace scary computed constants with hipster TimeSpans * fix comment * Of course TotalMilliseconds is float and Milliseconds is int --- use Milliseconds * Use the Timespan APIs correctly --- tests/fsharpqa/Source/CodeGen/Structure/DoNotInlineX.fs | 8 +++++--- tests/service/FscTests.fs | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/Structure/DoNotInlineX.fs b/tests/fsharpqa/Source/CodeGen/Structure/DoNotInlineX.fs index 058daf81589..6c4a6447ee5 100644 --- a/tests/fsharpqa/Source/CodeGen/Structure/DoNotInlineX.fs +++ b/tests/fsharpqa/Source/CodeGen/Structure/DoNotInlineX.fs @@ -4,6 +4,8 @@ open System open System.Diagnostics open System.IO +let longtime = int(System.TimeSpan.FromSeconds(30.0).TotalMilliseconds) // longtime is 30 seconds + let programFiles = let pf86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)") if String.IsNullOrEmpty(pf86) then Environment.GetEnvironmentVariable("ProgramFiles") else pf86 @@ -26,7 +28,7 @@ let start (p1 : string) = Process.Start(p1) let CompileFile file args = let p = Process.Start(fsc, file + " " + args) - while not (p.HasExited) do () + p.WaitForExit() [] let main (args : string[]) = @@ -40,13 +42,13 @@ let main (args : string[]) = printfn "Compiled DerivedType with %A" derivedFlag let r1 = start "DerivedType.exe" - while not r1.HasExited do () + r1.WaitForExit(longtime) printfn "Ran DerivedType.exe with result: %A" r1.ExitCode CompileFile "BaseType.fs" "-a" printfn "Compiled BaseType without %A" baseFlag let r2 = start "DerivedType.exe" - while not r2.HasExited do () + r2.WaitForExit(longtime) printfn "Ran DerivedType.exe with result: %A" r2.ExitCode if r1.ExitCode = expectedResult1 && r2.ExitCode = expectedResult2 then 0 else 1 diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs index 97f1ee75922..ca3d3999e0a 100644 --- a/tests/service/FscTests.fs +++ b/tests/service/FscTests.fs @@ -76,6 +76,8 @@ type PEVerifier () = #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 @@ -87,7 +89,7 @@ type PEVerifier () = use proc = Process.Start(psi) let stdOut = proc.StandardOutput.ReadToEnd() let stdErr = proc.StandardError.ReadToEnd() - while not proc.HasExited do () + proc.WaitForExit(longtime) proc.ExitCode, stdOut, stdErr member __.Verify(assemblyPath : string) = From d63f8735c194cd7f7f9f1b9ab374757df63f703f Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 9 Nov 2017 02:34:11 -0800 Subject: [PATCH 113/150] Hosted compiler sets an alternate directory --- src/fsharp/CompileOps.fs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index d7ebe36c75c..346b1daa973 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -1774,7 +1774,25 @@ let OutputDiagnosticContext prefix fileLineFn os err = let GetFSharpCoreLibraryName () = "FSharp.Core" // If necessary assume a reference to the latest .NET Framework FSharp.Core with which those tools are built. -let GetDefaultFSharpCoreReference() = typeof>.Assembly.Location +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) +let GetDefaultSystemValueTupleReference () = + try + let asm = typeof>.Assembly + if asm.FullName.StartsWith "System.ValueTuple" then + Some asm.Location + else + let location = Path.GetDirectoryName(typeof.Assembly.Location) + let valueTuplePath = Path.Combine(location, "System.ValueTuple.dll") + if File.Exists(valueTuplePath) then + Some valueTuplePath + else + None + with _ -> None let GetFsiLibraryName () = "FSharp.Compiler.Interactive.Settings" @@ -1808,10 +1826,11 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Collections" // System.Collections.Generic.List yield "System.Runtime.Numerics" // BigInteger yield "System.Threading" // OperationCanceledException -#if !COMPILER_SERVICE_AS_DLL - // TODO, right now FCS doesn't add this reference automatically - yield "System.ValueTuple" -#endif + + // always include a default reference to System.ValueTuple.dll in scripts and out-of-project sources + match GetDefaultSystemValueTupleReference() with + | None -> () + | Some v -> yield v yield "System.Web" yield "System.Web.Services" From e27a3ae85bc953166602c20fa17d3dc7c393492c Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 9 Nov 2017 17:47:34 -0800 Subject: [PATCH 114/150] Fix hintpath --- .../src/HostedCompilerServer/HostedCompilerServer.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj index 98c23d8ccea..c03e0df50f0 100644 --- a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj +++ b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj @@ -50,7 +50,7 @@ FSharp.Compiler.Private - $(FSharpSourcesRoot)\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll true From b00692ffbef254e28ebc12b4da2d4aca497f35b5 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 9 Nov 2017 23:35:31 -0800 Subject: [PATCH 115/150] Update some projects with System.ValueTuple --- .../LanguageServiceProfiling.fsproj | 6 +++++- vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj | 4 ++++ .../tests/unittests/VisualFSharp.Unittests.fsproj | 10 +++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj b/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj index c103e8868c0..3c4dd3e74fc 100644 --- a/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj +++ b/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj @@ -71,6 +71,10 @@ FSharp.Compiler.Private True - + + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll + true + + \ No newline at end of file diff --git a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj index 057165e8b47..87346a44457 100644 --- a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj +++ b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj @@ -162,6 +162,10 @@ True $(NUnitLibDir)\nunit.framework.dll + + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll + true + {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index 177beb3bbd2..c01be9ccf96 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -342,6 +342,10 @@ $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True + + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.1.3.1\lib\netstandard1.0\System.ValueTuple.dll + True + {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core @@ -361,7 +365,11 @@ FSharp.Compiler.Private True - + + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll + true + + VisualFSharp.Salsa {fbd4b354-dc6e-4032-8ec7-c81d8dfb1af7} True From 54dd973116b947356308377d394fbf065a2993ec Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 10 Nov 2017 14:39:45 -0800 Subject: [PATCH 116/150] Fix test --- tests/service/ProjectOptionsTests.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 39ecd5124b4..1e995681fdb 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -485,13 +485,12 @@ let ``Test OtherOptions order for GetProjectOptionsFromScript`` () = 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"; "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 + 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 From ca4dc8302b5b2dbd9f47ee4d8b5300649f012e57 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 11 Nov 2017 12:41:05 +0300 Subject: [PATCH 117/150] use TcRef.LogicalName instead of Stamp to calculate completion item hash code while filtering duplicates, letting ItemDisplayPartialEquality.Equals do the job --- src/fsharp/symbols/SymbolHelpers.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 7b01319772e..e95870cb976 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -782,7 +782,7 @@ module internal SymbolHelpers = protectAssemblyExploration 1027 (fun () -> match item with | ItemWhereTypIsPreferred ty -> - if isAppTy g ty then hash (tcrefOfAppTy g ty).Stamp + if isAppTy g ty then hash (tcrefOfAppTy g ty).LogicalName else 1010 | Item.ILField(ILFieldInfo(_, fld)) -> System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode fld // hash on the object identity of the AbstractIL metadata blob for the field @@ -795,12 +795,12 @@ module internal SymbolHelpers = | Item.CtorGroup(name, meths) -> name.GetHashCode() + (meths |> List.fold (fun st a -> st + a.ComputeHashCode()) 0) | (Item.Value vref | Item.CustomBuilder (_, vref)) -> hash vref.LogicalName | Item.ActivePatternCase(APElemRef(_apinfo, vref, idx)) -> hash (vref.LogicalName, idx) - | Item.ExnCase(tcref) -> hash tcref.Stamp + | Item.ExnCase(tcref) -> hash tcref.LogicalName | Item.UnionCase(UnionCaseInfo(_, UCRef(tcref, n)), _) -> hash(tcref.Stamp, n) | Item.RecdField(RecdFieldInfo(_, RFRef(tcref, n))) -> hash(tcref.Stamp, n) | Item.Event evt -> evt.ComputeHashCode() | Item.Property(_name, pis) -> hash (pis |> List.map (fun pi -> pi.ComputeHashCode())) - | Item.UnqualifiedType(tcref :: _) -> hash tcref.Stamp + | Item.UnqualifiedType(tcref :: _) -> hash tcref.LogicalName | _ -> failwith "unreachable") } let CompletionItemDisplayPartialEquality g = From 1c46a58353d16ba00772156bcf0fddc71d0fc4f3 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 11 Nov 2017 13:27:02 +0300 Subject: [PATCH 118/150] add a test --- vsintegration/tests/unittests/UnusedOpensTests.fs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index bb64f920faa..99155887989 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -723,3 +723,17 @@ module Test = let xs = [] """ => [ 2, (5, 16) ] + +[] +let ``a type from an auto open module is taken into account``() = + """ +module M1 = + [] + module AutoOpened = + type T() = class end + +module M2 = + open M1 + let _ = T() +""" + => [] \ No newline at end of file From 693e8a3ef95ed6604e683314e586b202f6bfdf29 Mon Sep 17 00:00:00 2001 From: TIHan Date: Wed, 15 Nov 2017 11:51:09 -0800 Subject: [PATCH 119/150] Added two tests for object initializer syntax for completion --- .../unittests/CompletionProviderTests.fs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index e34ed22f0ea..935fafc5984 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -259,6 +259,37 @@ x. "ToArray"; "ToString"; "TrimExcess"; "TrueForAll"] VerifyCompletionListExactly(fileContents, "x.", expected) +[] +let ``Constructing a new class with object initializer syntax``() = + let fileContents = """ +type A() = + member val SettableProperty = 1 with get, set + member val AnotherSettableProperty = 1 with get, set + member val NonSettableProperty = 1 + +let _ = new A(Setta +""" + + let expected = ["SettableProperty"; "AnotherSettableProperty"] + let notExpected = ["NonSettableProperty"] + VerifyCompletionList(fileContents, "(Setta", expected, notExpected) + +[] +let ``Constructing a new fully qualified class with object initializer syntax``() = + let fileContents = """ +module M = + type A() = + member val SettableProperty = 1 with get, set + member val AnotherSettableProperty = 1 with get, set + member val NonSettableProperty = 1 + +let _ = new M.A(Setta +""" + + let expected = ["SettableProperty"; "AnotherSettableProperty"] + let notExpected = ["NonSettableProperty"] + VerifyCompletionList(fileContents, "(Setta", expected, notExpected) + [] let ``Extension methods go after everything else, extension properties are treated as normal ones``() = let fileContents = """ From b2a0416080ba2ffaf93f8abd9d23ddf80afaa172 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 15 Nov 2017 09:28:48 -0800 Subject: [PATCH 120/150] remove old .rc file VSPackage.resx already has these resources. --- DEVGUIDE.md | 3 -- .../ProjectResources.rc | 12 ------ .../ProjectSystem.fsproj | 10 ----- .../Tests.ProjectSystem.Miscellaneous.fs | 42 ------------------- 4 files changed, 67 deletions(-) delete mode 100644 vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectResources.rc diff --git a/DEVGUIDE.md b/DEVGUIDE.md index d7f8318118c..73d3ef08f49 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -99,9 +99,6 @@ To build and test Visual F# IDE Tools, install these requirements: - Under the "Windows" workloads, select ".NET desktop development" - Select "F# language support" under the optional components - Under the "Other Toolsets" workloads, select "Visual Studio extension development" - - Under the "Individual components" tab select "Windows 10 SDK" as shown below (needed for compiling RC resource, see #2556): \ - ![image](https://cloud.githubusercontent.com/assets/1249087/23730261/5c78c850-041b-11e7-9d9d-62766351fd0f.png) - - Failing to install this will lead to error FS0193: Could not find file visualfsharp\vsintegration\src\FSharp.ProjectSystem.FSharp\obj\net40\ProjectResources.rc.res. Steps to build: diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectResources.rc b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectResources.rc deleted file mode 100644 index c205f665be7..00000000000 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectResources.rc +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -// Note that, regardless of what numbers are given here, the wix code (src\wix\script.fs) that references these uses 'IconIndex' starting at 0 -#define FS 100 -#define FSI 101 -#define FSX 102 -#define FSPROJ 103 -// Note that these are not always the same as the .bmp that appears in Solution Explorer, but we think these are best for 'windows folder' for now -FS ICON "Resources\FSharpCodeFile_32.ico" -FSI ICON "Resources\FSharpSignature.ico" -FSX ICON "Resources\FSharpScript.ico" -FSPROJ ICON "Resources\FSharpAboutBox.ico" diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index ff08f31bb70..2708ef1e62c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -21,7 +21,6 @@ v4.6 $(OtherFlags) --warnon:1182 --subsystemversion:6.00 false - ProjectResources.rc true false false @@ -39,15 +38,6 @@ - - $(IntermediateOutputPath)\ProjectResources.rc.res - - - - - - - diff --git a/vsintegration/tests/unittests/Tests.ProjectSystem.Miscellaneous.fs b/vsintegration/tests/unittests/Tests.ProjectSystem.Miscellaneous.fs index a90f9d28651..361f6569b16 100644 --- a/vsintegration/tests/unittests/Tests.ProjectSystem.Miscellaneous.fs +++ b/vsintegration/tests/unittests/Tests.ProjectSystem.Miscellaneous.fs @@ -630,41 +630,6 @@ type Miscellaneous() = project.Close() |> ignore ) - -module Regression5312 = - // Regression testing ICONS in project system dll - open System - open System.Drawing - open System.Runtime.InteropServices - [] - extern int32 ExtractIconEx(string szFileName, int nIconIndex,IntPtr[] phiconLarge, IntPtr[] phiconSmall,uint32 nIcons) - - [] - extern int DestroyIcon(IntPtr hIcon) - - let extractIcon (path:string) (large:bool) = - let n = 10 - let hIconLarge = Array.create n IntPtr.Zero - let hIconSmall = Array.create n IntPtr.Zero - try - let readIconCount = ExtractIconEx(path,0,hIconLarge,hIconSmall,uint32 n) - if readIconCount > 0 then - if large then - Array.init readIconCount (fun i -> Icon.FromHandle(hIconLarge.[0]).Clone() :?> Icon) - else - Array.init readIconCount (fun i -> Icon.FromHandle(hIconSmall.[0]).Clone() :?> Icon) - else - [| |] - finally - hIconLarge |> Array.iter (fun ptr -> if ptr <> IntPtr.Zero then DestroyIcon ptr |> ignore) - hIconSmall |> Array.iter (fun ptr -> if ptr <> IntPtr.Zero then DestroyIcon ptr |> ignore) - - /// Given path to FSharp.Project.FSharpProject.dll, check the icons are present. - /// Throws of failure. - let checkIcons nExpected (path:string) = - let icons = extractIcon path true - if icons.Length<>nExpected then failwithf "Expected %d icons in %s" nExpected path // " - [] type Utilities() = (* @@ -745,13 +710,6 @@ type Utilities() = [] member public this.``PublicKeyToken.0a00000000000001``() = CheckPublicKeyToString([|0xauy;0uy;0uy;0uy;0uy;0uy;0uy;1uy|], "0a00000000000001") - [] - member public this.``CheckIconsInProjectSystemDLL_Regression5312``() = - let path = typeof.Assembly.Location - Regression5312.checkIcons 4 path - () - - [] member public this.``Parse MSBuild property of type Int64`` () = Assert.AreEqual(123L, ProjectNode.ParsePropertyValueToInt64("123")) From 187674c1183167722b4ea3362c3ff0284c152d24 Mon Sep 17 00:00:00 2001 From: TIHan Date: Wed, 15 Nov 2017 14:05:53 -0800 Subject: [PATCH 121/150] Formatting completion lists in VerifyCompletionList --- .../unittests/CompletionProviderTests.fs | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index 935fafc5984..0360fdc973a 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -49,6 +49,9 @@ let internal projectOptions = { Stamp = None } +let formatCompletions(completions : string seq) = + "\n\t" + String.Join("\n\t", completions) + let VerifyCompletionList(fileContents: string, marker: string, expected: string list, unexpected: string list) = let caretPosition = fileContents.IndexOf(marker) + marker.Length let results = @@ -57,11 +60,44 @@ let VerifyCompletionList(fileContents: string, marker: string, expected: string |> Option.defaultValue (ResizeArray()) |> Seq.map(fun result -> result.DisplayText) - for item in expected do - Assert.IsTrue(results.Contains(item), sprintf "Completions should contain '%s'. Got '%s'." item (String.Join(", ", results))) + let expectedFound = + expected + |> Seq.filter results.Contains + + let expectedNotFound = + expected + |> Seq.filter (expectedFound.Contains >> not) + + let unexpectedNotFound = + unexpected + |> Seq.filter (results.Contains >> not) + + let unexpectedFound = + unexpected + |> Seq.filter (unexpectedNotFound.Contains >> not) + + // If either of these are true, then the test fails. + let hasExpectedNotFound = expectedNotFound.Count() > 0 + let hasUnexpectedFound = unexpectedFound.Count() > 0 + + if hasExpectedNotFound || hasUnexpectedFound then + let expectedNotFoundMsg = + if hasExpectedNotFound then + sprintf "Expected completions not found:%s" (formatCompletions expectedNotFound) + else + String.Empty + + let unexpectedFoundMsg = + if hasUnexpectedFound then + sprintf "Unexpected completions found:%s" (formatCompletions unexpectedFound) + else + String.Empty + + let completionsMsg = sprintf "Completions:%s" (formatCompletions results) + + let msg = sprintf "\n%s\n%s\n in %s" expectedNotFoundMsg unexpectedFoundMsg completionsMsg - for item in unexpected do - Assert.IsFalse(results.Contains(item), sprintf "Completions should not contain '%s'. Got '{%s}'" item (String.Join(", ", results))) + Assert.Fail(msg) let VerifyCompletionListExactly(fileContents: string, marker: string, expected: string list) = let caretPosition = fileContents.IndexOf(marker) + marker.Length From 6e38ed8367d7ba161b95399212bc9abfd7add194 Mon Sep 17 00:00:00 2001 From: TIHan Date: Wed, 15 Nov 2017 15:57:15 -0800 Subject: [PATCH 122/150] Added new test for completion provider for @ characters. Removed a test from old completion tests. --- .../unittests/CompletionProviderTests.fs | 27 ++++++++++++++----- .../Tests.LanguageService.Completion.fs | 1 - 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index 0360fdc973a..39f25734b43 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -83,19 +83,19 @@ let VerifyCompletionList(fileContents: string, marker: string, expected: string if hasExpectedNotFound || hasUnexpectedFound then let expectedNotFoundMsg = if hasExpectedNotFound then - sprintf "Expected completions not found:%s" (formatCompletions expectedNotFound) + sprintf "\nExpected completions not found:%s\n" (formatCompletions expectedNotFound) else String.Empty let unexpectedFoundMsg = if hasUnexpectedFound then - sprintf "Unexpected completions found:%s" (formatCompletions unexpectedFound) + sprintf "\nUnexpected completions found:%s\n" (formatCompletions unexpectedFound) else String.Empty - let completionsMsg = sprintf "Completions:%s" (formatCompletions results) + let completionsMsg = sprintf "\nin Completions:%s" (formatCompletions results) - let msg = sprintf "\n%s\n%s\n in %s" expectedNotFoundMsg unexpectedFoundMsg completionsMsg + let msg = sprintf "%s%s%s" expectedNotFoundMsg unexpectedFoundMsg completionsMsg Assert.Fail(msg) @@ -295,7 +295,7 @@ x. "ToArray"; "ToString"; "TrimExcess"; "TrueForAll"] VerifyCompletionListExactly(fileContents, "x.", expected) -[] +[] let ``Constructing a new class with object initializer syntax``() = let fileContents = """ type A() = @@ -310,7 +310,22 @@ let _ = new A(Setta let notExpected = ["NonSettableProperty"] VerifyCompletionList(fileContents, "(Setta", expected, notExpected) -[] +[] +let ``Constructing a new class with object initializer syntax and verifying 'at' character doesn't exist.``() = + let fileContents = """ +type A() = + member val SettableProperty = 1 with get, set + member val AnotherSettableProperty = 1 with get, set + member val NonSettableProperty = 1 + +let _ = new A(Setta +""" + + let expected = [] + let notExpected = ["SettableProperty@"; "AnotherSettableProperty@"; "NonSettableProperty@"] + VerifyCompletionList(fileContents, "(Setta", expected, notExpected) + +[] let ``Constructing a new fully qualified class with object initializer syntax``() = let fileContents = """ module M = diff --git a/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs b/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs index 88d22ecb293..c0e9a06e920 100644 --- a/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs +++ b/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs @@ -596,7 +596,6 @@ a. AssertCtrlSpaceCompleteContains (typeDef3 @ ["new M.A((**))"]) "A((**)" ["SettableProperty"; "AnotherSettableProperty"] ["NonSettableProperty"] AssertCtrlSpaceCompleteContains (typeDef3 @ ["new M.A(S = 1)"]) "A(S" ["SettableProperty"] ["NonSettableProperty"] AssertCtrlSpaceCompleteContains (typeDef3 @ ["new M.A(S = 1)"]) "A(S = 1" [] ["NonSettableProperty"; "SettableProperty"] // neg test - AssertCtrlSpaceCompleteContains (typeDef3 @ ["new M.A(S = 1,)"]) "A(S = 1," ["AnotherSettableProperty"] ["NonSettableProperty"] let typeDef4 = [ From f1a5d16eb44f2ecd574d775f1894ffd18048a4c1 Mon Sep 17 00:00:00 2001 From: Jason Imison Date: Thu, 16 Nov 2017 17:33:51 +0000 Subject: [PATCH 123/150] Test case for #3950 (#3958) --- .../tests/unittests/UnusedOpensTests.fs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/vsintegration/tests/unittests/UnusedOpensTests.fs b/vsintegration/tests/unittests/UnusedOpensTests.fs index 99155887989..f932ff26164 100644 --- a/vsintegration/tests/unittests/UnusedOpensTests.fs +++ b/vsintegration/tests/unittests/UnusedOpensTests.fs @@ -371,6 +371,21 @@ let _ = func() """ => [] +[] +let ``auto open module with namespace``() = + """ +namespace Module1Namespace +[] +module Module1 = + module Module2 = + let x = 1 +namespace ConsumerNamespace +open Module1Namespace +module Module3 = + let y = Module2.x +""" + => [] + [] let ``auto open module in the middle of hierarchy``() = """ @@ -736,4 +751,4 @@ module M2 = open M1 let _ = T() """ - => [] \ No newline at end of file + => [] From b9cf6a40355f9b7a7a27fd88a713fad109a9b9c0 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 16 Nov 2017 20:38:30 +0300 Subject: [PATCH 124/150] Symbol uses for namespaces (#3932) * name resolution environment captures last ident range in long ident instead of full range * fixed: wrong symbols for namespaces * notify name resolution sink about all intermediate namespaces in open declarations * Revert "name resolution environment captures last ident range in long ident instead of full range" This reverts commit 65f866a80625725fb490a90b91a539078b96373c. * fix ranges * we need all modules * return namespace uses in the order they appear in source code * fix a test * fix a test * notify name resolution sink with each root namespace fragments * fix `open global.xxx` compilation --- src/fsharp/TypeChecker.fs | 46 ++++++++++++++++++++------ src/fsharp/symbols/Symbols.fs | 2 +- tests/service/CSharpProjectAnalysis.fs | 5 +-- tests/service/ProjectAnalysisTests.fs | 6 ++-- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a0dc645905d..c193ce6fc86 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -449,10 +449,24 @@ let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs openDeclaration = CallOpenDeclarationSink tcSink openDeclaration match openDeclaration.Range with | None -> () - | Some range -> - for modul in mvvs do - let item = Item.ModuleOrNamespaces [modul] - CallNameResolutionSink tcSink (range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) + | Some _ -> + let rec loop (acc: (Item * range) list) (idents: Ident list) = + match idents with + | [] -> acc + | [id] when id.idText = MangledGlobalName -> acc + | id :: rest -> + let idents = List.rev idents + let range = id.idRange + let acc = + match ResolveLongIndentAsModuleOrNamespace ResultCollectionSettings.AllResults amap range OpenQualified env.NameEnv env.eAccessRights idents with + | Result modrefs -> + (acc, modrefs) ||> List.fold (fun acc (_, modref, _) -> + (Item.ModuleOrNamespaces [modref], range) :: acc) + | _ -> acc + loop acc rest + + for item, range in loop [] (List.rev openDeclaration.LongId) do + CallNameResolutionSink tcSink (range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) env let AddRootModuleOrNamespaceRefs g amap m env modrefs = @@ -665,11 +679,11 @@ let LocateEnv ccu env enclosingNamespacePath = env let BuildRootModuleType enclosingNamespacePath (cpath:CompilationPath) mtyp = - (enclosingNamespacePath, (cpath, (mtyp, None))) - ||> List.foldBack (fun id (cpath, (mtyp, mspec)) -> + (enclosingNamespacePath, (cpath, (mtyp, []))) + ||> List.foldBack (fun id (cpath, (mtyp, mspecs)) -> let a, b = wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp - cpath.ParentCompPath, (a, match mspec with Some _ -> mspec | None -> Some b)) - |> snd + cpath.ParentCompPath, (a, b :: mspecs)) + |> fun (_, (mtyp, mspecs)) -> mtyp, List.rev mspecs let BuildRootModuleExpr enclosingNamespacePath (cpath:CompilationPath) mexpr = (enclosingNamespacePath, (cpath, mexpr)) @@ -16383,7 +16397,13 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS // For 'namespace rec' and 'module rec' we add the thing being defined let mtypNS = !(envNS.eModuleOrNamespaceTypeAccumulator) - let mtypRoot, mspecNSOpt = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + let mtypRoot, mspecNSs = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + let mspecNSOpt = List.tryHead mspecNSs + + mspecNSs |> List.iter (fun mspec -> + let modref = mkLocalModRef mspec + let item = Item.ModuleOrNamespaces [modref] + CallNameResolutionSink cenv.tcSink (mspec.Range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Binding, env.DisplayEnv, env.eAccessRights)) // For 'namespace rec' and 'module rec' we add the thing being defined let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m envNS mtypRoot else envNS @@ -16688,7 +16708,13 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem let envNS = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envNS let mtypNS = !(envNS.eModuleOrNamespaceTypeAccumulator) - let mtypRoot, mspecNSOpt = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + let mtypRoot, mspecNSs = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + let mspecNSOpt = List.tryHead mspecNSs + + mspecNSs |> List.iter (fun mspec -> + let modref = mkLocalModRef mspec + let item = Item.ModuleOrNamespaces [modref] + CallNameResolutionSink cenv.tcSink (mspec.Range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Binding, env.DisplayEnv, env.eAccessRights)) // For 'namespace rec' and 'module rec' we add the thing being defined let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m envNS mtypRoot else envNS diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 20ec8c13b32..6679d8fdb1a 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -230,7 +230,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = inherit FSharpSymbol(cenv, (fun () -> checkEntityIsResolved(entity); - if entity.IsModule then Item.ModuleOrNamespaces [entity] + if entity.IsModuleOrNamespace then Item.ModuleOrNamespaces [entity] else Item.UnqualifiedType [entity]), (fun _this thisCcu2 ad -> checkForCrossProjectAccessibility (thisCcu2, ad) (cenv.thisCcu, getApproxFSharpAccessibilityOfEntity entity)) diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs index 7acf06c7111..34f427435f7 100644 --- a/tests/service/CSharpProjectAnalysis.fs +++ b/tests/service/CSharpProjectAnalysis.fs @@ -111,8 +111,9 @@ let _ = CSharpOuterClass.InnerClass.StaticMember() |> Async.RunSynchronously |> Array.map (fun su -> su.Symbol.ToString()) |> shouldEqual - [|"Tests"; "InnerEnum"; "CSharpOuterClass"; "field Case1"; "InnerClass"; - "CSharpOuterClass"; "member StaticMember"; "NestedEnumClass"|] + [|"FSharp"; "FSharp"; "Compiler"; "Service"; "Tests"; "InnerEnum"; + "CSharpOuterClass"; "field Case1"; "InnerClass"; "CSharpOuterClass"; + "member StaticMember"; "NestedEnumClass"|] [] let ``Ctor test`` () = diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index e4dea637cb0..c1283e1527c 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -3688,8 +3688,10 @@ let ``Test Project25 symbol uses of type-provided members`` () = allUses |> shouldEqual - [|("FSharp.Data", "file1", ((3, 5), (3, 16)), ["namespace"; "provided"]); - ("Microsoft.FSharp.Data", "file1", ((3, 5), (3, 16)), ["namespace"]); + [|("Microsoft.FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); + ("FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); + ("Microsoft.FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"]); + ("FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"; "provided"]); ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), ["class"; "provided"; "erased"]); ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), From c55d1e139c738af8d82ee4b84d64bc291289ac9d Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 Nov 2017 09:40:42 -0800 Subject: [PATCH 125/150] Using Seq.isEmpty instead of checking count --- vsintegration/tests/unittests/CompletionProviderTests.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index 39f25734b43..1fdd57d90f0 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -77,8 +77,8 @@ let VerifyCompletionList(fileContents: string, marker: string, expected: string |> Seq.filter (unexpectedNotFound.Contains >> not) // If either of these are true, then the test fails. - let hasExpectedNotFound = expectedNotFound.Count() > 0 - let hasUnexpectedFound = unexpectedFound.Count() > 0 + let hasExpectedNotFound = not (Seq.isEmpty expectedNotFound) + let hasUnexpectedFound = not (Seq.isEmpty unexpectedFound) if hasExpectedNotFound || hasUnexpectedFound then let expectedNotFoundMsg = From 8a53c852fbe399e1538b91e74ca9d94d55b7176e Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 10 Nov 2017 08:44:56 -0800 Subject: [PATCH 126/150] only pull references from NuGet packages, never from the GAC --- build-everything.proj | 32 +++++++++------- build.cmd | 2 +- fcs/fcs.props | 3 ++ packages.config | 2 +- setup/fsharp-setup-build.proj | 12 ++++-- src/FSharpSource.Settings.targets | 7 +++- src/FSharpSource.targets | 4 -- src/root.traversal.targets | 15 +++++--- .../CSharp_Analysis/CSharp_Analysis.csproj | 2 +- .../VisualFSharpFull/VisualFSharpFull.csproj | 2 + .../VisualFSharpOpenSource.csproj | 6 ++- vsintegration/packages.config | 4 +- .../src/FSharp.Editor/FSharp.Editor.fsproj | 2 +- .../FSharp.LanguageService.Base.csproj | 4 +- .../FSharp.LanguageService.fsproj | 4 +- .../Project/ProjectReferenceNode.cs | 37 ------------------- .../Project/ProjectSystem.Base.csproj | 7 ++-- .../ProjectSystem.fsproj | 10 +++-- .../FSharp.PropertiesPages.vbproj | 4 +- .../src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj | 6 +-- vsintegration/src/fsharp.tools.targets | 2 + .../tests/Salsa/VisualFSharp.Salsa.fsproj | 6 +-- vsintegration/tests/Salsa/salsa.fs | 9 +++-- .../unittests/VisualFSharp.Unittests.fsproj | 11 +++--- 24 files changed, 93 insertions(+), 100 deletions(-) diff --git a/build-everything.proj b/build-everything.proj index 2a6e2320e80..b171c83ae04 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -84,28 +84,32 @@ + + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + diff --git a/build.cmd b/build.cmd index d851878cbb6..c2e9a0c6164 100644 --- a/build.cmd +++ b/build.cmd @@ -473,7 +473,7 @@ echo. echo ---------------- Done with arguments, starting preparation ----------------- -set BuildToolsPackage=Microsoft.VSSDK.BuildTools.15.0.26201 +set BuildToolsPackage=Microsoft.VSSDK.BuildTools.15.1.192 if "%VSSDKInstall%"=="" ( set VSSDKInstall=%~dp0packages\%BuildToolsPackage%\tools\vssdk ) diff --git a/fcs/fcs.props b/fcs/fcs.props index f1d16e7c8c9..88fb2f42ac1 100644 --- a/fcs/fcs.props +++ b/fcs/fcs.props @@ -9,5 +9,8 @@ $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools fsi.exe + 1.3.1 + {HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + \ No newline at end of file diff --git a/packages.config b/packages.config index 569ccb2745b..a4ecbf23fbd 100644 --- a/packages.config +++ b/packages.config @@ -32,7 +32,7 @@ - + diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj index df93c2e6f50..b1c5ee70a2c 100644 --- a/setup/fsharp-setup-build.proj +++ b/setup/fsharp-setup-build.proj @@ -57,22 +57,26 @@ + + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + Properties="LocaleCode=%(WixSetupProjects.LocaleCode);LocaleId=%(WixSetupProjects.LocaleId);LocaleParentCulture=%(WixSetupProjects.LocaleParentCulture);LocaleSpecificCulture=%(WixSetupProjects.LocaleSpecificCulture);IsLangPack=%(WixSetupProjects.IsLangPack);FSharpPackageVersion=$(FSharpPackageVersion);$(CustomProps)" /> + Properties="IsLangPack=%(VsixProjects.IsLangPack);FSharpPackageVersion=$(FSharpPackageVersion);OutputPath=$(InsertionDir);$(CustomProps)" /> + Properties="LocaleCode=%(SwixSetupProjects.LocaleCode);LocaleId=%(SwixSetupProjects.LocaleId);LocaleParentCulture=%(SwixSetupProjects.LocaleParentCulture);LocaleSpecificCulture=%(SwixSetupProjects.LocaleSpecificCulture);IsLangPack=%(SwixSetupProjects.IsLangPack);FSharpPackageVersion=$(FSharpPackageVersion);$(CustomProps)" /> + Targets="Build" + Properties="$(CustomProps)" /> diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 7f964f14beb..6a8c8ecbe4e 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -36,7 +36,7 @@ 15.0 15.0.26201 1.3.1 - Microsoft.VSSDK.BuildTools.15.0.26201 + Microsoft.VSSDK.BuildTools.15.1.192 15.3.23 15.3.15 @@ -49,6 +49,11 @@ 4.1.20 4.1.21 4.2.4 + + 3.5.0 + 3.5.0.0 + $(FSharpSourcesRoot)\..\packages\NUnit.$(NUnitVersion)\lib\net45 + $(FSharpSourcesRoot)\..\packages\NUnit.ConsoleRunner\$(NUnitVersion)\tools\ diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index d8b3751a01d..3ad08c6922b 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -99,10 +99,6 @@ $(FSharpSourcesRoot)\..\packages - 3.5.0 - 3.5.0.0 - $(FSharpSourcesRoot)\..\packages\NUnit.$(NUnitVersion)\lib\net45 - $(FSharpSourcesRoot)\..\packages\NUnit.ConsoleRunner\$(NUnitVersion)\tools\ 2.6.2 2.6.2.0 $(FSharpSourcesRoot)\..\packages\FsCheck.$(FsCheckVersion)\lib\ diff --git a/src/root.traversal.targets b/src/root.traversal.targets index 585ecbbc4b6..f0515163d8e 100644 --- a/src/root.traversal.targets +++ b/src/root.traversal.targets @@ -1,16 +1,21 @@ + + + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + - - + + - - + + - + diff --git a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj index cfd59b04c4a..4f88e4a7873 100644 --- a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj +++ b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj @@ -48,7 +48,7 @@ - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + ..\..\..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True True diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 18ad7026378..dadbcf19c81 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -57,6 +57,8 @@ cs false + + Program $(DevEnvDir)devenv.exe diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj index 54bf08a51bb..49e78adaef9 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj +++ b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj @@ -45,8 +45,8 @@ Properties RoslynDev true - False - True + True + False {E6A45CDF-B408-420F-B475-74611BEFC52B} true VisualFSharpOpenSource @@ -56,6 +56,8 @@ 15.4.1.0 cs + + Program $(DevEnvDir)devenv.exe diff --git a/vsintegration/packages.config b/vsintegration/packages.config index 4c4a2508b67..0fdfec0de5d 100644 --- a/vsintegration/packages.config +++ b/vsintegration/packages.config @@ -5,6 +5,7 @@ + @@ -23,6 +24,7 @@ + @@ -60,7 +62,7 @@ - + diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 8bc852eb290..33d13b3eb2e 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -202,7 +202,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.ComponentModelHost.15.0.26201-alpha\lib\net46\Microsoft.VisualStudio.ComponentModelHost.dll - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True diff --git a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj index f8121a8f347..bdcd0d08161 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj +++ b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj @@ -56,7 +56,9 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll - + + $(FSharpSourcesRoot)\..\packages\Microsoft.MSXML.8.0.0-alpha\lib\net46\microsoft.msxml.dll + diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 5ac5900f574..c7915acdb3f 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -100,7 +100,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll - $(FSharpSourcesRoot)\..\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll True @@ -116,7 +116,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectReferenceNode.cs b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectReferenceNode.cs index eea153ed438..5223caa3f2e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectReferenceNode.cs +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectReferenceNode.cs @@ -145,22 +145,6 @@ public string ReferencedProjectName get { return this.referencedProjectName; } } - // This method throws FileNotFoundException if VC is not installed - private static void CheckVCProjectMatchesPath(object prjObj, string goalPath, out bool isVCProject, out bool matches) - { - matches = false; - var vcProject = prjObj as Microsoft.VisualStudio.VCProjectEngine.VCProject; - isVCProject = vcProject != null; - if (isVCProject) - { - var projectFilePath = vcProject.ProjectFile; - if (NativeMethods.IsSamePath(projectFilePath, goalPath)) - { - matches = true; - } - } - } - private void InitReferencedProject(IVsSolution solution) { IVsHierarchy hier; @@ -183,27 +167,6 @@ private void InitReferencedProject(IVsSolution solution) return; } - // do things differently for C++ - try - { - bool isVCProject; - bool itMatches; - CheckVCProjectMatchesPath(prj.Object, this.referencedProjectFullPath, out isVCProject, out itMatches); - if (itMatches) - { - this.referencedProject = prj; - return; - } - if (isVCProject) - { - return; - } - } - catch (System.IO.FileNotFoundException) - { - // ignore it - VC might not be installed - } - // Get the full path of the current project. EnvDTE.Property pathProperty = null; try diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index ca3315a33e3..218b9584a9a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -65,7 +65,6 @@ - @@ -84,7 +83,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Conversion.Core.dll - $(FSharpSourcesRoot)\..\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll True @@ -116,7 +115,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.ComponentModelHost.15.0.26201-alpha\lib\net46\Microsoft.VisualStudio.ComponentModelHost.dll - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True @@ -148,7 +147,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll True diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 2708ef1e62c..fdecf065e6f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -7,6 +7,8 @@ FSharp + + $(VsSDKTools) Debug @@ -105,7 +107,7 @@ - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.DebuggerVisualizers.12.0.4\lib\net20\Microsoft.VisualStudio.DebuggerVisualizers.dll + $(FSharpSourcesRoot)\..\packages\VSSDK.DebuggerVisualizers.12.0.4\lib\net20\Microsoft.VisualStudio.DebuggerVisualizers.dll True @@ -113,7 +115,7 @@ True - $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE80.dll True @@ -125,7 +127,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True @@ -251,4 +253,6 @@ FSharp.Core + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 362993b2998..c7ee9a0d29c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -111,11 +111,11 @@ True - $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE80.dll True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True diff --git a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj index 71b3f802763..8ef9147b006 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj @@ -102,7 +102,7 @@ - $(FSharpSourcesRoot)\..\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll True @@ -118,7 +118,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True @@ -173,7 +173,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.TextManager.Interop.10.0.30319\lib\Microsoft.VisualStudio.TextManager.Interop.10.0.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.TextManager.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.TextManager.Interop.10.0.dll True diff --git a/vsintegration/src/fsharp.tools.targets b/vsintegration/src/fsharp.tools.targets index 7c636f69944..6ef78a70161 100644 --- a/vsintegration/src/fsharp.tools.targets +++ b/vsintegration/src/fsharp.tools.targets @@ -6,6 +6,8 @@ + + diff --git a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj index 87346a44457..2bd608e43e1 100644 --- a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj +++ b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj @@ -61,7 +61,7 @@ True - $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE80.8.0.1\lib\net10\EnvDTE80.dll True @@ -73,7 +73,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True @@ -127,7 +127,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Telemetry.15.0.777-rtm6FAA2C78\lib\net45\Microsoft.VisualStudio.Telemetry.dll True - + $(FSharpSourcesRoot)\..\packages\VSSDK.VSHelp.7.0.4\lib\net20\Microsoft.VisualStudio.VSHelp.dll True diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index 7ca1f8aed1d..e2f0c17ab9f 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -93,9 +93,10 @@ module internal Salsa = | null -> let project = GlobalEngine().LoadProject(projectFileName) // Set global properties. - SetGlobalProperty(project,"BuildingInsideVisualStudio", "true") - SetGlobalProperty(project,"Configuration", configuration) - SetGlobalProperty(project,"Platform", platform) + SetGlobalProperty(project, "AssemblySearchPaths", "{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}") + SetGlobalProperty(project, "BuildingInsideVisualStudio", "true") + SetGlobalProperty(project, "Configuration", configuration) + SetGlobalProperty(project, "Platform", platform) let prjColl = project.ProjectCollection let hostSvc = prjColl.HostServices let theHostObject = HostCompile() @@ -109,7 +110,7 @@ module internal Salsa = | false, _ -> project, false, Unchecked.defaultof<_> // this code path is hit when unit-testing the project system, which uses its own HostObject with e-> - printfn "Failed in MSBuild GetProject getting '%s'.\n" projectFileName + printfn "Failed in MSBuild GetProject getting '%s'.\n" projectFileName raise e project, justCreated, theHostObject diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index 98bb8002875..af3d8ea5024 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -174,7 +174,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Tasks.Core.dll - $(FSharpSourcesRoot)\..\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + $(FSharpSourcesRoot)\..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll True @@ -190,7 +190,7 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interops.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll True @@ -286,9 +286,8 @@ True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Telemetry.15.0.777-rtm6FAA2C78\lib\Microsoft.VisualStudio.Telemetry.dll + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Telemetry.15.0.777-rtm6FAA2C78\lib\net45\Microsoft.VisualStudio.Telemetry.dll - True $(NUnitLibDir)\nunit.framework.dll @@ -341,8 +340,8 @@ $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True - - $(FSharpSourcesRoot)\..\packages\System.ValueTuple.1.3.1\lib\netstandard1.0\System.ValueTuple.dll + + $(FSharpSourcesRoot)\..\packages\System.Threading.Tasks.Dataflow.4.5.24\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Dataflow.dll True From c9eb89cb27af1cba40750a85bada43e7caa2aca2 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 17 Nov 2017 10:06:17 -0800 Subject: [PATCH 127/150] For FSI on coreclr use ResolutionEnvironment.CompilationAndEvaluation just like on desktop (#3963) --- src/fsharp/CompileOps.fs | 8 +------- src/fsharp/fsi/fsi.fs | 2 -- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index c746e9e7691..0b0414ac5a1 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -5071,13 +5071,7 @@ module private ScriptPreprocessClosure = match codeContext with | CodeContext.Editing -> ResolutionEnvironment.EditingOrCompilation true | CodeContext.Compilation -> ResolutionEnvironment.EditingOrCompilation false - | CodeContext.CompilationAndEvaluation -> -#if FSI_TODO_NETCORE - // "CompilationAndEvaluation" assembly resolution for F# Interactive is not yet properly figured out on .NET Core - ResolutionEnvironment.EditingOrCompilation false -#else - ResolutionEnvironment.CompilationAndEvaluation -#endif + | CodeContext.CompilationAndEvaluation -> ResolutionEnvironment.CompilationAndEvaluation tcConfigB.framework <- false tcConfigB.useSimpleResolution <- useSimpleResolution // Indicates that there are some references not in BasicReferencesForScriptLoadClosure which should diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 7cf093f9bef..3a178a5c185 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -2464,8 +2464,6 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do tcConfigB.useFsiAuxLib <- fsi.UseFsiAuxLib #if FSI_TODO_NETCORE - // "CompilationAndEvaluation" assembly resolution for F# Interactive is not yet properly figured out on .NET Core - do tcConfigB.resolutionEnvironment <- ResolutionEnvironment.EditingOrCompilation false do tcConfigB.useSimpleResolution <- true do SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif From 7f7f48843faaa2eac88b8ec55ff2bb0e6c1123ca Mon Sep 17 00:00:00 2001 From: ncave Date: Fri, 17 Nov 2017 12:37:56 -0800 Subject: [PATCH 128/150] ExportedTypes optimization (#3959) --- src/absil/ilread.fs | 78 ++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 1b7735b9772..f4ea49effee 100644 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -3206,50 +3206,50 @@ and seekReadManifestResources ctxt () = yield r ]) -and seekReadNestedExportedTypes ctxt parentIdx = +and seekReadNestedExportedTypes ctxt (exported: _ array) (nested: Lazy<_ array>) parentIdx = mkILNestedExportedTypesLazy (lazy - [ for i = 1 to ctxt.getNumRows TableNames.ExportedType do - let (flags, _tok, nameIdx, namespaceIdx, implIdx) = seekReadExportedTypeRow ctxt i - if not (isTopTypeDef flags) then - let (TaggedIndex(tag, idx) ) = implIdx - //let isTopTypeDef = (idx = 0 || tag <> i_ExportedType) - //if not isTopTypeDef then - match tag with - | tag when tag = i_ExportedType && idx = parentIdx -> - let nm = readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) - yield - { Name=nm - Access=(match typeAccessOfFlags flags with ILTypeDefAccess.Nested n -> n | _ -> failwith "non-nested access for a nested type described as being in an auxiliary module") - Nested=seekReadNestedExportedTypes ctxt i - CustomAttrs=seekReadCustomAttrs ctxt (TaggedIndex(hca_ExportedType, i)) } - | _ -> () ]) - + nested.Force().[parentIdx-1] + |> List.map (fun i -> + let (flags, _tok, nameIdx, namespaceIdx, _implIdx) = exported.[i-1] + { Name = readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) + Access = (match typeAccessOfFlags flags with + | ILTypeDefAccess.Nested n -> n + | _ -> failwith "non-nested access for a nested type described as being in an auxiliary module") + Nested = seekReadNestedExportedTypes ctxt exported nested i + CustomAttrs = seekReadCustomAttrs ctxt (TaggedIndex(hca_ExportedType, i)) } + )) + and seekReadTopExportedTypes ctxt () = mkILExportedTypesLazy (lazy - let res = ref [] - for i = 1 to ctxt.getNumRows TableNames.ExportedType do - let (flags, _tok, nameIdx, namespaceIdx, implIdx) = seekReadExportedTypeRow ctxt i - if isTopTypeDef flags then - let (TaggedIndex(tag, _idx) ) = implIdx - - // the nested types will be picked up by their enclosing types - if tag <> i_ExportedType then - let nm = readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) - - let scoref = seekReadImplAsScopeRef ctxt implIdx - - let entry = - { ScopeRef=scoref - Name=nm - IsForwarder = ((flags &&& 0x00200000) <> 0) - Access=typeAccessOfFlags flags - Nested=seekReadNestedExportedTypes ctxt i - CustomAttrs=seekReadCustomAttrs ctxt (TaggedIndex(hca_ExportedType, i)) } - res := entry :: !res - done - List.rev !res) + let numRows = ctxt.getNumRows TableNames.ExportedType + let exported = [| for i in 1..numRows -> seekReadExportedTypeRow ctxt i |] + + // add each nested type id to their parent's children list + let nested = lazy ( + let nested = [| for _i in 1..numRows -> [] |] + for i = 1 to numRows do + let (flags,_,_,_,TaggedIndex(tag, idx)) = exported.[i-1] + if not (isTopTypeDef flags) && (tag = i_ExportedType) then + nested.[idx-1] <- i :: nested.[idx-1] + nested) + + // return top exported types + [ for i = 1 to numRows do + let (flags, _tok, nameIdx, namespaceIdx, implIdx) = exported.[i-1] + let (TaggedIndex(tag, _idx)) = implIdx + + // if not a nested type + if (isTopTypeDef flags) && (tag <> i_ExportedType) then + yield + { ScopeRef = seekReadImplAsScopeRef ctxt implIdx + Name = readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) + IsForwarder = ((flags &&& 0x00200000) <> 0) + Access = typeAccessOfFlags flags + Nested = seekReadNestedExportedTypes ctxt exported nested i + CustomAttrs = seekReadCustomAttrs ctxt (TaggedIndex(hca_ExportedType, i)) } + ]) #if !FX_NO_PDB_READER let getPdbReader opts infile = From 3ad69623b9a5264e75562333c430e32979673516 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Fri, 17 Nov 2017 23:56:18 +0300 Subject: [PATCH 129/150] Make Structure module public in FCS (#3910) Thanks for this. --- src/fsharp/vs/ServiceStructure.fsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/fsharp/vs/ServiceStructure.fsi b/src/fsharp/vs/ServiceStructure.fsi index 4e4fc9dde14..4c85cd9784d 100644 --- a/src/fsharp/vs/ServiceStructure.fsi +++ b/src/fsharp/vs/ServiceStructure.fsi @@ -7,7 +7,11 @@ open System.Collections.Generic open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Range +#if COMPILER_PUBLIC_API +module Structure = +#else module internal Structure = +#endif /// Collapse indicates the way a range/snapshot should be collapsed. `Same` is for a scope inside /// some kind of scope delimiter, e.g. `[| ... |]`, `[ ... ]`, `{ ... }`, etc. `Below` is for expressions /// following a binding or the right hand side of a pattern, e.g. `let x = ...` From 0c115950e2b5406e44e3969441e5e69ca00c3d02 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Fri, 17 Nov 2017 23:39:39 -0800 Subject: [PATCH 130/150] Added "no-test" argument for build script (#3970) * Added 'notest' argument for build * Quick rename * Fixed and * One last fix for and * Fixing build scripts * Simplifying no-test --- build.cmd | 9 ++++++++- build.sh | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index c2e9a0c6164..4a45c333df6 100644 --- a/build.cmd +++ b/build.cmd @@ -22,7 +22,7 @@ echo ^ echo ^ echo ^ echo ^ -echo ^ +echo ^ echo ^ echo ^ echo. @@ -82,6 +82,7 @@ REM ------------------ Parse all arguments ----------------------- set _autoselect=1 set _autoselect_tests=0 +set no_test=0 set /a counter=0 for /l %%x in (1 1 9) do ( set /a counter=!counter!+1 @@ -296,6 +297,10 @@ if /i "%ARG%" == "test" ( set _autoselect_tests=1 ) +if /i "%ARG%" == "no-test" ( + set no_test=1 +) + if /i "%ARG%" == "include" ( set /a counter=!counter!+1 if "!INCLUDE_TEST_SPEC_NUNIT!" == "" ( set INCLUDE_TEST_SPEC_NUNIT=cat == %ARG2% ) else (set INCLUDE_TEST_SPEC_NUNIT=cat == %ARG2% or !INCLUDE_TEST_SPEC_NUNIT! ) @@ -714,6 +719,8 @@ echo if "%TEST_NET40_COMPILERUNIT_SUITE%" == "0" if "%TEST_NET40_COREUNIT_SUITE%" == "0" if "%TEST_CORECLR_COREUNIT_SUITE%" == "0" if "%TEST_VS_IDEUNIT_SUITE%" == "0" if "%TEST_NET40_FSHARP_SUITE%" == "0" if "%TEST_NET40_FSHARPQA_SUITE%" == "0" goto :success +if "%no_test%" == "1" goto :success + echo ---------------- Done with update, starting tests ----------------------- if NOT "%INCLUDE_TEST_SPEC_NUNIT%" == "" ( diff --git a/build.sh b/build.sh index 1c8ebbf10fa..3d70ffc3ff6 100755 --- a/build.sh +++ b/build.sh @@ -29,7 +29,7 @@ build.sh ^ ^ ^ ^ - ^ + ^ ^ ^ @@ -104,6 +104,7 @@ export INCLUDE_TEST_TAGS= # Set up variables used to determine whether we'll automatically select which # targets to build/run/test. NOTE: These aren't exported, they're only used by this script. +no_test=0 _autoselect=1 _autoselect_tests=0 @@ -250,6 +251,9 @@ do "test") _autoselect_tests=1 ;; + "no-test") + no_test=1 + ;; "include") failwith "The 'include' option is not (yet) supported by this script." #export /a counter=!counter!+1 @@ -559,6 +563,11 @@ if [ "$TEST_NET40_COMPILERUNIT_SUITE" = '0' ] && [ "$TEST_PORTABLE_COREUNIT_SUIT exit 0 fi +if [ $no_test -eq 1 ]; then + # Successful build; not running tests so exit now. + exit 0 +fi + build_status "Done with update, starting tests" if [ -n "$INCLUDE_TEST_SPEC_NUNIT" ]; then From c03b9c1a5add17820a20327d34e22b0cd5796500 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 19 Nov 2017 10:50:21 -0800 Subject: [PATCH 131/150] Minor cleanup for Build Task (#3969) * For FSI on coreclr use ResolutionEnvironment.CompilationAndEvaluation just like on desktop * Trim fsi from buildtasks dll * Put back converter code * We don't support Itanium any longer * Remove Itanium testcase * Separate FSc and FSharpCommandLineBuilder, feedback * Move from Converter To Func --- .../FSharp.Build/FSharp.Build.fsproj | 3 +- .../FSharp.Build-proto.fsproj | 11 +- .../CreateFSharpManifestResourceName.fsi | 9 - src/fsharp/FSharp.Build/FSharp.Build.fsproj | 9 +- .../FSharp.Build/FSharpCommandLineBuilder.fs | 106 ++++++++ src/fsharp/FSharp.Build/Fsc.fs | 257 ++++++------------ src/fsharp/FSharp.Build/Fsc.fsi | 65 ----- .../FSharp.ProjectSystem.FSharp/Project.fs | 18 +- vsintegration/tests/unittests/Tests.Build.fs | 15 - 9 files changed, 208 insertions(+), 285 deletions(-) delete mode 100644 src/fsharp/FSharp.Build/CreateFSharpManifestResourceName.fsi create mode 100644 src/fsharp/FSharp.Build/FSharpCommandLineBuilder.fs delete mode 100644 src/fsharp/FSharp.Build/Fsc.fsi diff --git a/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj b/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj index 42febe9c5a5..0bbcd502150 100644 --- a/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj +++ b/src/buildfromsource/FSharp.Build/FSharp.Build.fsproj @@ -21,12 +21,11 @@ - + - Microsoft.FSharp.Targets diff --git a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj b/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj index a6505441b5b..e7ccc386e61 100644 --- a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj +++ b/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj @@ -22,16 +22,13 @@ CompilerLocationUtils.fs - - CreateFSharpManifestResourceName.fsi - CreateFSharpManifestResourceName.fs - - Fsc.fsi - - + + FSharpCommandLineBuilder.fs + + Fsc.fs diff --git a/src/fsharp/FSharp.Build/CreateFSharpManifestResourceName.fsi b/src/fsharp/FSharp.Build/CreateFSharpManifestResourceName.fsi deleted file mode 100644 index 549f1ab8366..00000000000 --- a/src/fsharp/FSharp.Build/CreateFSharpManifestResourceName.fsi +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace Microsoft.FSharp.Build - -[] -type CreateFSharpManifestResourceName = - inherit Microsoft.Build.Tasks.CreateCSharpManifestResourceName - public new : unit -> CreateFSharpManifestResourceName - member UseStandardResourceNames : bool with get,set \ No newline at end of file diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj index 5c8982e34c4..5bc7c9f75bc 100644 --- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj +++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -20,23 +20,16 @@ false false - - - - - - - + - Microsoft.FSharp.Targets diff --git a/src/fsharp/FSharp.Build/FSharpCommandLineBuilder.fs b/src/fsharp/FSharp.Build/FSharpCommandLineBuilder.fs new file mode 100644 index 00000000000..8ea25e12d61 --- /dev/null +++ b/src/fsharp/FSharp.Build/FSharpCommandLineBuilder.fs @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Build + +open System +open System.Text +open Microsoft.Build.Framework +open Microsoft.Build.Utilities +open Internal.Utilities + +[] +[] +do() + +type FSharpCommandLineBuilder () = + + // In addition to generating a command-line that will be handed to cmd.exe, we also generate + // an array of individual arguments. The former needs to be quoted (and cmd.exe will strip the + // quotes while parsing), whereas the latter is not. See bug 4357 for background; this helper + // class gets us out of the business of unparsing-then-reparsing arguments. + + let builder = new CommandLineBuilder() + let mutable args = [] // in reverse order + let mutable srcs = [] // in reverse order + + /// Return a list of the arguments (with no quoting for the cmd.exe shell) + member x.CapturedArguments() = List.rev args + + /// Return a list of the sources (with no quoting for the cmd.exe shell) + member x.CapturedFilenames() = List.rev srcs + + /// Return a full command line (with quoting for the cmd.exe shell) + override x.ToString() = builder.ToString() + + member x.AppendFileNamesIfNotNull(filenames:ITaskItem array, sep:string) = + builder.AppendFileNamesIfNotNull(filenames, sep) + // do not update "args", not used + for item in filenames do + let tmp = new CommandLineBuilder() + tmp.AppendSwitchUnquotedIfNotNull("", item.ItemSpec) // we don't want to quote the filename, this is a way to get that + let s = tmp.ToString() + if s <> String.Empty then + srcs <- tmp.ToString() :: srcs + + member x.AppendSwitchIfNotNull(switch:string, values:string array, sep:string) = + builder.AppendSwitchIfNotNull(switch, values, sep) + let tmp = new CommandLineBuilder() + tmp.AppendSwitchUnquotedIfNotNull(switch, values, sep) + let s = tmp.ToString() + if s <> String.Empty then + args <- s :: args + + member x.AppendSwitchIfNotNull(switch:string, value:string, ?metadataNames:string array) = + let metadataNames = defaultArg metadataNames [||] + builder.AppendSwitchIfNotNull(switch, value) + let tmp = new CommandLineBuilder() + tmp.AppendSwitchUnquotedIfNotNull(switch, value) + let providedMetaData = + metadataNames + |> Array.filter (String.IsNullOrWhiteSpace >> not) + if providedMetaData.Length > 0 then + tmp.AppendTextUnquoted "," + tmp.AppendTextUnquoted (providedMetaData|> String.concat ",") + let s = tmp.ToString() + if s <> String.Empty then + args <- s :: args + + member x.AppendSwitchUnquotedIfNotNull(switch:string, value:string) = + assert(switch = "") // we only call this method for "OtherFlags" + // Unfortunately we still need to mimic what cmd.exe does, but only for "OtherFlags". + let ParseCommandLineArgs(commandLine:string) = // returns list in reverse order + let mutable args = [] + let mutable i = 0 // index into commandLine + let len = commandLine.Length + while i < len do + // skip whitespace + while i < len && System.Char.IsWhiteSpace(commandLine, i) do + i <- i + 1 + if i < len then + // parse an argument + let sb = new StringBuilder() + let mutable finished = false + let mutable insideQuote = false + while i < len && not finished do + match commandLine.[i] with + | '"' -> insideQuote <- not insideQuote; i <- i + 1 + | c when not insideQuote && System.Char.IsWhiteSpace(c) -> finished <- true + | c -> sb.Append(c) |> ignore; i <- i + 1 + args <- sb.ToString() :: args + args + builder.AppendSwitchUnquotedIfNotNull(switch, value) + let tmp = new CommandLineBuilder() + tmp.AppendSwitchUnquotedIfNotNull(switch, value) + let s = tmp.ToString() + if s <> String.Empty then + args <- ParseCommandLineArgs(s) @ args + + member x.AppendSwitch(switch:string) = + builder.AppendSwitch(switch) + args <- switch :: args + + member internal x.GetCapturedArguments() = + [| + yield! x.CapturedArguments() + yield! x.CapturedFilenames() + |] diff --git a/src/fsharp/FSharp.Build/Fsc.fs b/src/fsharp/FSharp.Build/Fsc.fs index 2d1bc51cea7..f397c50914c 100644 --- a/src/fsharp/FSharp.Build/Fsc.fs +++ b/src/fsharp/FSharp.Build/Fsc.fs @@ -3,125 +3,28 @@ namespace Microsoft.FSharp.Build open System -open System.Text -open System.Diagnostics.CodeAnalysis +open System.Diagnostics +open System.Globalization open System.IO open System.Reflection open Microsoft.Build.Framework open Microsoft.Build.Utilities open Internal.Utilities -[] -[] - -[] -do() - - #if FX_RESHAPED_REFLECTION open Microsoft.FSharp.Core.ReflectionAdapters #endif -type FscCommandLineBuilder () = - - // In addition to generating a command-line that will be handed to cmd.exe, we also generate - // an array of individual arguments. The former needs to be quoted (and cmd.exe will strip the - // quotes while parsing), whereas the latter is not. See bug 4357 for background; this helper - // class gets us out of the business of unparsing-then-reparsing arguments. - - let builder = new CommandLineBuilder() - let mutable args = [] // in reverse order - let mutable srcs = [] // in reverse order - /// Return a list of the arguments (with no quoting for the cmd.exe shell) - member x.CapturedArguments() = - List.rev args - /// Return a list of the sources (with no quoting for the cmd.exe shell) - member x.CapturedFilenames() = - List.rev srcs - /// Return a full command line (with quoting for the cmd.exe shell) - override x.ToString() = - builder.ToString() - - member x.AppendFileNamesIfNotNull(filenames:ITaskItem array, sep:string) = - builder.AppendFileNamesIfNotNull(filenames, sep) - // do not update "args", not used - for item in filenames do - let tmp = new CommandLineBuilder() - tmp.AppendSwitchUnquotedIfNotNull("", item.ItemSpec) // we don't want to quote the filename, this is a way to get that - let s = tmp.ToString() - if s <> String.Empty then - srcs <- tmp.ToString() :: srcs - - member x.AppendSwitchIfNotNull(switch:string, values:string array, sep:string) = - builder.AppendSwitchIfNotNull(switch, values, sep) - let tmp = new CommandLineBuilder() - tmp.AppendSwitchUnquotedIfNotNull(switch, values, sep) - let s = tmp.ToString() - if s <> String.Empty then - args <- s :: args - - member x.AppendSwitchIfNotNull(switch:string, value:string, ?metadataNames:string array) = - let metadataNames = defaultArg metadataNames [||] - builder.AppendSwitchIfNotNull(switch, value) - let tmp = new CommandLineBuilder() - tmp.AppendSwitchUnquotedIfNotNull(switch, value) - let providedMetaData = - metadataNames - |> Array.filter (String.IsNullOrWhiteSpace >> not) - if providedMetaData.Length > 0 then - tmp.AppendTextUnquoted "," - tmp.AppendTextUnquoted (providedMetaData|> String.concat ",") - let s = tmp.ToString() - if s <> String.Empty then - args <- s :: args - - member x.AppendSwitchUnquotedIfNotNull(switch:string, value:string) = - assert(switch = "") // we only call this method for "OtherFlags" - // Unfortunately we still need to mimic what cmd.exe does, but only for "OtherFlags". - let ParseCommandLineArgs(commandLine:string) = // returns list in reverse order - let mutable args = [] - let mutable i = 0 // index into commandLine - let len = commandLine.Length - while i < len do - // skip whitespace - while i < len && System.Char.IsWhiteSpace(commandLine, i) do - i <- i + 1 - if i < len then - // parse an argument - let sb = new StringBuilder() - let mutable finished = false - let mutable insideQuote = false - while i < len && not finished do - match commandLine.[i] with - | '"' -> insideQuote <- not insideQuote; i <- i + 1 - | c when not insideQuote && System.Char.IsWhiteSpace(c) -> finished <- true - | c -> sb.Append(c) |> ignore; i <- i + 1 - args <- sb.ToString() :: args - args - builder.AppendSwitchUnquotedIfNotNull(switch, value) - let tmp = new CommandLineBuilder() - tmp.AppendSwitchUnquotedIfNotNull(switch, value) - let s = tmp.ToString() - if s <> String.Empty then - args <- ParseCommandLineArgs(s) @ args - - member x.AppendSwitch(switch:string) = - builder.AppendSwitch(switch) - args <- switch :: args - - member internal x.GetCapturedArguments() = - [| - yield! x.CapturedArguments() - yield! x.CapturedFilenames() - |] - //There are a lot of flags on fsc.exe. //For now, not all of them are represented in the "Fsc class" object model. //The goal is to have the most common/important flags available via the Fsc class, and the //rest can be "backdoored" through the .OtherFlags property. -type [] Fsc() as this = - inherit ToolTask() +[] +type public Fsc () as this = + + inherit ToolTask () + let mutable baseAddress : string = null let mutable capturedArguments : string list = [] // list of individual args, to pass to HostObject Compile() let mutable capturedFilenames : string list = [] // list of individual source filenames, to pass to HostObject Compile() @@ -160,9 +63,9 @@ type [.Assembly.Location)) + let mutable toolPath : string = + let locationOfThisDll = + try Some(Path.GetDirectoryName(typeof.Assembly.Location)) with _ -> None match FSharpEnvironment.BinFolderOfDefaultFSharpCompiler(locationOfThisDll) with | Some s -> s @@ -178,18 +81,11 @@ type [ null with e-> false - do if not runningOnMono then - typeof.InvokeMember("YieldDuringToolExecution",(BindingFlags.Instance ||| BindingFlags.SetProperty ||| BindingFlags.Public),null,this,[| box true |]) |> ignore -#else - do this.YieldDuringToolExecution <- true // See bug 6483; this makes parallel build faster, and is fine to set unconditionally -#endif + // See bug 6483; this makes parallel build faster, and is fine to set unconditionally + do this.YieldDuringToolExecution <- true let generateCommandLineBuilder () = - let builder = new FscCommandLineBuilder() + let builder = new FSharpCommandLineBuilder() // OutputAssembly builder.AppendSwitchIfNotNull("-o:", outputAssembly) // CodePage @@ -198,7 +94,7 @@ type [ null @@ -219,7 +115,7 @@ type [ null then for item in defineConstants do - builder.AppendSwitchIfNotNull("--define:", item.ItemSpec) + builder.AppendSwitchIfNotNull("--define:", item.ItemSpec) // DocumentationFile builder.AppendSwitchIfNotNull("--doc:", documentationFile) // GenerateInterfaceFile @@ -238,7 +134,7 @@ type [ "anycpu" | "X86" , _, _ -> "x86" | "X64" , _, _ -> "x64" - | "ITANIUM", _, _ -> "Itanium" - | _ -> null) + | _ -> null) // Resources if resources <> null then for item in resources do match useStandardResourceNames with | true -> builder.AppendSwitchIfNotNull("--resource:", item.ItemSpec, [|item.GetMetadata("LogicalName"); item.GetMetadata("Access")|]) | false -> builder.AppendSwitchIfNotNull("--resource:", item.ItemSpec) - + // VersionFile builder.AppendSwitchIfNotNull("--versionfile:", versionFile) // References @@ -266,7 +161,7 @@ type [ null | _ -> referencePath.Split([|';'; ','|], StringSplitOptions.RemoveEmptyEntries) - + builder.AppendSwitchIfNotNull("--lib:", referencePathArray, ",") // TargetType builder.AppendSwitchIfNotNull("--target:", @@ -296,9 +191,9 @@ type [ [|"76"|] - | _ -> (warningsAsErrors + " 76 ").Split([|' '; ';'; ','|], StringSplitOptions.RemoveEmptyEntries) + | _ -> (warningsAsErrors + " 76 ").Split([|' '; ';'; ','|], StringSplitOptions.RemoveEmptyEntries) - builder.AppendSwitchIfNotNull("--warnaserror:", warningsAsErrorsArray, ",") + builder.AppendSwitchIfNotNull("--warnaserror:", warningsAsErrorsArray, ",") // Win32ResourceFile builder.AppendSwitchIfNotNull("--win32res:", win32res) @@ -306,16 +201,16 @@ type [: Specify the codepage to use when opening source files member fsc.CodePage @@ -369,7 +264,7 @@ type [: Do not report the given specific warning. member fsc.DisabledWarnings with get() = disabledWarnings - and set(a) = disabledWarnings <- a + and set(a) = disabledWarnings <- a // --define : Define the given conditional compilation symbol. member fsc.DefineConstants @@ -399,7 +294,7 @@ type [: // Sign the assembly the given keypair file, as produced @@ -435,13 +330,13 @@ type [: Name the output file. + // -o : Name the output file member fsc.OutputAssembly with get() = outputAssembly and set(s) = outputAssembly <- s // --pdb : - // Name the debug output file. + // Name the debug output file member fsc.PdbFile with get() = pdbFile and set(s) = pdbFile <- s @@ -449,36 +344,35 @@ type [: Limit which platforms this code can run on: // x86 // x64 - // Itanium // anycpu // anycpu32bitpreferred member fsc.Platform with get() = platform - and set(s) = platform <- s + and set(s) = platform <- s // indicator whether anycpu32bitpreferred is applicable or not member fsc.Prefer32Bit with get() = prefer32bit - and set(s) = prefer32bit <- s + and set(s) = prefer32bit <- s member fsc.PreferredUILang with get() = preferredUILang - and set(s) = preferredUILang <- s + and set(s) = preferredUILang <- s - member fsc.ProvideCommandLineArgs + member fsc.ProvideCommandLineArgs with get() = provideCommandLineArgs and set(p) = provideCommandLineArgs <- p member fsc.PublicSign with get() = publicSign - and set(s) = publicSign <- s + and set(s) = publicSign <- s // -r : Reference an F# or .NET assembly. - member fsc.References - with get() = references + member fsc.References + with get() = references and set(a) = references <- a - // --lib + // --lib member fsc.ReferencePath with get() = referencePath and set(s) = referencePath <- s @@ -489,7 +383,7 @@ type [: member fsc.VersionFile with get() = versionFile and set(s) = versionFile <- s - // For specifying a win32 native resource file (.res) + // For specifying a win32 native resource file (.res) member fsc.Win32ResourceFile with get() = win32res and set(s) = win32res <- s - + // For specifying a win32 manifest file member fsc.Win32ManifestFile with get() = win32manifest and set(m) = win32manifest <- m - // For specifying the warning level (0-4) + // For specifying the warning level (0-4) member fsc.WarningLevel with get() = warningLevel and set(s) = warningLevel <- s @@ -591,7 +486,7 @@ type [ Array.map (fun (arg: string) -> TaskItem(arg) :> ITaskItem) |> Array.toList @@ -604,30 +499,42 @@ type [ base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) | _ -> let sources = sources|>Array.map(fun i->i.ItemSpec) -#if FX_NO_CONVERTER - let baseCallDelegate = new Func(fun () -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) ) -#else - let baseCall = fun (dummy : int) -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) - // We are using a Converter rather than a "unit->int" because it is too hard to - // figure out how to pass an F# function object via reflection. - let baseCallDelegate = new System.Converter(baseCall) -#endif - try - let ret = - (host.GetType()).InvokeMember("Compile", BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.InvokeMethod ||| BindingFlags.Instance, null, host, - [| baseCallDelegate; box (capturedArguments |> List.toArray); box (capturedFilenames |> List.toArray) |], - System.Globalization.CultureInfo.InvariantCulture) - unbox ret - with - | :? System.Reflection.TargetInvocationException as tie when (match tie.InnerException with | :? Microsoft.Build.Exceptions.BuildAbortedException -> true | _ -> false) -> - fsc.Log.LogError(tie.InnerException.Message, [| |]) - -1 // ok, this is what happens when VS IDE cancels the build, no need to assert, just log the build-canceled error and return -1 to denote task failed + let invokeCompiler baseCallDelegate = + try + let ret = + (host.GetType()).InvokeMember("Compile", BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.InvokeMethod ||| BindingFlags.Instance, null, host, + [| baseCallDelegate; box (capturedArguments |> List.toArray); box (capturedFilenames |> List.toArray) |], + CultureInfo.InvariantCulture) + unbox ret + with + | :? TargetInvocationException as tie when (match tie.InnerException with | :? Microsoft.Build.Exceptions.BuildAbortedException -> true | _ -> false) -> + fsc.Log.LogError(tie.InnerException.Message, [| |]) + -1 // ok, this is what happens when VS IDE cancels the build, no need to assert, just log the build-canceled error and return -1 to denote task failed + | e -> reraise() + + // Todo: Remove !FX_NO_CONVERTER code path for VS2017.7 + // Earlier buildtasks usesd System.Converter for cross platform we are moving to Func + // This is so that during the interim, earlier VS's will still load the OSS project + let baseCallDelegate = Func(fun () -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) ) + try + invokeCompiler baseCallDelegate + with | e -> - System.Diagnostics.Debug.Assert(false, "HostObject received by Fsc task did not have a Compile method or the compile method threw an exception. "+(e.ToString())) - reraise() +#if !FX_NO_CONVERTER + try + let baseCall = fun (dummy : int) -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) + // We are using a Converter rather than a "unit->int" because it is too hard to + // figure out how to pass an F# function object via reflection. + let baseCallDelegate = new System.Converter(baseCall) + invokeCompiler baseCallDelegate + with + | e -> +#endif + Debug.Assert(false, "HostObject received by Fsc task did not have a Compile method or the compile method threw an exception. "+(e.ToString())) + reraise() override fsc.GenerateCommandLineCommands() = - let builder = new FscCommandLineBuilder() + let builder = new FSharpCommandLineBuilder() if not (String.IsNullOrEmpty(dotnetFscCompilerPath)) then builder.AppendSwitch(dotnetFscCompilerPath) builder.ToString() @@ -640,18 +547,14 @@ type [] - do() diff --git a/src/fsharp/FSharp.Build/Fsc.fsi b/src/fsharp/FSharp.Build/Fsc.fsi deleted file mode 100644 index e05d4f9e69e..00000000000 --- a/src/fsharp/FSharp.Build/Fsc.fsi +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -/// This namespace contains. MSBuild tasks for the FsYacc and FsLex tools. -namespace Microsoft.FSharp.Build -type Fsc = class - inherit Microsoft.Build.Utilities.ToolTask - new : unit -> Fsc - override GenerateCommandLineCommands : unit -> System.String - override GenerateFullPathToTool : unit -> System.String - override ToolName : System.String - override StandardErrorEncoding : System.Text.Encoding - override StandardOutputEncoding : System.Text.Encoding - - member internal InternalGenerateFullPathToTool : unit -> System.String - member internal InternalGenerateCommandLineCommands : unit -> System.String - member internal InternalGenerateResponseFileCommands : unit -> System.String - member internal InternalExecuteTool : string * string * string -> int - member internal GetCapturedArguments : unit -> string[] - member BaseAddress : string with get,set - member CodePage : string with get,set - member CommandLineArgs : Microsoft.Build.Framework.ITaskItem [] with get,set - member DebugSymbols : bool with get,set - member DebugType : string with get,set - member DefineConstants : Microsoft.Build.Framework.ITaskItem [] with get,set - member DelaySign : bool with get,set - member DisabledWarnings : string with get,set - member DocumentationFile : string with get,set - member DotnetFscCompilerPath : string with get,set - member Embed : string with get,set - member EmbedAllSources : bool with get,set - member GenerateInterfaceFile : string with get,set - member HighEntropyVA : bool with get,set - member KeyFile : string with get,set - member LCID : string with get,set - member NoFramework : bool with get,set - member Optimize : bool with get,set - member OtherFlags : string with get,set - member OutputAssembly : string with get,set - member PdbFile : string with get,set - member Platform : string with get,set - member Prefer32Bit : bool with get,set - member PreferredUILang : string with get,set - member ProvideCommandLineArgs : bool with get,set - member PublicSign : bool with get,set - member VersionFile : string with get,set - member References : Microsoft.Build.Framework.ITaskItem [] with get,set - member ReferencePath : string with get,set - member Resources : Microsoft.Build.Framework.ITaskItem [] with get,set - member SkipCompilerExecution : bool with get,set - member SourceLink : string with get,set - member Sources : Microsoft.Build.Framework.ITaskItem [] with get,set - member SubsystemVersion : string with get,set - member Tailcalls : bool with get,set - member TargetType : string with get,set - member ToolPath : string with get,set - member TargetProfile : string with get,set - member TreatWarningsAsErrors : bool with get,set - member UseStandardResourceNames : bool with get,set - member Utf8Output : bool with get,set - member VisualStudioStyleErrors : bool with get,set - member WarningLevel : string with get,set - member WarningsAsErrors : string with get,set - member Win32ResourceFile : string with get,set - member Win32ManifestFile : string with get,set - end diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 1a4732cf1e5..8e11b8651f6 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -1290,8 +1290,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem let result = base.InvokeMsBuild(target, extraProperties) result - // Fulfill HostObject contract with Fsc task, and enable 'capture' of compiler flags for the project. - member x.Compile(compile:System.Converter, flags:string[], sources:string[]) = + member x.CoreCompile(flags:string[], sources:string[]) = // Note: This method may be called from non-UI thread! The Fsc task in FSharp.Build.dll invokes this method via reflection, and // the Fsc task is typically created by MSBuild on a background thread. So be careful. #if DEBUG @@ -1306,11 +1305,26 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem if projectSite.State = ProjectSiteOptionLifetimeState.Opening then // This is the first time, so set up interface for language service to talk to us projectSite.Open(x.CreateRunningProjectSite()) + + // ===================================================================================================== + // Todo: x.Compile(compile:System.Converter, flags:string[], sources:string[]) for VS2017.7 + // Earlier buildtasks usesd System.Converter for cross platform we are moving to Func + // This is so that during the interim, earlier VS's will still load the OSS project + // ===================================================================================================== + member x.Compile(compile:System.Converter, flags:string[], sources:string[]) = + x.CoreCompile(flags, sources) if actuallyBuild then compile.Invoke(0) else 0 + member x.Compile(compile:Func, flags:string[], sources:string[]) = + x.CoreCompile(flags, sources) + if actuallyBuild then + compile.Invoke() + else + 0 + member __.CompilationSourceFiles = match sourcesAndFlags with None -> [| |] | Some (sources,_) -> sources member __.CompilationOptions = match sourcesAndFlags with None -> [| |] | Some (_,flags) -> flags member __.CompilationReferences = match normalizedRefs with None -> [| |] | Some refs -> refs diff --git a/vsintegration/tests/unittests/Tests.Build.fs b/vsintegration/tests/unittests/Tests.Build.fs index e5bbddc166c..22faaef01a8 100644 --- a/vsintegration/tests/unittests/Tests.Build.fs +++ b/vsintegration/tests/unittests/Tests.Build.fs @@ -336,21 +336,6 @@ type Build() = "--highentropyva-" + Environment.NewLine) cmd - [] - member public this.TestPlatform2() = - let tool = new Microsoft.FSharp.Build.Fsc() - tool.Platform <- "itanium" - AssertEqual "itanium" tool.Platform - let cmd = tool.InternalGenerateResponseFileCommands() - printfn "cmd=\"%s\"" cmd - AssertEqual ("--optimize+" + Environment.NewLine + - "--platform:Itanium" + Environment.NewLine + - "--warnaserror:76" + Environment.NewLine + - "--fullpaths" + Environment.NewLine + - "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) - cmd - [] member public this.TestPlatform3() = let tool = new Microsoft.FSharp.Build.Fsc() From 39d84594a528a21f271e4e6a363964617e71146c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 20 Nov 2017 01:50:25 +0300 Subject: [PATCH 132/150] Better completion (#3940) * suggests types and modules only at pattern type position (x: ...) * handle all places where type can be used * fix * union cases should not appear in completion at type hint position --- src/fsharp/vs/ServiceParseTreeWalk.fs | 62 +++++++++++++++++-- src/fsharp/vs/ServiceUntypedParse.fs | 8 +++ src/fsharp/vs/ServiceUntypedParse.fsi | 2 + src/fsharp/vs/service.fs | 13 ++++ .../Tests.LanguageService.Completion.fs | 2 +- 5 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/fsharp/vs/ServiceParseTreeWalk.fs b/src/fsharp/vs/ServiceParseTreeWalk.fs index 992570be687..9dddedb6276 100755 --- a/src/fsharp/vs/ServiceParseTreeWalk.fs +++ b/src/fsharp/vs/ServiceParseTreeWalk.fs @@ -90,9 +90,15 @@ module internal AstTraversal = /// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings abstract VisitLetOrUse : SynBinding list * range -> 'T option default this.VisitLetOrUse (_, _) = None - + /// VisitType allows overriding behavior when visiting simple pats abstract VisitSimplePats : SynSimplePat list -> 'T option default this.VisitSimplePats (_) = None + /// VisitPat allows overriding behavior when visiting patterns + abstract VisitPat : (SynPat -> 'T option) * SynPat -> 'T option + default this.VisitPat (defaultTraverse, pat) = defaultTraverse pat + /// VisitType allows overriding behavior when visiting type hints (x: ..., etc.) + abstract VisitType : (SynType -> 'T option) * SynType -> 'T option + default this.VisitType (defaultTraverse, ty) = defaultTraverse ty let dive node range project = range,(fun() -> project node) @@ -189,12 +195,12 @@ module internal AstTraversal = dive synExpr2 synExpr2.Range traverseSynExpr] |> pick expr | SynExpr.Const(_synConst, _range) -> None - | SynExpr.Typed(synExpr, _synType, _range) -> traverseSynExpr synExpr + | SynExpr.Typed(synExpr, synType, _range) -> [ traverseSynExpr synExpr; traverseSynType synType ] |> List.tryPick id | SynExpr.Tuple(synExprList, _, _range) | SynExpr.StructTuple(synExprList, _, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr | SynExpr.ArrayOrList(_, synExprList, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr | SynExpr.Record(inheritOpt,copyOpt,fields, _range) -> - [ + [ let diveIntoSeparator offsideColumn scPosOpt copyOpt = match scPosOpt with | Some scPos -> @@ -448,6 +454,50 @@ module internal AstTraversal = visitor.VisitExpr(path, traverseSynExpr path, defaultTraverse, expr) + and traversePat (pat: SynPat) = + let defaultTraverse p = + match p with + | SynPat.Paren (p, _) -> traversePat p + | SynPat.Or (p1, p2, _) -> [ p1; p2] |> List.tryPick traversePat + | SynPat.Ands (ps, _) + | SynPat.Tuple (ps, _) + | SynPat.StructTuple (ps, _) + | SynPat.ArrayOrList (_, ps, _) -> ps |> List.tryPick traversePat + | SynPat.Attrib (p, _, _) -> traversePat p + | SynPat.LongIdent(_, _, _, args, _, _) -> + match args with + | SynConstructorArgs.Pats ps -> ps |> List.tryPick traversePat + | SynConstructorArgs.NamePatPairs (ps, _) -> + ps |> List.map snd |> List.tryPick traversePat + | SynPat.Typed (p, ty, _) -> + [ traversePat p; traverseSynType ty ] |> List.tryPick id + | _ -> None + + visitor.VisitPat (defaultTraverse, pat) + + and traverseSynType (ty: SynType) = + let defaultTraverse ty = + match ty with + | SynType.App (typeName, _, typeArgs, _, _, _, _) + | SynType.LongIdentApp (typeName, _, _, typeArgs, _, _, _) -> + [ yield typeName + yield! typeArgs ] + |> List.tryPick traverseSynType + | SynType.Fun (ty1, ty2, _) -> [ty1; ty2] |> List.tryPick traverseSynType + | SynType.MeasurePower (ty, _, _) + | SynType.HashConstraint (ty, _) + | SynType.WithGlobalConstraints (ty, _, _) + | SynType.Array (_, ty, _) -> traverseSynType ty + | SynType.StaticConstantNamed (ty1, ty2, _) + | SynType.MeasureDivide (ty1, ty2, _) -> [ty1; ty2] |> List.tryPick traverseSynType + | SynType.Tuple (tys, _) + | SynType.StructTuple (tys, _) -> tys |> List.map snd |> List.tryPick traverseSynType + | SynType.StaticConstantExpr (expr, _) -> traverseSynExpr [] expr + | SynType.Anon _ -> None + | _ -> None + + visitor.VisitType (defaultTraverse, ty) + and normalizeMembersToDealWithPeculiaritiesOfGettersAndSetters path traverseInherit (synMemberDefns:SynMemberDefns) = synMemberDefns // property getters are setters are two members that can have the same range, so do some somersaults to deal with this @@ -566,8 +616,10 @@ module internal AstTraversal = let defaultTraverse b = let path = TraverseStep.Binding b :: path match b with - | (SynBinding.Binding(_synAccessOption, _synBindingKind, _, _, _synAttributes, _preXmlDoc, _synValData, _synPat, _synBindingReturnInfoOption, synExpr, _range, _sequencePointInfoForBinding)) -> - traverseSynExpr path synExpr + | (SynBinding.Binding(_synAccessOption, _synBindingKind, _, _, _synAttributes, _preXmlDoc, _synValData, synPat, _synBindingReturnInfoOption, synExpr, _range, _sequencePointInfoForBinding)) -> + [ traversePat synPat + traverseSynExpr path synExpr ] + |> List.tryPick id visitor.VisitBinding(defaultTraverse,b) match parseTree with diff --git a/src/fsharp/vs/ServiceUntypedParse.fs b/src/fsharp/vs/ServiceUntypedParse.fs index c5e30bf3df0..dff684fe526 100755 --- a/src/fsharp/vs/ServiceUntypedParse.fs +++ b/src/fsharp/vs/ServiceUntypedParse.fs @@ -79,6 +79,8 @@ type CompletionContext = | ParameterList of pos * HashSet | AttributeApplication | OpenDeclaration + /// completing pattern type (e.g. foo (x: |)) + | PatternType //---------------------------------------------------------------------------- // FSharpParseFileResults @@ -1272,6 +1274,12 @@ module UntypedParseImpl = else None | _ -> defaultTraverse decl + + member __.VisitType(defaultTraverse, ty) = + match ty with + | SynType.LongIdent _ when rangeContainsPos ty.Range pos -> + Some CompletionContext.PatternType + | _ -> defaultTraverse ty } AstTraversal.Traverse(pos, pt, walker) diff --git a/src/fsharp/vs/ServiceUntypedParse.fsi b/src/fsharp/vs/ServiceUntypedParse.fsi index 9a2c8379d53..62485fdefa2 100755 --- a/src/fsharp/vs/ServiceUntypedParse.fsi +++ b/src/fsharp/vs/ServiceUntypedParse.fsi @@ -104,6 +104,8 @@ type internal CompletionContext = | ParameterList of pos * HashSet | AttributeApplication | OpenDeclaration + /// completing pattern type (e.g. foo (x: |)) + | PatternType #if COMPILER_PUBLIC_API type ModuleKind = { IsAutoOpen: bool; HasModuleSuffix: bool } diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 10f2c61926e..f40cc61dc46 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -870,6 +870,19 @@ type TypeCheckInfo |> Option.map (fun (items, denv, m) -> items |> List.filter (fun x -> match x.Item with Item.ModuleOrNamespaces _ -> true | _ -> false), denv, m) + // Completion at '(x: ...)" + | Some (CompletionContext.PatternType) -> + GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck, false, getAllSymbols) + |> Option.map (fun (items, denv, m) -> + items + |> List.filter (fun cItem -> + match cItem.Item with + | Item.ModuleOrNamespaces _ + | Item.Types _ + | Item.UnqualifiedType _ + | Item.ExnCase _ -> true + | _ -> false), denv, m) + // Other completions | cc -> match residueOpt |> Option.bind Seq.tryHead with diff --git a/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs b/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs index c0e9a06e920..6550016be40 100644 --- a/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs +++ b/vsintegration/tests/unittests/Tests.LanguageService.Completion.fs @@ -6063,7 +6063,7 @@ let rec f l = let f (x:MyNamespace1.MyModule(*Maftervariable4*)) = 10 let y = int System.IO(*Maftervariable5*)""", marker = "(*Maftervariable4*)", - list = ["DuType";"Tag"]) + list = ["DuType"]) [] member this.``VariableIdentifier.SystemNamespace``() = From ae6f593dddac96dacd8189bc64da07529915e2ce Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 20 Nov 2017 06:57:03 +0300 Subject: [PATCH 133/150] Add static members to the extended completion (#3949) * add static members to the extended completion * provide static method in completion for any type --- src/fsharp/vs/ServiceAssemblyContent.fs | 48 +++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/fsharp/vs/ServiceAssemblyContent.fs b/src/fsharp/vs/ServiceAssemblyContent.fs index 56fae895c6b..2cc99bceeaf 100644 --- a/src/fsharp/vs/ServiceAssemblyContent.fs +++ b/src/fsharp/vs/ServiceAssemblyContent.fs @@ -119,16 +119,18 @@ type AssemblyContentType = Public | Full type Parent = { Namespace: Idents option - ThisRequiresQualifiedAccess: Idents option - TopRequiresQualifiedAccess: Idents option + ThisRequiresQualifiedAccess: (* isForMemberOrValue *) bool -> Idents option + TopRequiresQualifiedAccess: (* isForMemberOrValue *) bool -> Idents option AutoOpen: Idents option - WithModuleSuffix: Idents option } + WithModuleSuffix: Idents option + IsModule: bool } static member Empty = { Namespace = None - ThisRequiresQualifiedAccess = None - TopRequiresQualifiedAccess = None + ThisRequiresQualifiedAccess = fun _ -> None + TopRequiresQualifiedAccess = fun _ -> None AutoOpen = None - WithModuleSuffix = None } + WithModuleSuffix = None + IsModule = true } static member RewriteParentIdents (parentIdents: Idents option) (idents: Idents) = match parentIdents with | Some p when p.Length <= idents.Length -> @@ -190,8 +192,8 @@ module AssemblyContentProvider = { FullName = fullName CleanedIdents = cleanIdents Namespace = ns - NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess |> Option.map parent.FixParentModuleSuffix - TopRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess |> Option.map parent.FixParentModuleSuffix + NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix + TopRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix AutoOpenParent = parent.AutoOpen |> Option.map parent.FixParentModuleSuffix Symbol = entity Kind = fun lookupType -> @@ -210,13 +212,14 @@ module AssemblyContentProvider = let private traverseMemberFunctionAndValues ns (parent: Parent) (membersFunctionsAndValues: seq) = membersFunctionsAndValues + |> Seq.filter (fun x -> not x.IsInstanceMember) |> Seq.collect (fun func -> let processIdents fullName idents = { FullName = fullName CleanedIdents = parent.FixParentModuleSuffix idents Namespace = ns - NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess |> Option.map parent.FixParentModuleSuffix - TopRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess |> Option.map parent.FixParentModuleSuffix + NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess true |> Option.map parent.FixParentModuleSuffix + TopRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess true |> Option.map parent.FixParentModuleSuffix AutoOpenParent = parent.AutoOpen |> Option.map parent.FixParentModuleSuffix Symbol = func Kind = fun _ -> EntityKind.FunctionOrValue func.IsActivePattern } @@ -253,14 +256,14 @@ module AssemblyContentProvider = | Some x -> yield x | None -> () - let thisRequiresQualifierAccess = - if entity.IsFSharp && Symbol.hasAttribute entity.Attributes then - parent.FormatEntityFullName entity |> Option.map snd - else None + let rqa = parent.FormatEntityFullName entity |> Option.map snd + let rqaForType = if entity.IsFSharp && Symbol.hasAttribute entity.Attributes then rqa else None + let thisRequiresQualifierAccess (isForMethodOrValue: bool) = if isForMethodOrValue then rqa else rqaForType let currentParent = - { ThisRequiresQualifiedAccess = thisRequiresQualifierAccess |> Option.orElse parent.ThisRequiresQualifiedAccess - TopRequiresQualifiedAccess = parent.TopRequiresQualifiedAccess |> Option.orElse thisRequiresQualifierAccess + { ThisRequiresQualifiedAccess = thisRequiresQualifierAccess >> Option.orElse (parent.ThisRequiresQualifiedAccess false) + TopRequiresQualifiedAccess = fun forMV -> (parent.TopRequiresQualifiedAccess false) |> Option.orElse (thisRequiresQualifierAccess forMV) + AutoOpen = let isAutoOpen = entity.IsFSharpModule && Symbol.hasAttribute entity.Attributes match isAutoOpen, parent.AutoOpen with @@ -275,13 +278,14 @@ module AssemblyContentProvider = if entity.IsFSharpModule && Symbol.hasModuleSuffixAttribute entity then currentEntity |> Option.map (fun e -> e.CleanedIdents) else parent.WithModuleSuffix - Namespace = ns } - if entity.IsFSharpModule then - match entity.TryGetMembersFunctionsAndValues with - | xs when xs.Count > 0 -> - yield! traverseMemberFunctionAndValues ns currentParent xs - | _ -> () + Namespace = ns + IsModule = entity.IsFSharpModule } + + match entity.TryGetMembersFunctionsAndValues with + | xs when xs.Count > 0 -> + yield! traverseMemberFunctionAndValues ns currentParent xs + | _ -> () for e in (try entity.NestedEntities :> _ seq with _ -> Seq.empty) do yield! traverseEntity contentType currentParent e From e0596f3a3aaf6f7c8655797bde16110d4d87e50a Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 20 Nov 2017 06:57:38 +0300 Subject: [PATCH 134/150] fix error range of wrong namespace in open declaration (#3966) --- src/fsharp/NameResolution.fs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 1962251c389..a80ddbf1df6 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1767,11 +1767,11 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,suggestModulesAndNamespaces)) - let moduleNotFoundErrorCache = ref None - let moduleNotFound (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) id depth = - match !moduleNotFoundErrorCache with - | Some error -> error - | None -> + let mutable moduleNotFoundErrorCache = None + let moduleNotFound (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (id:Ident) depth = + match moduleNotFoundErrorCache with + | Some (oldId, error) when oldId = id.idRange -> error + | _ -> let suggestNames() = mty.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible amap m ad (modref.NestedTyconRef kv.Value)) @@ -1779,7 +1779,7 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne |> HashSet let error = raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespace,id,suggestNames)) - moduleNotFoundErrorCache := Some error + moduleNotFoundErrorCache <- Some(id.idRange, error) error match moduleOrNamespaces.TryFind id.idText with From d8544fe2fd08c1603fcc8501462e58ffdeedc9f9 Mon Sep 17 00:00:00 2001 From: ncave Date: Sun, 19 Nov 2017 20:10:39 -0800 Subject: [PATCH 135/150] minor IL simplification (#3975) --- src/fsharp/FSharp.Core/list.fs | 24 +++++++++--------------- src/fsharp/FSharp.Core/list.fsi | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/fsharp/FSharp.Core/list.fs b/src/fsharp/FSharp.Core/list.fs index 6b31ea2b0f8..fdda3f9fc7d 100644 --- a/src/fsharp/FSharp.Core/list.fs +++ b/src/fsharp/FSharp.Core/list.fs @@ -212,15 +212,11 @@ namespace Microsoft.FSharp.Collections [] let fold<'T,'State> folder (state:'State) (list: 'T list) = - match list with - | [] -> state - | _ -> - let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) - let rec loop s xs = - match xs with - | [] -> s - | h::t -> loop (f.Invoke(s,h)) t - loop state list + let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) + let mutable acc = state + for x in list do + acc <- f.Invoke(acc, x) + acc [] let pairwise (list: 'T list) = @@ -356,12 +352,10 @@ namespace Microsoft.FSharp.Collections let exists predicate list = Microsoft.FSharp.Primitives.Basics.List.exists predicate list [] - let inline contains value source = - let rec contains e xs1 = - match xs1 with - | [] -> false - | h1::t1 -> e = h1 || contains e t1 - contains value source + let rec contains value source = + match source with + | [] -> false + | h::t -> if h = value then true else contains value t let rec exists2aux (f:OptimizedClosures.FSharpFunc<_,_,_>) list1 list2 = match list1,list2 with diff --git a/src/fsharp/FSharp.Core/list.fsi b/src/fsharp/FSharp.Core/list.fsi index 6ba6f988a2f..2cc18ac71e6 100644 --- a/src/fsharp/FSharp.Core/list.fsi +++ b/src/fsharp/FSharp.Core/list.fsi @@ -102,7 +102,7 @@ namespace Microsoft.FSharp.Collections /// The input list. /// True if the input list contains the specified element; false otherwise. [] - val inline contains: value:'T -> source:'T list -> bool when 'T : equality + val contains: value:'T -> source:'T list -> bool when 'T : equality /// Returns a list that contains no duplicate entries according to generic hash and /// equality comparisons on the entries. From a7a65863f2ab86b181c7fc4cb9300d132671e874 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Nov 2017 16:41:05 +0000 Subject: [PATCH 136/150] Revert "minor IL simplification (#3975)" (#3979) This reverts commit d8544fe2fd08c1603fcc8501462e58ffdeedc9f9. --- src/fsharp/FSharp.Core/list.fs | 24 +++++++++++++++--------- src/fsharp/FSharp.Core/list.fsi | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/fsharp/FSharp.Core/list.fs b/src/fsharp/FSharp.Core/list.fs index fdda3f9fc7d..6b31ea2b0f8 100644 --- a/src/fsharp/FSharp.Core/list.fs +++ b/src/fsharp/FSharp.Core/list.fs @@ -212,11 +212,15 @@ namespace Microsoft.FSharp.Collections [] let fold<'T,'State> folder (state:'State) (list: 'T list) = - let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) - let mutable acc = state - for x in list do - acc <- f.Invoke(acc, x) - acc + match list with + | [] -> state + | _ -> + let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) + let rec loop s xs = + match xs with + | [] -> s + | h::t -> loop (f.Invoke(s,h)) t + loop state list [] let pairwise (list: 'T list) = @@ -352,10 +356,12 @@ namespace Microsoft.FSharp.Collections let exists predicate list = Microsoft.FSharp.Primitives.Basics.List.exists predicate list [] - let rec contains value source = - match source with - | [] -> false - | h::t -> if h = value then true else contains value t + let inline contains value source = + let rec contains e xs1 = + match xs1 with + | [] -> false + | h1::t1 -> e = h1 || contains e t1 + contains value source let rec exists2aux (f:OptimizedClosures.FSharpFunc<_,_,_>) list1 list2 = match list1,list2 with diff --git a/src/fsharp/FSharp.Core/list.fsi b/src/fsharp/FSharp.Core/list.fsi index 2cc18ac71e6..6ba6f988a2f 100644 --- a/src/fsharp/FSharp.Core/list.fsi +++ b/src/fsharp/FSharp.Core/list.fsi @@ -102,7 +102,7 @@ namespace Microsoft.FSharp.Collections /// The input list. /// True if the input list contains the specified element; false otherwise. [] - val contains: value:'T -> source:'T list -> bool when 'T : equality + val inline contains: value:'T -> source:'T list -> bool when 'T : equality /// Returns a list that contains no duplicate entries according to generic hash and /// equality comparisons on the entries. From 8b4f18992cde9c0dc47ef02e718f9cd40951cd5b Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Mon, 20 Nov 2017 09:54:38 -0800 Subject: [PATCH 137/150] Update feed tasks version Contains various bug fixes --- PublishToBlob.proj | 2 +- packages.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PublishToBlob.proj b/PublishToBlob.proj index 9d071710a0e..7d681d5af42 100644 --- a/PublishToBlob.proj +++ b/PublishToBlob.proj @@ -10,7 +10,7 @@ Microsoft.DotNet.Build.Tasks.Feed - 1.0.0-prerelease-02121-01 + 1.0.0-prerelease-02219-01 diff --git a/packages.config b/packages.config index a4ecbf23fbd..955d8c12ad5 100644 --- a/packages.config +++ b/packages.config @@ -12,7 +12,7 @@ - + From 37d02af83ffa4a496c1d9f711533af96c2558da6 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 20 Nov 2017 11:09:49 -0800 Subject: [PATCH 138/150] ensure the expected dotnet CLI is actually present --- init-tools.cmd | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/init-tools.cmd b/init-tools.cmd index 111c8c80dee..e8aaa61b92f 100644 --- a/init-tools.cmd +++ b/init-tools.cmd @@ -26,6 +26,12 @@ if [%1]==[force] ( if exist "%PACKAGES_DIR%microsoft.dotnet.buildtools" rmdir /S /Q "%PACKAGES_DIR%microsoft.dotnet.buildtools" ) +set /p DOTNET_TOOLS_VERSION=< "%~dp0DotnetCLIToolsVersion.txt" +if not exist "%DOTNET_TOOLS_PATH%\sdk\%DOTNET_TOOLS_VERSION%" ( + :: dotnet cli doesn't yet exist, delete the semaphore + del "%BUILD_TOOLS_SEMAPHORE%" >NUL 2>&1 +) + :: If sempahore exists do nothing if exist "%BUILD_TOOLS_SEMAPHORE%" ( echo Tools are already initialized. @@ -44,7 +50,6 @@ if NOT exist "%PROJECT_JSON_PATH%" mkdir "%PROJECT_JSON_PATH%" echo %PROJECT_JSON_CONTENTS% > "%PROJECT_JSON_FILE%" echo Running %0 > "%INIT_TOOLS_LOG%" -set /p DOTNET_TOOLS_VERSION=< "%~dp0DotnetCLIToolsVersion.txt" if exist "%DOTNET_TOOLS_PATH%" goto :afterdotnettoolsrestore echo Installing dotnet OLD VERSION OF THE cli... From 0a8adb65c7782225a6f89830ad46583647312363 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Mon, 20 Nov 2017 23:07:33 +0300 Subject: [PATCH 139/150] Fix FSharpMemberOrFunctionOrValue.IsConstructor property for ctor definition (#3972) * fix FSharpMemberOrFunctionOrValue.IsConstructor property for ctor definition * add a test --- src/fsharp/symbols/Symbols.fs | 1 + tests/service/EditorTests.fs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 6679d8fdb1a..c97b62e9d48 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -1796,6 +1796,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = member x.IsConstructor = match d with | C _ -> true + | V v -> v.IsConstructor | _ -> false member x.Data = d diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 2e050abe327..5abd70b92e9 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -715,6 +715,37 @@ type Class1() = ("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)|] + //------------------------------------------------------------------------------- From b12630ee35e7d5ba743fdfd974ddd35c15bbfd85 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 20 Nov 2017 13:43:10 -0800 Subject: [PATCH 140/150] publish non .nupkg insertion items --- PublishToBlob.proj | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/PublishToBlob.proj b/PublishToBlob.proj index 7d681d5af42..21dbb9300e0 100644 --- a/PublishToBlob.proj +++ b/PublishToBlob.proj @@ -16,13 +16,19 @@ - + + + From ea75c3ca3227363cd338d09d5e12185a33a79eb4 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 20 Nov 2017 14:44:47 -0800 Subject: [PATCH 141/150] normalize backslashes in .nuspec files This cleans up a bunch of build warnings saying that nothing could be found in the `lib\` directory. --- .../FSharp.Compiler.Private.netcore.nuspec | 2 +- .../Microsoft.FSharp.Compiler.nuspec | 32 +++---- .../Testing.FSharp.Compiler.nuspec | 22 ++--- .../Microsoft.FSharp.TupleSample.nuspec | 4 +- .../FSharp.Core.4.1.xxx.nuspec | 84 +++++++++---------- .../FSharp.Core.4.2.xxx.nuspec | 16 ++-- ...rosoft.Portable.FSharp.Core.4.1.xxx.nuspec | 16 ++-- .../FSharp.Core/Testing.FSharp.Core.nuspec | 6 +- 8 files changed, 91 insertions(+), 91 deletions(-) diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec index 2189cb861af..3b663e8d3d5 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.netcore.nuspec @@ -38,6 +38,6 @@ - + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index 0bc76eca2a0..0b70058263e 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -38,11 +38,11 @@ - - - - - + + + + + @@ -54,16 +54,16 @@ tools, build and runtime/native make unnecessary copies. this approach gives a very small deployment. Which is kind of necessary. --> - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec index 4abfcc6130a..021b458ed30 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec @@ -46,16 +46,16 @@ tools, build and runtime/native make unnecessary copies. this approach gives a very small deployment. Which is kind of necessary. --> - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/SampleTuples/Microsoft.FSharp.TupleSample.nuspec b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/SampleTuples/Microsoft.FSharp.TupleSample.nuspec index 33c3bd8f319..312296a1ae8 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/SampleTuples/Microsoft.FSharp.TupleSample.nuspec +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/SampleTuples/Microsoft.FSharp.TupleSample.nuspec @@ -17,7 +17,7 @@ - - + + diff --git a/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.1.xxx.nuspec b/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.1.xxx.nuspec index c97e0fd543e..84ca12cf79f 100644 --- a/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.1.xxx.nuspec +++ b/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.1.xxx.nuspec @@ -71,56 +71,56 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + diff --git a/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.2.xxx.nuspec b/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.2.xxx.nuspec index d69b1df56d1..26e97553648 100644 --- a/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.2.xxx.nuspec +++ b/src/fsharp/FSharp.Core.nuget/FSharp.Core.4.2.xxx.nuspec @@ -52,15 +52,15 @@ - - - - + + + + - - - - + + + + diff --git a/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.4.1.xxx.nuspec b/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.4.1.xxx.nuspec index 128b62cb3fd..22812ebf2eb 100644 --- a/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.4.1.xxx.nuspec +++ b/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.4.1.xxx.nuspec @@ -14,14 +14,14 @@ - - - - - - - - + + + + + + + + diff --git a/src/fsharp/FSharp.Core/Testing.FSharp.Core.nuspec b/src/fsharp/FSharp.Core/Testing.FSharp.Core.nuspec index 208611c36ad..746986fc7a3 100644 --- a/src/fsharp/FSharp.Core/Testing.FSharp.Core.nuspec +++ b/src/fsharp/FSharp.Core/Testing.FSharp.Core.nuspec @@ -42,8 +42,8 @@ - - - + + + From 50f69b62427e724d32b5cfa3a2b38dba541774a6 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 20 Nov 2017 10:32:08 -0800 Subject: [PATCH 142/150] only public sign assemblies, not test sign --- DEVGUIDE.md | 2 +- build.cmd | 6 -- ...harp.Compiler.Service.Tests.netcore.fsproj | 2 +- ...FSharp.Compiler.Service.netstandard.fsproj | 3 +- src/FSharpSource.Profiles.targets | 1 - src/FSharpSource.Settings.targets | 14 +-- src/FSharpSource.targets | 22 +---- ...ssemblyinfo.FSharp.Compiler.Service.dll.fs | 19 ---- .../FSharp.Build-proto.fsproj | 19 +--- src/fsharp/FSharp.Build/FSharp.Build.fsproj | 19 +--- .../FSharp.Compiler.Private.fsproj | 49 +++------- src/fsharp/Fsc-proto/Fsc-proto.fsproj | 19 +--- src/fsharp/test.snk | Bin 596 -> 0 bytes src/update.cmd | 14 +-- .../FSharp.LanguageService.Base.csproj | 7 -- .../Project/ProjectSystem.Base.csproj | 7 -- .../FSharp.PropertiesPages.vbproj | 7 -- .../FSharp.UIResources.csproj | 7 -- vsintegration/update-vsintegration.cmd | 86 +----------------- 19 files changed, 34 insertions(+), 269 deletions(-) delete mode 100644 src/fsharp/test.snk diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 73d3ef08f49..041ce4a3391 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -192,7 +192,7 @@ For **Release**: #### Notes on the Windows .NET Framework build -1. The `update.cmd` script adds required strong name validation skips, and NGens the compiler and libraries. This requires admin privileges. +1. The `update.cmd` script NGens the compiler and libraries. This requires admin privileges. 1. The compiler binaries produced are "private" and strong-named signed with a test key. 1. Some additional tools are required to build the compiler, notably `fslex.exe`, `fsyacc.exe`, `FSharp.PowerPack.Build.Tasks.dll`, `FsSrGen.exe`, `FSharp.SRGen.Build.Tasks.dll`, and the other tools found in the `lkg` directory. 1. The overall bootstrapping process executes as follows diff --git a/build.cmd b/build.cmd index 4a45c333df6..e608ae0273e 100644 --- a/build.cmd +++ b/build.cmd @@ -497,8 +497,6 @@ if "%RestorePackages%"=="" ( @echo VSSDKToolsPath: %VSSDKToolsPath% @echo VSSDKIncludes: %VSSDKIncludes% -@call src\update.cmd signonly - :: Check prerequisites if not "%VisualStudioVersion%" == "" goto vsversionset if exist "%VS150COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=15.0 @@ -704,16 +702,12 @@ set PATH=%PATH%;%CORDIR% set REGEXE32BIT=reg.exe -IF NOT DEFINED SNEXE32 IF EXIST "%WINSDKNETFXTOOLS%\sn.exe" set SNEXE32=%WINSDKNETFXTOOLS%sn.exe -IF NOT DEFINED SNEXE64 IF EXIST "%WINSDKNETFXTOOLS%x64\sn.exe" set SNEXE64=%WINSDKNETFXTOOLS%x64\sn.exe IF NOT DEFINED ildasm IF EXIST "%WINSDKNETFXTOOLS%\ildasm.exe" set ildasm=%WINSDKNETFXTOOLS%ildasm.exe echo. echo SDK environment vars echo ======================= echo WINSDKNETFXTOOLS: %WINSDKNETFXTOOLS% -echo SNEXE32: %SNEXE32% -echo SNEXE64: %SNEXE64% echo ILDASM: %ILDASM% echo diff --git a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj index 71f5341bb71..9ec065c1c2b 100644 --- a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj @@ -4,7 +4,7 @@ $(DefineConstants);DOTNETCORE;FX_ATLEAST_45;FX_ATLEAST_PORTABLE;FX_NO_RUNTIMEENVIRONMENT;FX_RESHAPED_REFLECTION;TODO_REWORK_ASSEMBLY_LOAD; $(NoWarn);44; true - true + true true false diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index 253080552f3..6423180680a 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -63,12 +63,11 @@ $(DefineConstants);NO_LOGGING_GUI $(DefineConstants);FX_RESHAPED_MSBUILD $(DefineConstants);SIGNED - $(DefineConstants);STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY $(DefineConstants);TODO_REWORK_ASSEMBLY_LOAD $(DefineConstants);TODO_REWORK_SERVER $(NoWarn);44;69;65;54;61;75;62;9;2003; true - true + true true diff --git a/src/FSharpSource.Profiles.targets b/src/FSharpSource.Profiles.targets index adafba0eae3..f5725f270ff 100644 --- a/src/FSharpSource.Profiles.targets +++ b/src/FSharpSource.Profiles.targets @@ -3,7 +3,6 @@ - $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);PREFERRED_UI_LANG $(DefineConstants);ENABLE_MONO_SUPPORT $(DefineConstants);BE_SECURITY_TRANSPARENT diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 6a8c8ecbe4e..feb2626741c 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -56,7 +56,14 @@ $(FSharpSourcesRoot)\..\packages\NUnit.ConsoleRunner\$(NUnitVersion)\tools\ - + + true + $(FSharpSourcesRoot)\fsharp\msft.pubkey + true + true + + + true false true @@ -139,11 +146,6 @@ fslex.exe fsyacc.exe - - - v12.0 - 12.0.0.0 - $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 3ad08c6922b..52fcb8bb2cf 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -25,25 +25,13 @@ fs - - - - $(OtherFlags) --keyfile:"$(FSharpSourcesRoot)\fsharp\test.snk" - STRONG_NAME_FSHARP_COMPILER_WITH_TEST_KEY;$(DefineConstants) - true - $(FSCoreVersion) - fs - - - $(OtherFlags) --delaysign+ - $(OtherFlags) --publicsign+ - $(OtherFlags) --keyfile:"$(FSharpSourcesRoot)\fsharp\msft.pubkey" - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY;$(DefineConstants) + $(OtherFlags) --publicsign+ true + true $(FSCoreVersion) 15.4.1.0 @@ -57,9 +45,9 @@ true $(FSharpSourcesRoot)\fsharp\msft.pubkey - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY;$(DefineConstants) true - true + true + true $(FSCoreVersion) fs @@ -88,7 +76,7 @@ NO_STRONG_NAMES;$(DefineConstants) - + MSBUILD_AT_LEAST_14;$(DefineConstants) diff --git a/src/assemblyinfo/assemblyinfo.FSharp.Compiler.Service.dll.fs b/src/assemblyinfo/assemblyinfo.FSharp.Compiler.Service.dll.fs index 2ff140f9a17..19ad354e749 100644 --- a/src/assemblyinfo/assemblyinfo.FSharp.Compiler.Service.dll.fs +++ b/src/assemblyinfo/assemblyinfo.FSharp.Compiler.Service.dll.fs @@ -36,25 +36,7 @@ open System.Runtime.InteropServices [] [] #endif -#if STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -#endif -#if STRONG_NAME_FSHARP_COMPILER_WITH_TEST_KEY [] [] [] @@ -69,7 +51,6 @@ open System.Runtime.InteropServices [] [] [] -#endif // Until dotnet sdk can version assemblies, use this #if BUILD_FROM_SOURCE diff --git a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj b/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj index e7ccc386e61..8aba433807d 100644 --- a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj +++ b/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj @@ -72,7 +72,7 @@ - + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll @@ -90,22 +90,5 @@ FSharp.Core - - - True - - - True - - - True - - - True - - - True - - diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj index 5bc7c9f75bc..405deb589ad 100644 --- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj +++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -59,7 +59,7 @@ - + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll @@ -73,23 +73,6 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Tasks.Core.dll - - - True - - - True - - - True - - - True - - - True - - {DED3BBD7-53F4-428A-8C9F-27968E768605} diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 528a5649fed..214f60cdc9f 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -703,44 +703,19 @@ ..\..\..\packages\System.ValueTuple.4.3.1\lib\netstandard1.0\System.ValueTuple.dll true + + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll + + + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.dll + + + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Utilities.Core.dll + + + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Tasks.Core.dll + - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Tasks.Core.dll - - - - - - - True - - - True - - - True - - - True - - - True - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj index 43c8de3df64..fd3d209e512 100644 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ b/src/fsharp/Fsc-proto/Fsc-proto.fsproj @@ -473,7 +473,7 @@ FSharp.Core - + $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Framework.dll @@ -487,23 +487,6 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Msbuild.15.0.1.0.1\lib\net45\Microsoft.Build.Tasks.Core.dll - - - True - - - True - - - True - - - True - - - True - - diff --git a/src/fsharp/test.snk b/src/fsharp/test.snk deleted file mode 100644 index c16543bdc485c87204265be7cdb36b9e04f769a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097Z(=G%(7)~F0J6@jCsIiOQd z98SABxJRb8V`-2gN(9eK(XPcF&csac$dWF#yDsKl!~2`6hv7j4ESAnePnfSWP>g;g z+O@D~s(>$MlZX{J?hgF5)A7lw_#s-vE|R*MS^`&1Xpqo!WXmrziv&9yPyU$i;A!qF zarRTR&+82LmEk+&s6JGD4YW8k^p;aj@0EH@$-2i<35?*NiXgU%>3c|8|J6s>t-_72 z$AKmHe;`zoX*Bxf$o6Byt`-DDJoNdFH7R+VhwI`VL~7 z>`TMSZslV~Io8Ltfl-4!k+xBs6r(%B#*{jL=5e-@)>)R9^8L%false - - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY;$(DefineConstants) - true - true - diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index 218b9584a9a..6a57d667913 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -45,13 +45,6 @@ - - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY;$(DefineConstants) - true - true - diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index c7ee9a0d29c..d087da45a13 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -49,13 +49,6 @@ false - - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY=True,$(DefineConstants) - true - true - diff --git a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj index abe9503fa24..58e5ef5a823 100644 --- a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj +++ b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj @@ -31,13 +31,6 @@ false - - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY;$(DefineConstants) - true - true - diff --git a/vsintegration/update-vsintegration.cmd b/vsintegration/update-vsintegration.cmd index 9dcb36f92d5..022b288c0ab 100644 --- a/vsintegration/update-vsintegration.cmd +++ b/vsintegration/update-vsintegration.cmd @@ -153,8 +153,6 @@ if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -set SN32="%WINSDKNETFXTOOLS%sn.exe" -set SN64="%WINSDKNETFXTOOLS%x64\sn.exe" set NGEN32=%windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe set NGEN64=%windir%\Microsoft.NET\Framework64\v4.0.30319\ngen.exe @@ -327,47 +325,7 @@ if "%DEPLOY%" == "yes" if "!ISADMIN!" == "yes" ( ) REG ADD "HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\F# !FSHARPVERSION! Core Assemblies (Open Source)" /ve /t REG_SZ /f /d "!X86_PROGRAMFILES!\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.!FSHARPVERSION!.0\ REG ADD "HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.50709\AssemblyFoldersEx\F# !FSHARPVERSION! Core Assemblies (Open Source)" /ve /t REG_SZ /f /d "!X86_PROGRAMFILES!\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.!FSHARPVERSION!.0\ - - rem Disable strong-name validation for F# binaries built from open source that are signed with the microsoft key - echo. - CALL :colorEcho 02 "[!ACTION!] Removing strong-name validation of F# binaries" & echo. - !SN32! -Vr FSharp.Core,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.Build,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr HostedCompilerServer,b03f5f7f11d50a3a 1>NUL 2>NUL - - !SN32! -Vr FSharp.Compiler,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.Editor,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.LanguageService,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr FSharp.VS.FSI,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN32! -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a 1>NUL 2>NUL - - REM Do this *in addition* to the above for x64 systems - if /i "!PROCESSOR_ARCHITECTURE!"=="AMD64" ( - !SN64! -Vr FSharp.Core,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.Build,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr HostedCompilerServer,b03f5f7f11d50a3a 1>NUL 2>NUL - - !SN64! -Vr FSharp.Compiler,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.Editor,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.LanguageService,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr FSharp.VS.FSI,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a 1>NUL 2>NUL - !SN64! -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a 1>NUL 2>NUL - ) - + rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll echo. @@ -399,47 +357,7 @@ if "%DEPLOY%" == "yes" if "!ISADMIN!" == "no" ( rem Re-enable certain settings when restoring, NGEN the original files again, requires admin rights if "%ACTION%" == "restore" if "!ISADMIN!" == "yes" ( - - rem Re-enable strong-name validation for F# binaries that were previously installed - echo. - CALL :colorEcho 02 "[!ACTION!] Re-enabling strong-name validation of original F# binaries" & echo. - !SN32! -Vu FSharp.Core,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.Build,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu HostedCompilerServer,b03f5f7f11d50a3a 2>NUL 1>NUL - - !SN32! -Vu FSharp.Compiler,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.Editor,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.LanguageService,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.LanguageService.Base,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu FSharp.VS.FSI,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu VisualFSharp.Unittests,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN32! -Vu VisualFSharp.Salsa,b03f5f7f11d50a3a 2>NUL 1>NUL - - REM Do this *in addition* to the above for x64 systems - if /i "!PROCESSOR_ARCHITECTURE!"=="AMD64" ( - !SN64! -Vu FSharp.Core,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.Build,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu HostedCompilerServer,b03f5f7f11d50a3a 2>NUL 1>NUL - - !SN64! -Vu FSharp.Compiler,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.Editor,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.LanguageService,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.LanguageService.Base,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu FSharp.VS.FSI,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu VisualFSharp.Unittests,b03f5f7f11d50a3a 2>NUL 1>NUL - !SN64! -Vu VisualFSharp.Salsa,b03f5f7f11d50a3a 2>NUL 1>NUL - ) - + rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll echo. From f3b278afa70fe805021b386957373239c0df8de1 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 21 Nov 2017 15:30:53 -0800 Subject: [PATCH 143/150] remove test dependency on sn.exe --- tests/fsharp/FSharp.Tests.FSharpSuite.fsproj | 9 +++ tests/fsharp/app.config | 11 +++ .../test-sha1-delay-attributes.bsl | 4 - .../core/signedtests/test-sha1-delay-cl.bsl | 4 - .../signedtests/test-sha1-full-attributes.bsl | 3 - .../core/signedtests/test-sha1-full-cl.bsl | 3 - .../test-sha1024-delay-attributes.bsl | 4 - .../signedtests/test-sha1024-delay-cl.bsl | 4 - .../test-sha1024-full-attributes.bsl | 3 - .../core/signedtests/test-sha1024-full-cl.bsl | 3 - .../signedtests/test-sha1024-public-cl.bsl | 4 - .../test-sha256-delay-attributes.bsl | 4 - .../core/signedtests/test-sha256-delay-cl.bsl | 4 - .../test-sha256-full-attributes.bsl | 3 - .../core/signedtests/test-sha256-full-cl.bsl | 3 - .../test-sha512-delay-attributes.bsl | 4 - .../core/signedtests/test-sha512-delay-cl.bsl | 4 - .../test-sha512-full-attributes.bsl | 3 - .../core/signedtests/test-sha512-full-cl.bsl | 3 - .../fsharp/core/signedtests/test-unsigned.bsl | 4 - tests/fsharp/packages.config | 2 + tests/fsharp/test-framework.fs | 4 - tests/fsharp/tests.fs | 79 ++++++++++--------- 23 files changed, 64 insertions(+), 105 deletions(-) create mode 100644 tests/fsharp/app.config delete mode 100644 tests/fsharp/core/signedtests/test-sha1-delay-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1-delay-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1-full-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1-full-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1024-delay-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1024-delay-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1024-full-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1024-full-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha1024-public-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha256-delay-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha256-delay-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha256-full-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha256-full-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha512-delay-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha512-delay-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha512-full-attributes.bsl delete mode 100644 tests/fsharp/core/signedtests/test-sha512-full-cl.bsl delete mode 100644 tests/fsharp/core/signedtests/test-unsigned.bsl diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj b/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj index 0efd720bfe8..1c52cbf48ff 100644 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj +++ b/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj @@ -37,12 +37,21 @@ + + + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutableVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll + True + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True diff --git a/tests/fsharp/app.config b/tests/fsharp/app.config new file mode 100644 index 00000000000..bd1c9c33df5 --- /dev/null +++ b/tests/fsharp/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/fsharp/core/signedtests/test-sha1-delay-attributes.bsl b/tests/fsharp/core/signedtests/test-sha1-delay-attributes.bsl deleted file mode 100644 index 8e2f27b61da..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1-delay-attributes.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha1-delay-attributes.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha1-delay-cl.bsl b/tests/fsharp/core/signedtests/test-sha1-delay-cl.bsl deleted file mode 100644 index 3274baa6b1a..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1-delay-cl.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha1-delay-cl.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha1-full-attributes.bsl b/tests/fsharp/core/signedtests/test-sha1-full-attributes.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1-full-attributes.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha1-full-cl.bsl b/tests/fsharp/core/signedtests/test-sha1-full-cl.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1-full-cl.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha1024-delay-attributes.bsl b/tests/fsharp/core/signedtests/test-sha1024-delay-attributes.bsl deleted file mode 100644 index 27f1e41f67b..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1024-delay-attributes.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha1024-delay-attributes.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha1024-delay-cl.bsl b/tests/fsharp/core/signedtests/test-sha1024-delay-cl.bsl deleted file mode 100644 index 92eac8caa1d..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1024-delay-cl.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha1024-delay-cl.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha1024-full-attributes.bsl b/tests/fsharp/core/signedtests/test-sha1024-full-attributes.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1024-full-attributes.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha1024-full-cl.bsl b/tests/fsharp/core/signedtests/test-sha1024-full-cl.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1024-full-cl.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha1024-public-cl.bsl b/tests/fsharp/core/signedtests/test-sha1024-public-cl.bsl deleted file mode 100644 index 71f422b5173..00000000000 --- a/tests/fsharp/core/signedtests/test-sha1024-public-cl.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -Failed to verify assembly -- Strong name validation failed. diff --git a/tests/fsharp/core/signedtests/test-sha256-delay-attributes.bsl b/tests/fsharp/core/signedtests/test-sha256-delay-attributes.bsl deleted file mode 100644 index 3b25e77f94c..00000000000 --- a/tests/fsharp/core/signedtests/test-sha256-delay-attributes.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha256-delay-attributes.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha256-delay-cl.bsl b/tests/fsharp/core/signedtests/test-sha256-delay-cl.bsl deleted file mode 100644 index cd769318462..00000000000 --- a/tests/fsharp/core/signedtests/test-sha256-delay-cl.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha256-delay-cl.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha256-full-attributes.bsl b/tests/fsharp/core/signedtests/test-sha256-full-attributes.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha256-full-attributes.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha256-full-cl.bsl b/tests/fsharp/core/signedtests/test-sha256-full-cl.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha256-full-cl.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha512-delay-attributes.bsl b/tests/fsharp/core/signedtests/test-sha512-delay-attributes.bsl deleted file mode 100644 index 1aef8fa382b..00000000000 --- a/tests/fsharp/core/signedtests/test-sha512-delay-attributes.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha512-delay-attributes.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha512-delay-cl.bsl b/tests/fsharp/core/signedtests/test-sha512-delay-cl.bsl deleted file mode 100644 index 5e6f9795871..00000000000 --- a/tests/fsharp/core/signedtests/test-sha512-delay-cl.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-sha512-delay-cl.exe is a delay-signed or test-signed assembly diff --git a/tests/fsharp/core/signedtests/test-sha512-full-attributes.bsl b/tests/fsharp/core/signedtests/test-sha512-full-attributes.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha512-full-attributes.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-sha512-full-cl.bsl b/tests/fsharp/core/signedtests/test-sha512-full-cl.bsl deleted file mode 100644 index cb14d8045bb..00000000000 --- a/tests/fsharp/core/signedtests/test-sha512-full-cl.bsl +++ /dev/null @@ -1,3 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. diff --git a/tests/fsharp/core/signedtests/test-unsigned.bsl b/tests/fsharp/core/signedtests/test-unsigned.bsl deleted file mode 100644 index 374becacaa1..00000000000 --- a/tests/fsharp/core/signedtests/test-unsigned.bsl +++ /dev/null @@ -1,4 +0,0 @@ -sn -q stops all output except error messages -if the output is a valid file no output is produced. -delay-signed and unsigned produce error messages. -test-unsigned.exe does not represent a strongly named assembly diff --git a/tests/fsharp/packages.config b/tests/fsharp/packages.config index 3b0ea1fe3f8..95311a04cc7 100644 --- a/tests/fsharp/packages.config +++ b/tests/fsharp/packages.config @@ -1,4 +1,6 @@  + + \ No newline at end of file diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index 6b9a795ca68..15188de84f4 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -118,7 +118,6 @@ type TestConfig = FSI_FOR_SCRIPTS : string fsi_flags : string ILDASM : string - SN : string NGEN : string PEVERIFY : string Directory: string @@ -179,7 +178,6 @@ let config configurationName envVars = let CSC = requireFile (CORDIR ++ "csc.exe") let NGEN = requireFile (CORDIR ++ "ngen.exe") let ILDASM = requireFile (CORSDK ++ "ildasm.exe") - let SN = requireFile (CORSDK ++ "sn.exe") let PEVERIFY = requireFile (CORSDK ++ "peverify.exe") let FSI_FOR_SCRIPTS = match envVars |> Map.tryFind "_fsiexe" with @@ -217,7 +215,6 @@ let config configurationName envVars = FSCBinPath = FSCBinPath |> Commands.pathAddBackslash FSCOREDLLPATH = FSCOREDLLPATH ILDASM = ILDASM - SN = SN NGEN = NGEN PEVERIFY = PEVERIFY CSC = CSC @@ -452,7 +449,6 @@ let fscAppendErrExpectFail cfg errPath arg = Printf.ksprintf (Commands.fsc cfg.D let csc cfg arg = Printf.ksprintf (Commands.csc (exec cfg) cfg.CSC) arg let ildasm cfg arg = Printf.ksprintf (Commands.ildasm (exec cfg) cfg.ILDASM) arg let peverify cfg = Commands.peverify (exec cfg) cfg.PEVERIFY "/nologo" -let sn cfg outfile arg = execAppendOutIgnoreExitCode cfg cfg.Directory outfile cfg.SN arg let peverifyWithArgs cfg args = Commands.peverify (exec cfg) cfg.PEVERIFY args let fsi cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI) let fsi_script cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI_FOR_SCRIPTS) diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 81f282abdda..12403565f2c 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -11,6 +11,7 @@ module ``FSharp-Tests-Core`` open System open System.IO open System.Reflection +open System.Reflection.PortableExecutable open NUnit.Framework open TestFramework open Scripting @@ -568,84 +569,88 @@ module CoreTests = let ``printing-5`` () = printing "--quiet" "z.output.test.quiet.stdout.txt" "z.output.test.quiet.stdout.bsl" "z.output.test.quiet.stderr.txt" "z.output.test.quiet.stderr.bsl" + type SigningType = + | DelaySigned + | PublicSigned + | NotSigned - let signedtest(args,bslfile) = + let signedtest(programId:string, args:string, expectedSigning:SigningType) = let cfg = testConfig "core/signedtests" - let cfg = { cfg with fsc_flags=cfg.fsc_flags + " " + args } - - let outfile = Path.ChangeExtension(bslfile,"sn.out") - let exefile = Path.ChangeExtension(bslfile,"exe") - do File.WriteAllLines(getfullpath cfg outfile, - ["sn -q stops all output except error messages " - "if the output is a valid file no output is produced. " - "delay-signed and unsigned produce error messages. "]) - - fsc cfg "%s -o:%s" cfg.fsc_flags exefile ["test.fs"] - sn cfg outfile ("-q -vf "+exefile) - let diffs = fsdiff cfg outfile bslfile - - match diffs with - | "" -> () - | _ -> Assert.Fail (sprintf "'%s' and '%s' differ; %A" outfile bslfile diffs) + let newFlags = cfg.fsc_flags + " " + args + + let exefile = programId + ".exe" + fsc cfg "%s -o:%s" newFlags exefile ["test.fs"] + + let assemblyPath = Path.Combine(cfg.Directory, exefile) + let assemblyName = AssemblyName.GetAssemblyName(assemblyPath) + let publicKeyToken = assemblyName.GetPublicKeyToken() + let isPublicKeyTokenPresent = not (Array.isEmpty publicKeyToken) + use exeStream = new FileStream(assemblyPath, FileMode.Open) + let peHeader = PEHeaders(exeStream) + let isSigned = peHeader.CorHeader.Flags.HasFlag(CorFlags.StrongNameSigned) + let actualSigning = + match isSigned, isPublicKeyTokenPresent with + | true, true-> SigningType.PublicSigned + | true, false -> failwith "unreachable" + | false, true -> SigningType.DelaySigned + | false, false -> SigningType.NotSigned + + Assert.AreEqual(expectedSigning, actualSigning) [] - let ``signedtest-1`` () = signedtest("","test-unsigned.bsl") + let ``signedtest-1`` () = signedtest("test-unsigned", "", SigningType.NotSigned) [] - let ``signedtest-2`` () = signedtest("--keyfile:sha1full.snk", "test-sha1-full-cl.bsl") + let ``signedtest-2`` () = signedtest("test-sha1-full-cl", "--keyfile:sha1full.snk", SigningType.PublicSigned) [] - let ``signedtest-3`` () = signedtest("--keyfile:sha256full.snk", "test-sha256-full-cl.bsl") + let ``signedtest-3`` () = signedtest("test-sha256-full-cl", "--keyfile:sha256full.snk", SigningType.PublicSigned) [] - let ``signedtest-4`` () = signedtest("--keyfile:sha512full.snk", "test-sha512-full-cl.bsl") + let ``signedtest-4`` () = signedtest("test-sha512-full-cl", "--keyfile:sha512full.snk", SigningType.PublicSigned) [] - let ``signedtest-5`` () = signedtest("--keyfile:sha1024full.snk", "test-sha1024-full-cl.bsl") + let ``signedtest-5`` () = signedtest("test-sha1024-full-cl", "--keyfile:sha1024full.snk", SigningType.PublicSigned) [] - let ``signedtest-6`` () = signedtest("--keyfile:sha1delay.snk --delaysign", "test-sha1-delay-cl.bsl") + let ``signedtest-6`` () = signedtest("test-sha1-delay-cl", "--keyfile:sha1delay.snk --delaysign", SigningType.DelaySigned) [] - let ``signedtest-7`` () = signedtest("--keyfile:sha256delay.snk --delaysign", "test-sha256-delay-cl.bsl") + let ``signedtest-7`` () = signedtest("test-sha256-delay-cl", "--keyfile:sha256delay.snk --delaysign", SigningType.DelaySigned) [] - let ``signedtest-8`` () = signedtest("--keyfile:sha512delay.snk --delaysign", "test-sha512-delay-cl.bsl") + let ``signedtest-8`` () = signedtest("test-sha512-delay-cl", "--keyfile:sha512delay.snk --delaysign", SigningType.DelaySigned) [] - let ``signedtest-9`` () = signedtest("--keyfile:sha1024delay.snk --delaysign", "test-sha1024-delay-cl.bsl") + let ``signedtest-9`` () = signedtest("test-sha1024-delay-cl", "--keyfile:sha1024delay.snk --delaysign", SigningType.DelaySigned) // Test SHA1 key full signed Attributes [] - let ``signedtest-10`` () = signedtest("--define:SHA1","test-sha1-full-attributes.bsl") + let ``signedtest-10`` () = signedtest("test-sha1-full-attributes", "--define:SHA1", SigningType.PublicSigned) // Test SHA1 key delayl signed Attributes [] - let ``signedtest-11`` () = signedtest("--keyfile:sha1delay.snk --define:SHA1 --define:DELAY", "test-sha1-delay-attributes.bsl") + let ``signedtest-11`` () = signedtest("test-sha1-delay-attributes", "--keyfile:sha1delay.snk --define:SHA1 --define:DELAY", SigningType.DelaySigned) [] - let ``signedtest-12`` () = signedtest("--define:SHA256", "test-sha256-full-attributes.bsl") + let ``signedtest-12`` () = signedtest("test-sha256-full-attributes", "--define:SHA256", SigningType.PublicSigned) // Test SHA 256 bit key delay signed Attributes [] - let ``signedtest-13`` () = signedtest("--define:SHA256 --define:DELAY", "test-sha256-delay-attributes.bsl") + let ``signedtest-13`` () = signedtest("test-sha256-delay-attributes", "--define:SHA256 --define:DELAY", SigningType.DelaySigned) // Test SHA 512 bit key fully signed Attributes [] - let ``signedtest-14`` () = signedtest("--define:SHA512", "test-sha512-full-attributes.bsl") + let ``signedtest-14`` () = signedtest("test-sha512-full-attributes", "--define:SHA512", SigningType.PublicSigned) // Test SHA 512 bit key delay signed Attributes [] - let ``signedtest-15`` () = signedtest("--define:SHA512 --define:DELAY", "test-sha512-delay-attributes.bsl") + let ``signedtest-15`` () = signedtest("test-sha512-delay-attributes", "--define:SHA512 --define:DELAY", SigningType.DelaySigned) // Test SHA 1024 bit key fully signed Attributes [] - let ``signedtest-16`` () = signedtest("--define:SHA1024", "test-sha1024-full-attributes.bsl") - - // Test dumpbin with SHA 1024 bit key public signed CL - [] - let ``signedtest-17`` () = signedtest("--keyfile:sha1024delay.snk --publicsign", "test-sha1024-public-cl.bsl") + let ``signedtest-16`` () = signedtest("test-sha1024-full-attributes", "--define:SHA1024", SigningType.PublicSigned) #endif #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS From 9ef05a7939bed39cdd211fff0c49978728ba90f9 Mon Sep 17 00:00:00 2001 From: ncave Date: Tue, 21 Nov 2017 22:30:09 -0800 Subject: [PATCH 144/150] List.fold IL simplification (#3982) --- src/fsharp/FSharp.Core/list.fs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/fsharp/FSharp.Core/list.fs b/src/fsharp/FSharp.Core/list.fs index 6b31ea2b0f8..45eccc3f3a3 100644 --- a/src/fsharp/FSharp.Core/list.fs +++ b/src/fsharp/FSharp.Core/list.fs @@ -216,11 +216,10 @@ namespace Microsoft.FSharp.Collections | [] -> state | _ -> let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) - let rec loop s xs = - match xs with - | [] -> s - | h::t -> loop (f.Invoke(s,h)) t - loop state list + let mutable acc = state + for x in list do + acc <- f.Invoke(acc, x) + acc [] let pairwise (list: 'T list) = From ee05187fa05bb400c043185e8143d27fff798acd Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Wed, 22 Nov 2017 09:30:58 +0300 Subject: [PATCH 145/150] Merge consequent open decls and hash directives into single structure blocks (#3971) * Merge branch 'combine-sparse-open-decls-and-hash-directives' into rider # Conflicts: # src/fsharp/TypeChecker.fs * add Structure tests --- src/fsharp/vs/ServiceStructure.fs | 4 +- tests/service/StructureTests.fs | 560 ++++++++++++++++++ .../unittests/VisualFSharp.Unittests.fsproj | 3 + 3 files changed, 566 insertions(+), 1 deletion(-) create mode 100644 tests/service/StructureTests.fs diff --git a/src/fsharp/vs/ServiceStructure.fs b/src/fsharp/vs/ServiceStructure.fs index 0009b3d9ad8..35e3d2383e4 100644 --- a/src/fsharp/vs/ServiceStructure.fs +++ b/src/fsharp/vs/ServiceStructure.fs @@ -545,7 +545,9 @@ module Structure = | [], [] -> List.rev res | [], _ -> List.rev (currentBulk::res) | r :: rest, [] -> loop rest res [r] - | r :: rest, last :: _ when r.StartLine = last.EndLine + 1 -> + | r :: rest, last :: _ + when r.StartLine = last.EndLine + 1 || + sourceLines.[last.EndLine..r.StartLine - 2] |> Array.forall System.String.IsNullOrWhiteSpace -> loop rest res (r::currentBulk) | r :: rest, _ -> loop rest (currentBulk::res) [r] loop input [] [] diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs new file mode 100644 index 00000000000..6e80a66bba2 --- /dev/null +++ b/tests/service/StructureTests.fs @@ -0,0 +1,560 @@ +#if INTERACTIVE +#r "../../Debug/fcs/net45/FSharp.Compiler.Service.dll" // note, run 'build fcs debug' to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.StructureTests +#endif + +open System.IO +open NUnit.Framework +open Microsoft.FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests.Common +open System.Text + +let fileName = Path.Combine (__SOURCE_DIRECTORY__, __SOURCE_FILE__) +type Line = int +type Col = int + +let (=>) (source: string) (expectedRanges: (Line * Col * Line * Col) 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 ast = parseSourceCode(fileName, source) + try + match ast with + | Some tree -> + let actual = + Structure.getOutliningRanges lines tree + |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) + |> Seq.map (fun r -> r.Range.StartLine, r.Range.StartColumn, r.Range.EndLine, r.Range.EndColumn) + |> Seq.sort + |> List.ofSeq + let expected = List.sort expectedRanges + if actual <> expected then + failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) + | None -> failwithf "Expected there to be a parse tree for source:\n%s" source + with _ -> + printfn "AST:\n%+A" ast + reraise() + +[] +let ``empty file``() = "" => [ (1, 0, 2, 0) ] + +[] +let ``nested module``() = + """ +module MyModule = + () +""" + => [ (1, 0, 4, 0) + (2, 0, 3, 6) ] + +[] +let ``module with multiline function``() = + """ +module MyModule = + let foo() = + foo() +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 13) + (3, 4, 4, 13) + (3, 8, 4, 13) ] + +[] +let ``DU``() = + """ +type Color = + | Red + | Green + | Blue +""" + => [ (1, 0, 6, 0) + (2, 5, 5, 10) + (3, 4, 5, 10) ] + +[] +let ``DU with interface``() = + """ +type Color = + | Red + | Green + | Blue + + interface IDisposable with + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() +""" + => [ (1, 0, 10, 0) + (2, 5, 9, 55) + (3, 4, 5, 10) + (7, 4, 9, 55) + (8, 15, 9, 55) + (8, 15, 9, 55) ] + +[] +let ``record with interface``() = + """ +type Color = + { Red: int + Green: int + Blue: int + } + + interface IDisposable with + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() +""" + => + [ (1, 0, 11, 0) + (2, 5, 10, 55) + (3, 4, 4, 14) + (3, 6, 4, 13) + (8, 4, 10, 55) + (9, 15, 10, 55) + (9, 15, 10, 55) ] + +[] +let ``type with a do block``() = + """ +type Color() = // 2 + let foo() = + () + + do + foo() + () // 8 +""" + => [ (1, 0, 9, 0) + (2, 5, 8, 10) + (3, 8, 4, 10) + (6, 4, 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() +""" + => [ (1, 0, 28, 0) + (2, 0, 27, 63) + (4, 4, 5, 10) + (4, 8, 5, 10) + (7, 9, 15, 59) + (8, 8, 11, 9) + (13, 8, 15, 59) + (14, 19, 15, 59) + (14, 19, 15, 59) + (17, 4, 27, 63) + (19, 13, 27, 63) + (20, 12, 23, 13) + (25, 12, 27, 63) + (26, 23, 27, 63) + (26, 23, 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 +""" + => [ (1, 0, 26, 6) + (2, 5, 3, 6) + (5, 0, 19, 17) + (8, 9, 9, 10) + (11, 4, 14, 17) + (16, 4, 19, 17) + (17, 13, 18, 14) + (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" +""" + => [ (1, 0, 23, 6) + (2, 3, 8, 6) + (11, 3, 23, 6) ] + +[] +let ``nested let bindings``() = + """ +let f x = // 2 + let g x = // 3 + let h = // 4 + () // 5 + () // 6 + x // 7 +""" + => [ (1, 0, 8, 0) + (2, 0, 7, 5) + (2, 4, 7, 5) + (3, 8, 6, 10) + (4, 12, 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 +""" + => [ (1, 0, 11, 0) + (2, 0, 10, 10) + (6, 4, 10, 10) + (6, 4, 10, 10) + (9, 8, 10, 10) ] + +[] +let ``computation expressions``() = + """ +seq { // 2 + yield () // 3 + let f x = // 4 + () // 5 + yield! seq { // 6 + yield () } // 7 +} // 8 +""" + => [ (1, 0, 8, 1) + (2, 0, 8, 1) + (4, 8, 5, 10) + (6, 4, 7, 18) + (6, 11, 7, 18) ] + +[] +let ``list``() = + """ +let _ = + [ 1; 2 + 3 ] +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 9) + (2, 4, 4, 9) + (3, 4, 4, 9) ] + +[] +let ``object expressions``() = + """ +let _ = + { new System.IDisposable with + member __.Dispose() = () } +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 34) + (2, 4, 4, 34) + (3, 4, 4, 34) ] + +[] +let ``try - with``() = + """ +try // 2 + let f x = // 3 + () // 4 +with _ -> // 5 + let f x = // 6 + () // 7 + () // 8 +""" + => [ (1, 0, 9, 0) + (2, 0, 5, 0) + (2, 0, 8, 6) + (3, 8, 4, 10) + (5, 0, 8, 6) + (6, 4, 8, 6) + (6, 8, 7, 10) ] + +[] +let ``try - finally``() = + """ +try // 2 + let f x = // 3 + () // 4 +finally // 5 + let f x = // 6 + () // 7 + () // 8 +""" + => [ (1, 0, 9, 0) + (2, 0, 8, 6) + (3, 8, 4, 10) + (5, 0, 8, 6) + (6, 8, 7, 10) ] + +[] +let ``if - then - else``() = + """ +if true then + let f x = + () + () +else + let f x = + () + () +""" + => [ (1, 0, 10, 0) + (2, 0, 9, 6) + (2, 8, 5, 6) + (3, 8, 4, 10) + (7, 8, 8, 10) ] + +[] +let ``code quotation``() = + """ +<@ + "code" + @> +""" + => [ 1, 0, 4, 10 + 2, 0, 4, 10 ] + +[] +let ``raw code quotation``() = + """ +<@@ + "code" + @@> +""" + => [ (1, 0, 4, 11) + (2, 0, 4, 11) ] + +[] +let ``match lambda aka function``() = + """ +function +| 0 -> () + () +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 10) + (3, 8, 4, 10) ] + +[] +let ``match guarded clause``() = + """ +let matchwith num = + match num with + | 0 -> () + () +""" + => [ (1, 0, 6, 0) + (2, 0, 5, 13) + (2, 4, 5, 13) + (3, 4, 5, 13) + (4, 11, 5, 13) ] + +[] +let ``for loop``() = + """ +for x = 100 downto 10 do + () + () +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 6) ] + +[] +let ``for each``() = + """ +for x in 0 .. 100 -> + () + () +""" + => [ (1, 0, 5, 0) + (2, 0, 4, 14) + (2, 18, 4, 14) ] + +[] +let ``tuple``() = + """ +( 20340 +, 322 +, 123123 ) +""" + => [ (1, 0, 4, 10) + (2, 2, 4, 8) ] + +[] +let ``do!``() = + """ +do! + printfn "allo" + printfn "allo" +""" + => [(1, 0, 5, 0) + (2, 0, 4, 18)] + +[] +let ``cexpr yield yield!``() = + """ +cexpr{ + yield! + cexpr{ + yield + + 10 + } + } +""" + => [1, 0, 9, 5 + 2, 0, 9, 5 + 3, 4, 8, 17 + 4, 8, 8, 17 + 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 +""" + => [ (1, 0, 14, 0) + (2, 0, 3, 10) + (4, 0, 13, 15) + (5, 4, 6, 14) + (7, 9, 11, 19) + (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 +""" + => [ (1, 0, 14, 0) + (2, 0, 3, 9) + (4, 0, 13, 15) + (5, 4, 6, 13) + (7, 9, 11, 19) + (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 +""" + => [ (1, 0, 11, 0) + (2, 0, 3, 9) + (4, 0, 5, 10) + (7, 0, 10, 10) ] \ No newline at end of file diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index af3d8ea5024..e590ef7026b 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -91,6 +91,9 @@ ProjectOptionsTests.fs + + StructureTests.fs + ServiceAnalysis\UnusedOpensTests.fs From 0be804a4122ecef66a1fb753130db2ef67c07967 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 22 Nov 2017 13:16:22 -0800 Subject: [PATCH 146/150] reenable delay signing and `sn -Vr` for build assemblies to speed up local work --- DEVGUIDE.md | 2 +- build.cmd | 6 ++ ...harp.Compiler.Service.Tests.netcore.fsproj | 2 +- ...FSharp.Compiler.Service.netstandard.fsproj | 2 +- src/FSharpSource.Settings.targets | 2 +- src/FSharpSource.targets | 6 +- src/update.cmd | 14 +++- vsintegration/update-vsintegration.cmd | 82 +++++++++++++++++++ 8 files changed, 107 insertions(+), 9 deletions(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 041ce4a3391..0f1a3e4c376 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -192,7 +192,7 @@ For **Release**: #### Notes on the Windows .NET Framework build -1. The `update.cmd` script NGens the compiler and libraries. This requires admin privileges. +1. The `update.cmd` script adds required strong name validation skips and NGens the compiler and libraries. This requires admin privileges. 1. The compiler binaries produced are "private" and strong-named signed with a test key. 1. Some additional tools are required to build the compiler, notably `fslex.exe`, `fsyacc.exe`, `FSharp.PowerPack.Build.Tasks.dll`, `FsSrGen.exe`, `FSharp.SRGen.Build.Tasks.dll`, and the other tools found in the `lkg` directory. 1. The overall bootstrapping process executes as follows diff --git a/build.cmd b/build.cmd index e608ae0273e..4a45c333df6 100644 --- a/build.cmd +++ b/build.cmd @@ -497,6 +497,8 @@ if "%RestorePackages%"=="" ( @echo VSSDKToolsPath: %VSSDKToolsPath% @echo VSSDKIncludes: %VSSDKIncludes% +@call src\update.cmd signonly + :: Check prerequisites if not "%VisualStudioVersion%" == "" goto vsversionset if exist "%VS150COMNTOOLS%\..\ide\devenv.exe" set VisualStudioVersion=15.0 @@ -702,12 +704,16 @@ set PATH=%PATH%;%CORDIR% set REGEXE32BIT=reg.exe +IF NOT DEFINED SNEXE32 IF EXIST "%WINSDKNETFXTOOLS%\sn.exe" set SNEXE32=%WINSDKNETFXTOOLS%sn.exe +IF NOT DEFINED SNEXE64 IF EXIST "%WINSDKNETFXTOOLS%x64\sn.exe" set SNEXE64=%WINSDKNETFXTOOLS%x64\sn.exe IF NOT DEFINED ildasm IF EXIST "%WINSDKNETFXTOOLS%\ildasm.exe" set ildasm=%WINSDKNETFXTOOLS%ildasm.exe echo. echo SDK environment vars echo ======================= echo WINSDKNETFXTOOLS: %WINSDKNETFXTOOLS% +echo SNEXE32: %SNEXE32% +echo SNEXE64: %SNEXE64% echo ILDASM: %ILDASM% echo diff --git a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj index 9ec065c1c2b..71f5341bb71 100644 --- a/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj @@ -4,7 +4,7 @@ $(DefineConstants);DOTNETCORE;FX_ATLEAST_45;FX_ATLEAST_PORTABLE;FX_NO_RUNTIMEENVIRONMENT;FX_RESHAPED_REFLECTION;TODO_REWORK_ASSEMBLY_LOAD; $(NoWarn);44; true - true + true true false diff --git a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj index 6423180680a..0ebd29eea3d 100644 --- a/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj +++ b/fcs/FSharp.Compiler.Service.netstandard/FSharp.Compiler.Service.netstandard.fsproj @@ -67,7 +67,7 @@ $(DefineConstants);TODO_REWORK_SERVER $(NoWarn);44;69;65;54;61;75;62;9;2003; true - true + true true diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index feb2626741c..75071b1ca49 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -60,7 +60,7 @@ true $(FSharpSourcesRoot)\fsharp\msft.pubkey true - true + true diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 52fcb8bb2cf..844848dc4c7 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -29,9 +29,8 @@ - $(OtherFlags) --publicsign+ + true true - true $(FSCoreVersion) 15.4.1.0 @@ -46,8 +45,7 @@ true $(FSharpSourcesRoot)\fsharp\msft.pubkey true - true - true + true $(FSCoreVersion) fs diff --git a/src/update.cmd b/src/update.cmd index af18a82b560..87f79130ac1 100644 --- a/src/update.cmd +++ b/src/update.cmd @@ -6,8 +6,9 @@ if /i "%1" == "debug" goto :ok if /i "%1" == "release" goto :ok +if /i "%1" == "signonly" goto :ok -echo NGening built binaries +echo adding required strong name verification skipping and NGening built binaries echo Usage: echo update.cmd debug [-ngen] echo update.cmd release [-ngen] @@ -37,9 +38,20 @@ if "%WINSDKNETFXTOOLS_x86%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32B set WINSDKNETFXTOOLS_x64=%WINSDKNETFXTOOLS_x86%x64\ :havesdk +set SN32="%WINSDKNETFXTOOLS_x86%sn.exe" +set SN64="%WINSDKNETFXTOOLS_x64%sn.exe" + set NGEN32=%windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe set NGEN64=%windir%\Microsoft.NET\Framework64\v4.0.30319\ngen.exe +rem Disable strong-name validation for binaries that are delay-signed with the microsoft key +%SN32% -q -Vr *,b03f5f7f11d50a3a + +if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( + %SN64% -q -Vr *,b03f5f7f11d50a3a +) + +if /i "%1" == "signonly" goto :eof if /i "%1" == "debug" set NGEN_FLAGS=/Debug rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll diff --git a/vsintegration/update-vsintegration.cmd b/vsintegration/update-vsintegration.cmd index 022b288c0ab..35dd8014330 100644 --- a/vsintegration/update-vsintegration.cmd +++ b/vsintegration/update-vsintegration.cmd @@ -153,6 +153,8 @@ if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B +set SN32="%WINSDKNETFXTOOLS%sn.exe" +set SN64="%WINSDKNETFXTOOLS%x64\sn.exe" set NGEN32=%windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe set NGEN64=%windir%\Microsoft.NET\Framework64\v4.0.30319\ngen.exe @@ -326,6 +328,46 @@ if "%DEPLOY%" == "yes" if "!ISADMIN!" == "yes" ( REG ADD "HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\F# !FSHARPVERSION! Core Assemblies (Open Source)" /ve /t REG_SZ /f /d "!X86_PROGRAMFILES!\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.!FSHARPVERSION!.0\ REG ADD "HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.50709\AssemblyFoldersEx\F# !FSHARPVERSION! Core Assemblies (Open Source)" /ve /t REG_SZ /f /d "!X86_PROGRAMFILES!\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.!FSHARPVERSION!.0\ + rem Disable strong-name validation for F# binaries built from open source that are signed with the microsoft key + echo. + CALL :colorEcho 02 "[!ACTION!] Removing strong-name validation of F# binaries" & echo. + !SN32! -Vr FSharp.Core,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.Build,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr HostedCompilerServer,b03f5f7f11d50a3a 1>NUL 2>NUL + + !SN32! -Vr FSharp.Compiler,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.Editor,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.LanguageService,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr FSharp.VS.FSI,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN32! -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a 1>NUL 2>NUL + + REM Do this *in addition* to the above for x64 systems + if /i "!PROCESSOR_ARCHITECTURE!"=="AMD64" ( + !SN64! -Vr FSharp.Core,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.Build,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr HostedCompilerServer,b03f5f7f11d50a3a 1>NUL 2>NUL + + !SN64! -Vr FSharp.Compiler,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.Editor,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.LanguageService,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr FSharp.VS.FSI,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a 1>NUL 2>NUL + !SN64! -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a 1>NUL 2>NUL + ) + rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll echo. @@ -358,6 +400,46 @@ if "%DEPLOY%" == "yes" if "!ISADMIN!" == "no" ( rem Re-enable certain settings when restoring, NGEN the original files again, requires admin rights if "%ACTION%" == "restore" if "!ISADMIN!" == "yes" ( + rem Re-enable strong-name validation for F# binaries that were previously installed + echo. + CALL :colorEcho 02 "[!ACTION!] Re-enabling strong-name validation of original F# binaries" & echo. + !SN32! -Vu FSharp.Core,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.Build,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu HostedCompilerServer,b03f5f7f11d50a3a 2>NUL 1>NUL + + !SN32! -Vu FSharp.Compiler,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.Editor,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.LanguageService,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.LanguageService.Base,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu FSharp.VS.FSI,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu VisualFSharp.Unittests,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN32! -Vu VisualFSharp.Salsa,b03f5f7f11d50a3a 2>NUL 1>NUL + + REM Do this *in addition* to the above for x64 systems + if /i "!PROCESSOR_ARCHITECTURE!"=="AMD64" ( + !SN64! -Vu FSharp.Core,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.Build,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu HostedCompilerServer,b03f5f7f11d50a3a 2>NUL 1>NUL + + !SN64! -Vu FSharp.Compiler,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.Editor,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.LanguageService,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.LanguageService.Base,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.ProjectSystem.Base,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu FSharp.VS.FSI,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu VisualFSharp.Unittests,b03f5f7f11d50a3a 2>NUL 1>NUL + !SN64! -Vu VisualFSharp.Salsa,b03f5f7f11d50a3a 2>NUL 1>NUL + ) + rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll echo. From 3ebf3705eebecd0a449b635c8e1dd1c2560871f9 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 22 Nov 2017 15:36:32 -0800 Subject: [PATCH 147/150] remove unnecessary test dependency on `ngen.exe` (#4004) --- tests/fsharp/test-framework.fs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index 15188de84f4..f96816f7188 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -118,7 +118,6 @@ type TestConfig = FSI_FOR_SCRIPTS : string fsi_flags : string ILDASM : string - NGEN : string PEVERIFY : string Directory: string DotNetExe: string @@ -176,7 +175,6 @@ let config configurationName envVars = let CORDIR, CORSDK = WindowsPlatform.clrPaths envVars let Is64BitOperatingSystem = WindowsPlatform.Is64BitOperatingSystem envVars let CSC = requireFile (CORDIR ++ "csc.exe") - let NGEN = requireFile (CORDIR ++ "ngen.exe") let ILDASM = requireFile (CORSDK ++ "ildasm.exe") let PEVERIFY = requireFile (CORSDK ++ "peverify.exe") let FSI_FOR_SCRIPTS = @@ -215,7 +213,6 @@ let config configurationName envVars = FSCBinPath = FSCBinPath |> Commands.pathAddBackslash FSCOREDLLPATH = FSCOREDLLPATH ILDASM = ILDASM - NGEN = NGEN PEVERIFY = PEVERIFY CSC = CSC BUILD_CONFIG = configurationName @@ -245,7 +242,6 @@ let logConfig (cfg: TestConfig) = log "FSI =%s" cfg.FSI log "fsi_flags =%s" cfg.fsi_flags log "ILDASM =%s" cfg.ILDASM - log "NGEN =%s" cfg.NGEN log "PEVERIFY =%s" cfg.PEVERIFY log "---------------------------------------------------------------" From 27923d44ab68644671791a4790b8113eb9df611e Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 22 Nov 2017 16:33:28 -0800 Subject: [PATCH 148/150] use ildasm.exe from a NuGet package (#3995) --- build.cmd | 23 ++++++++++------------- tests/fsharp/packages.config | 2 ++ tests/fsharp/test-framework.fs | 13 +++++++++---- tests/fsharp/tests.fs | 6 +++--- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/build.cmd b/build.cmd index 4a45c333df6..88c6be98fa1 100644 --- a/build.cmd +++ b/build.cmd @@ -589,6 +589,15 @@ if "%RestorePackages%" == "true" ( %_nugetexe% restore setup\packages.config !_nugetoptions! @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure ) + + set restore_fsharp_suite=0 + if "%TEST_NET40_FSHARP_SUITE%" == "1" set restore_fsharp_suite=1 + if "%TEST_CORECLR_FSHARP_SUITE%" == "1" set restore_fsharp_suite=1 + + if "!restore_fsharp_suite!" == "1" ( + %_nugetexe% restore tests\fsharp\packages.config !_nugetoptions! + @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure + ) ) if "%BUILD_PROTO_WITH_CORECLR_LKG%" == "1" ( @@ -689,16 +698,6 @@ if not "%OSARCH%"=="x86" set REGEXE32BIT=%WINDIR%\syswow64\reg.exe echo SDK environment vars from Registry echo ================================== -::See https://stackoverflow.com/a/17113667/111575 on 2^>NUL for suppressing the error "ERROR: The system was unable to find the specified registry key or value." from reg.exe, this fixes #3619 - FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6.1\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\NETFXSDK\4.6\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v8.1A\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B -if "%WINSDKNETFXTOOLS%"=="" FOR /F "tokens=2* delims= " %%A IN ('%REGEXE32BIT% QUERY "HKLM\Software\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools" /v InstallationFolder 2^>NUL') DO SET WINSDKNETFXTOOLS=%%B - -set PATH=%PATH%;%WINSDKNETFXTOOLS% for /d %%i in (%WINDIR%\Microsoft.NET\Framework\v4.0.?????) do set CORDIR=%%i set PATH=%PATH%;%CORDIR% @@ -706,7 +705,6 @@ set REGEXE32BIT=reg.exe IF NOT DEFINED SNEXE32 IF EXIST "%WINSDKNETFXTOOLS%\sn.exe" set SNEXE32=%WINSDKNETFXTOOLS%sn.exe IF NOT DEFINED SNEXE64 IF EXIST "%WINSDKNETFXTOOLS%x64\sn.exe" set SNEXE64=%WINSDKNETFXTOOLS%x64\sn.exe -IF NOT DEFINED ildasm IF EXIST "%WINSDKNETFXTOOLS%\ildasm.exe" set ildasm=%WINSDKNETFXTOOLS%ildasm.exe echo. echo SDK environment vars @@ -714,7 +712,6 @@ echo ======================= echo WINSDKNETFXTOOLS: %WINSDKNETFXTOOLS% echo SNEXE32: %SNEXE32% echo SNEXE64: %SNEXE64% -echo ILDASM: %ILDASM% echo if "%TEST_NET40_COMPILERUNIT_SUITE%" == "0" if "%TEST_NET40_COREUNIT_SUITE%" == "0" if "%TEST_CORECLR_COREUNIT_SUITE%" == "0" if "%TEST_VS_IDEUNIT_SUITE%" == "0" if "%TEST_NET40_FSHARP_SUITE%" == "0" if "%TEST_NET40_FSHARPQA_SUITE%" == "0" goto :success @@ -915,7 +912,7 @@ if "%TEST_CORECLR_FSHARP_SUITE%" == "1" ( set OUTPUTFILE= set ERRORFILE= set XMLFILE=!RESULTSDIR!\test-coreclr-fsharp-results.xml - echo "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Core.Unittests\FSharp.Core.Unittests.dll" !WHERE_ARG_NUNIT! + echo "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Tests.FSharpSuite.DrivingCoreCLR\FSharp.Tests.FSharpSuite.DrivingCoreCLR.dll" !WHERE_ARG_NUNIT! "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Tests.FSharpSuite.DrivingCoreCLR\FSharp.Tests.FSharpSuite.DrivingCoreCLR.dll" !WHERE_ARG_NUNIT! if errorlevel 1 ( diff --git a/tests/fsharp/packages.config b/tests/fsharp/packages.config index 95311a04cc7..20a3b06b923 100644 --- a/tests/fsharp/packages.config +++ b/tests/fsharp/packages.config @@ -1,6 +1,8 @@  + + \ No newline at end of file diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index f96816f7188..915f6ac372f 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -167,28 +167,33 @@ let requireFile nm = let config configurationName envVars = - let SCRIPT_ROOT = __SOURCE_DIRECTORY__ + let SCRIPT_ROOT = __SOURCE_DIRECTORY__ + let packagesDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "packages" let FSCBinPath = SCRIPT_ROOT ++ ".." ++ ".." ++ configurationName ++ "net40" ++ "bin" let csc_flags = "/nologo" let fsc_flags = "-r:System.Core.dll --nowarn:20 --define:COMPILED" let fsi_flags = "-r:System.Core.dll --nowarn:20 --define:INTERACTIVE --maxerrors:1 --abortonerror" let CORDIR, CORSDK = WindowsPlatform.clrPaths envVars let Is64BitOperatingSystem = WindowsPlatform.Is64BitOperatingSystem envVars + let architectureMoniker = if Is64BitOperatingSystem then "x64" else "x86" let CSC = requireFile (CORDIR ++ "csc.exe") - let ILDASM = requireFile (CORSDK ++ "ildasm.exe") + let ILDASM = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") let PEVERIFY = requireFile (CORSDK ++ "peverify.exe") let FSI_FOR_SCRIPTS = match envVars |> Map.tryFind "_fsiexe" with | Some fsiexe when (not (String.IsNullOrWhiteSpace fsiexe)) -> requireFile (SCRIPT_ROOT ++ ".." ++ ".." ++ (fsiexe.Trim([| '\"' |]))) | _ -> // build.cmd sets that var, if it is not set, we are probably called directly from visual studio or the nunit console runner. - let packagesDir = SCRIPT_ROOT ++ ".." ++ ".." ++ @"packages" let fsharpCompilerTools = Directory.GetDirectories(packagesDir, "FSharp.Compiler.Tools.*") match fsharpCompilerTools with | [||] -> failwithf "Could not find any 'FSharp.Compiler.Tools' inside '%s'" packagesDir | [| dir |] -> Path.Combine(dir, "tools", "fsi.exe") | _ -> failwithf "Found more than one 'FSharp.Compiler.Tools' inside '%s', please clean up." packagesDir - let dotNetExe = SCRIPT_ROOT ++ ".." ++ ".." ++ "Tools" ++ "dotnetcli" ++ "dotnet.exe" + let toolsDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "Tools" + let dotNetExe = toolsDir ++ "dotnetcli" ++ "dotnet.exe" + // ildasm requires coreclr.dll to run which has already been restored to the tools directory + let coreclrSource = toolsDir ++ "dotnet20" ++ "shared" ++ "Microsoft.NETCore.App" ++ "2.0.0" ++ "coreclr.dll" + File.Copy(coreclrSource, Path.GetDirectoryName(ILDASM) ++ "coreclr.dll", overwrite=true) #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS let FSI = requireFile (FSCBinPath ++ "fsi.exe") diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 12403565f2c..4a4d35de55b 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1621,9 +1621,9 @@ module OptimizationTests = fsc cfg "%s --optimize -o:test--optimize.exe -g -r:lib--optimize.dll -r:lib3--optimize.dll" cfg.fsc_flags ["test.fs "] - ildasm cfg "/nobar /out=test.il" "test.exe" + ildasm cfg "/out=test.il" "test.exe" - ildasm cfg "/nobar /out=test--optimize.il" "test--optimize.exe" + ildasm cfg "/out=test--optimize.il" "test--optimize.exe" let ``test--optimize.il`` = File.ReadLines (getfullpath cfg "test--optimize.il") @@ -1646,7 +1646,7 @@ module OptimizationTests = let stats () = let cfg = testConfig "optimize/stats" - ildasm cfg "/nobar /out=FSharp.Core.il" cfg.FSCOREDLLPATH + ildasm cfg "/out=FSharp.Core.il" cfg.FSCOREDLLPATH let fscore = File.ReadLines(getfullpath cfg "FSharp.Core.il") |> Seq.toList From 33a94a1c11948cb043f64122615ebff192b59b8d Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Thu, 23 Nov 2017 06:07:03 +0300 Subject: [PATCH 149/150] Use ConcurrentDictionary in deduplicate names --- src/fsharp/CompileOps.fs | 13 +++++++------ src/fsharp/CompileOps.fsi | 4 ++-- src/fsharp/fsc.fs | 3 ++- src/fsharp/vs/IncrementalBuild.fs | 5 +++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0b0414ac5a1..0cab042759a 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -4,11 +4,12 @@ module internal Microsoft.FSharp.Compiler.CompileOps open System +open System.Collections.Concurrent +open System.Collections.Generic open System.Diagnostics -open System.Text open System.IO -open System.Collections.Generic open System.Runtime.CompilerServices +open System.Text open Internal.Utilities open Internal.Utilities.Text @@ -3509,14 +3510,14 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig ParsedInput.SigFile(ParsedSigFileInput(filename, qualName, scopedPragmas, hashDirectives, specs)) /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict:Dictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = +let DeduplicateModuleName (moduleNamesDict:IDictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = let count = if paths.Contains path then paths.Count else paths.Count + 1 moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.add path paths let id = qualifiedNameOfFile.Id if count = 1 then qualifiedNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary>) input = +let DeduplicateParsedInputModuleName (moduleNamesDict:IDictionary>) input = match input with | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> let path = Path.GetDirectoryName fileName @@ -3525,7 +3526,7 @@ let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary - moduleNamesDict.Add(qualifiedNameOfFile.Text, Set.singleton path) + moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path input | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) -> let path = Path.GetDirectoryName fileName @@ -3534,7 +3535,7 @@ let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary - moduleNamesDict.Add(qualifiedNameOfFile.Text, Set.singleton path) + moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path input let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index 8f782ccee16..77916b63f49 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -65,10 +65,10 @@ val ComputeQualifiedNameOfFileFromUniquePath: range * string list -> Ast.Qualifi val PrependPathToInput: Ast.Ident list -> Ast.ParsedInput -> Ast.ParsedInput /// Checks if a module name is already given and deduplicates the name if needed. -val DeduplicateModuleName: Dictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile +val DeduplicateModuleName: IDictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -val DeduplicateParsedInputModuleName: Dictionary> -> Ast.ParsedInput -> Ast.ParsedInput +val DeduplicateParsedInputModuleName: IDictionary> -> Ast.ParsedInput -> Ast.ParsedInput val ParseInput: (UnicodeLexing.Lexbuf -> Parser.token) * ErrorLogger * UnicodeLexing.Lexbuf * string option * string * isLastCompiland:(bool * bool) -> Ast.ParsedInput diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 8aea32c097e..e18f782dc21 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -13,6 +13,7 @@ module internal Microsoft.FSharp.Compiler.Driver open System +open System.Collections.Concurrent open System.Collections.Generic open System.Diagnostics open System.Globalization @@ -1758,7 +1759,7 @@ let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, openBinarie let inputs = // Deduplicate module names - let moduleNamesDict = Dictionary>() + let moduleNamesDict = ConcurrentDictionary>() inputs |> List.map (fun (input,x) -> DeduplicateParsedInputModuleName moduleNamesDict input,x) diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index 5b429b2e708..6145eabe330 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -4,8 +4,9 @@ namespace Microsoft.FSharp.Compiler open System -open System.IO +open System.Collections.Concurrent open System.Collections.Generic +open System.IO open System.Threading open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.NameResolution @@ -1239,7 +1240,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput cache.GetFileTimeStamp filename // Deduplicate module names - let moduleNamesDict = Dictionary>() + let moduleNamesDict = ConcurrentDictionary>() /// This is a build task function that gets placed into the build rules as the computation for a VectorMap /// From 91c6819791ed17e51d53c06bdb0dec5854993958 Mon Sep 17 00:00:00 2001 From: ncave Date: Sun, 26 Nov 2017 10:52:58 -0800 Subject: [PATCH 150/150] Replace more ILAsm in Exprs --- src/fsharp/Optimizer.fs | 2 +- src/fsharp/TastOps.fs | 46 ++++++++++++-- src/fsharp/TastOps.fsi | 43 ++++++++++++- src/fsharp/TcGlobals.fs | 120 +++++++++++++++++++++++++++++------- src/fsharp/symbols/Exprs.fs | 113 +++++++++++++++++++++++++++++---- src/fsharp/vs/service.fs | 8 +-- 6 files changed, 287 insertions(+), 45 deletions(-) diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 6e2672e2302..3ea19645b6b 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -1806,7 +1806,7 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = Info = UnknownValue } (* Handle these as special cases since mutables are allowed inside their bodies *) | 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, _, _)] when false -> OptimizeFastIntegerForLoop cenv { env with inLoop=true } (spStart, v, e1, dir, e2, e3, m) + | 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, _, _)] -> OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, resty) | TOp.TryCatch(spTry, spWith), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [vf], ef, _, _); Expr.Lambda(_, _, _, [vh], eh, _, _)] -> OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, resty, spTry, spWith) | TOp.TraitCall(traitInfo), [], args -> OptimizeTraitCall cenv env (traitInfo, args, m) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index d2d378508de..226e994c8d6 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -6114,18 +6114,56 @@ let mkCallNewQuerySource (g:TcGlobals) m 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 mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_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 mkCallGenericHashWithComparerOuter (g:TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], 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 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 mkCallArrayLength (g:TcGlobals) m ty el = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [el], m) -let mkCallArrayGet (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[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 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 mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_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 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 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 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) diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 04410eae1c1..0de158c052e 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1201,15 +1201,54 @@ val mkCallArrayGet : TcGlobals -> range -> TType -> Expr -> Expr -> Ex val mkCallArray2DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr val mkCallArray3DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallArray4DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr +val mkCallArraySet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr +val mkCallArray2DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr +val mkCallArray3DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr +val mkCallArray4DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallRaise : TcGlobals -> range -> TType -> Expr -> Expr val mkCallGenericComparisonWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr val mkCallGenericEqualityEROuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -val mkCallEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -val mkCallSubtractionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallGenericEqualityWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr val mkCallGenericHashWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallNotEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallLessThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallLessThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallGreaterThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallGreaterThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + +val mkCallAdditionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallSubtractionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallMultiplyOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallDivisionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallModulusOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallBitwiseAndOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallBitwiseOrOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallBitwiseXorOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallShiftLeftOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr +val mkCallShiftRightOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + +val mkCallUnaryNegOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallUnaryNotOperator : TcGlobals -> range -> TType -> Expr -> Expr + +val mkCallToByteOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToSByteOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToUInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToIntOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToUInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToUInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToSingleOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToDoubleOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr +val mkCallToUIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallDeserializeQuotationFSharp20Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallDeserializeQuotationFSharp40Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallCastQuotation : TcGlobals -> range -> TType -> Expr -> Expr diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index 0e126f3469b..e89a3043acb 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -290,12 +290,25 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d else "[" + (String.replicate (rank - 1) ",") + "]`1" mk_MFCore_tcref fslibCcu type_sig) + let v_byte_ty = mkNonGenericTy v_byte_tcr + let v_sbyte_ty = mkNonGenericTy v_sbyte_tcr + let v_int16_ty = mkNonGenericTy v_int16_tcr + let v_uint16_ty = mkNonGenericTy v_uint16_tcr + let v_int_ty = mkNonGenericTy v_int_tcr + let v_enum_ty = mkNonGenericTy v_int_tcr + let v_int32_ty = mkNonGenericTy v_int32_tcr + let v_uint32_ty = mkNonGenericTy v_uint32_tcr + let v_int64_ty = mkNonGenericTy v_int64_tcr + let v_uint64_ty = mkNonGenericTy v_uint64_tcr + let v_float32_ty = mkNonGenericTy v_float32_tcr + let v_float_ty = mkNonGenericTy v_float_tcr + let v_nativeint_ty = mkNonGenericTy v_nativeint_tcr + let v_unativeint_ty = mkNonGenericTy v_unativeint_tcr + let v_bool_ty = mkNonGenericTy v_bool_tcr - let v_int_ty = mkNonGenericTy v_int_tcr let v_char_ty = mkNonGenericTy v_char_tcr let v_obj_ty = mkNonGenericTy v_obj_tcr let v_string_ty = mkNonGenericTy v_string_tcr - let v_byte_ty = mkNonGenericTy v_byte_tcr let v_decimal_ty = mkSysNonGenericTy sys "Decimal" let v_unit_ty = mkNonGenericTy v_unit_tcr_nice let v_system_Type_typ = mkSysNonGenericTy sys "Type" @@ -554,10 +567,27 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_unchecked_addition_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Addition" , None , None , [vara;varb;varc], mk_binop_ty3 varaTy varbTy varcTy) let v_unchecked_subtraction_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Subtraction" , None , None , [vara;varb;varc], mk_binop_ty3 varaTy varbTy varcTy) let v_unchecked_multiply_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Multiply" , None , None , [vara;varb;varc], mk_binop_ty3 varaTy varbTy varcTy) + let v_unchecked_division_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Division" , None , None , [vara;varb;varc], mk_binop_ty3 varaTy varbTy varcTy) + let v_unchecked_modulus_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Modulus" , None , None , [vara;varb;varc], mk_binop_ty3 varaTy varbTy varcTy) let v_unchecked_unary_plus_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_UnaryPlus" , None , None , [vara], mk_unop_ty varaTy) let v_unchecked_unary_minus_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_UnaryNegation" , None , None , [vara], mk_unop_ty varaTy) let v_unchecked_unary_not_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "not" , None , Some "Not" , [], mk_unop_ty v_bool_ty) + let v_byte_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "byte" , None , Some "ToByte", [vara], ([[varaTy]], v_byte_ty)) + let v_sbyte_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "sbyte" , None , Some "ToSByte", [vara], ([[varaTy]], v_sbyte_ty)) + let v_int16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int16" , None , Some "ToInt16", [vara], ([[varaTy]], v_int16_ty)) + let v_uint16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint16" , None , Some "ToUInt16", [vara], ([[varaTy]], v_uint16_ty)) + let v_int_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int" , None , Some "ToInt", [vara], ([[varaTy]], v_int_ty)) + let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_ty)) + let v_int32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int32" , None , Some "ToInt32", [vara], ([[varaTy]], v_int32_ty)) + let v_uint32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint32" , None , Some "ToUInt32", [vara], ([[varaTy]], v_uint32_ty)) + let v_int64_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int64" , None , Some "ToInt64", [vara], ([[varaTy]], v_int64_ty)) + let v_uint64_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint64" , None , Some "ToUInt64", [vara], ([[varaTy]], v_uint64_ty)) + let v_float32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "float32" , None , Some "ToSingle", [vara], ([[varaTy]], v_float32_ty)) + let v_float_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "float" , None , Some "ToDouble", [vara], ([[varaTy]], v_float_ty)) + let v_nativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "nativeint" , None , Some "ToIntPtr", [vara], ([[varaTy]], v_nativeint_ty)) + let v_unativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "unativeint" , None , Some "ToUIntPtr", [vara], ([[varaTy]], v_unativeint_ty)) + let v_raise_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "raise" , None , Some "Raise" , [vara], ([[mkSysNonGenericTy sys "Exception"]], varaTy)) let v_failwith_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "failwith" , None , Some "FailWith" , [vara], ([[v_string_ty]], varaTy)) let v_invalid_arg_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "invalidArg" , None , Some "InvalidArg" , [vara], ([[v_string_ty]; [v_string_ty]], varaTy)) @@ -571,13 +601,19 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_sizeof_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "sizeof" , None , Some "SizeOf" , [vara], ([], v_int_ty)) let v_unchecked_defaultof_info = makeIntrinsicValRef(fslib_MFOperatorsUnchecked_nleref, "defaultof" , None , Some "DefaultOf", [vara], ([], varaTy)) let v_typedefof_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "typedefof" , None , Some "TypeDefOf", [vara], ([], v_system_Type_typ)) - let v_enum_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum" , [vara], ([[v_int_ty]], varaTy)) let v_range_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Range" , None , None , [vara], ([[varaTy];[varaTy]], mkSeqTy varaTy)) let v_range_step_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_RangeStep" , None , None , [vara;varb], ([[varaTy];[varbTy];[varaTy]], mkSeqTy varaTy)) let v_range_int32_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt32" , None , None , [], ([[v_int_ty];[v_int_ty];[v_int_ty]], mkSeqTy v_int_ty)) + + let v_array_length_info = makeIntrinsicValRef(fslib_MFArrayModule_nleref, "length" , None , Some "Length" , [vara], ([[mkArrayType 1 varaTy]], v_int_ty)) + let v_array_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray" , None , None , [vara], ([[mkArrayType 1 varaTy]; [v_int_ty]], varaTy)) let v_array2D_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray2D" , None , None , [vara], ([[mkArrayType 2 varaTy];[v_int_ty]; [v_int_ty]], varaTy)) let v_array3D_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray3D" , None , None , [vara], ([[mkArrayType 3 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]], varaTy)) let v_array4D_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray4D" , None , None , [vara], ([[mkArrayType 4 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]; [v_int_ty]], varaTy)) + let v_array_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray" , None , None , [vara], ([[mkArrayType 1 varaTy]; [v_int_ty]; [varaTy]], v_unit_ty)) + let v_array2D_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray2D" , None , None , [vara], ([[mkArrayType 2 varaTy];[v_int_ty]; [v_int_ty]; [varaTy]], v_unit_ty)) + let v_array3D_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray3D" , None , None , [vara], ([[mkArrayType 3 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]; [varaTy]], v_unit_ty)) + let v_array4D_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray4D" , None , None , [vara], ([[mkArrayType 4 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]; [v_int_ty]; [varaTy]], v_unit_ty)) let v_seq_collect_info = makeIntrinsicValRef(fslib_MFSeqModule_nleref, "collect" , None , Some "Collect", [vara;varb;varc], ([[varaTy --> varbTy]; [mkSeqTy varaTy]], mkSeqTy varcTy)) let v_seq_delay_info = makeIntrinsicValRef(fslib_MFSeqModule_nleref, "delay" , None , Some "Delay" , [varb], ([[v_unit_ty --> mkSeqTy varbTy]], mkSeqTy varbTy)) @@ -604,8 +640,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_splice_expr_info = makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref, "op_Splice" , None , None , [vara], ([[mkQuotedExprTy varaTy]], varaTy)) let v_splice_raw_expr_info = makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref, "op_SpliceUntyped" , None , None , [vara], ([[mkRawQuotedExprTy]], varaTy)) let v_new_decimal_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "MakeDecimal" , None , None , [], ([[v_int_ty]; [v_int_ty]; [v_int_ty]; [v_bool_ty]; [v_byte_ty]], v_decimal_ty)) - let v_array_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray" , None , None , [vara], ([[mkArrayType 1 varaTy]; [v_int_ty]], varaTy)) - let v_array_length_info = makeIntrinsicValRef(fslib_MFArrayModule_nleref, "length" , None , Some "Length" , [vara], ([[mkArrayType 1 varaTy]], v_int_ty)) let v_deserialize_quoted_FSharp_20_plus_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "Deserialize" , Some "Expr" , None , [], ([[v_system_Type_typ ;mkListTy v_system_Type_typ ;mkListTy mkRawQuotedExprTy ; mkArrayType 1 v_byte_ty]], mkRawQuotedExprTy )) let v_deserialize_quoted_FSharp_40_plus_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "Deserialize40" , Some "Expr" , None , [], ([[v_system_Type_typ ;mkArrayType 1 v_system_Type_typ; mkArrayType 1 v_system_Type_typ; mkArrayType 1 mkRawQuotedExprTy; mkArrayType 1 v_byte_ty]], mkRawQuotedExprTy )) let v_cast_quotation_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "Cast" , Some "Expr" , None , [vara], ([[mkRawQuotedExprTy]], mkQuotedExprTy varaTy)) @@ -852,15 +886,15 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member __.choice5_tcr = v_choice5_tcr member __.choice6_tcr = v_choice6_tcr member __.choice7_tcr = v_choice7_tcr - member val nativeint_ty = mkNonGenericTy v_nativeint_tcr - member val unativeint_ty = mkNonGenericTy v_unativeint_tcr - member val int32_ty = mkNonGenericTy v_int32_tcr - member val int16_ty = mkNonGenericTy v_int16_tcr - member val int64_ty = mkNonGenericTy v_int64_tcr - member val uint16_ty = mkNonGenericTy v_uint16_tcr - member val uint32_ty = mkNonGenericTy v_uint32_tcr - member val uint64_ty = mkNonGenericTy v_uint64_tcr - member val sbyte_ty = mkNonGenericTy v_sbyte_tcr + member val nativeint_ty = v_nativeint_ty + member val unativeint_ty = v_unativeint_ty + member val int32_ty = v_int32_ty + member val int16_ty = v_int16_ty + member val int64_ty = v_int64_ty + member val uint16_ty = v_uint16_ty + member val uint32_ty = v_uint32_ty + member val uint64_ty = v_uint64_ty + member val sbyte_ty = v_sbyte_ty member __.byte_ty = v_byte_ty member __.bool_ty = v_bool_ty member __.int_ty = v_int_ty @@ -871,8 +905,8 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member __.decimal_ty = v_decimal_ty member val exn_ty = mkNonGenericTy v_exn_tcr - member val float_ty = mkNonGenericTy v_float_tcr - member val float32_ty = mkNonGenericTy v_float32_tcr + member val float_ty = v_float_ty + member val float32_ty = v_float32_ty /// Memoization table to help minimize the number of ILSourceDocument objects we create member __.memoize_file x = v_memoize_file.Apply x @@ -1093,7 +1127,37 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member val unchecked_subtraction_vref = ValRefForIntrinsic v_unchecked_subtraction_info member val unchecked_multiply_vref = ValRefForIntrinsic v_unchecked_multiply_info member val unchecked_defaultof_vref = ValRefForIntrinsic v_unchecked_defaultof_info + + member __.bitwise_or_info = v_bitwise_or_info + member __.bitwise_and_info = v_bitwise_and_info + member __.bitwise_xor_info = v_bitwise_xor_info + member __.bitwise_unary_not_info = v_bitwise_unary_not_info + member __.bitwise_shift_left_info = v_bitwise_shift_left_info + member __.bitwise_shift_right_info = v_bitwise_shift_right_info + member __.unchecked_addition_info = v_unchecked_addition_info member __.unchecked_subtraction_info = v_unchecked_subtraction_info + member __.unchecked_multiply_info = v_unchecked_multiply_info + member __.unchecked_division_info = v_unchecked_division_info + member __.unchecked_modulus_info = v_unchecked_modulus_info + member __.unchecked_unary_plus_info = v_unchecked_unary_plus_info + member __.unchecked_unary_minus_info = v_unchecked_unary_minus_info + member __.unchecked_unary_not_info = v_unchecked_unary_not_info + + member __.byte_operator_info = v_byte_operator_info + member __.sbyte_operator_info = v_sbyte_operator_info + member __.int16_operator_info = v_int16_operator_info + member __.uint16_operator_info = v_uint16_operator_info + member __.int_operator_info = v_int_operator_info + member __.enum_operator_info = v_enum_operator_info + member __.int32_operator_info = v_int32_operator_info + member __.uint32_operator_info = v_uint32_operator_info + member __.int64_operator_info = v_int64_operator_info + member __.uint64_operator_info = v_uint64_operator_info + member __.float32_operator_info = v_float32_operator_info + member __.float_operator_info = v_float_operator_info + member __.nativeint_operator_info = v_nativeint_operator_info + member __.unativeint_operator_info = v_unativeint_operator_info + member val compare_operator_vref = ValRefForIntrinsic v_compare_operator_info member val equals_operator_vref = ValRefForIntrinsic v_equals_operator_info member val equals_nullable_operator_vref = ValRefForIntrinsic v_equals_nullable_operator_info @@ -1112,7 +1176,13 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member val invalid_op_vref = ValRefForIntrinsic v_invalid_op_info member val failwithf_vref = ValRefForIntrinsic v_failwithf_info - member __.equals_operator_info = v_equals_operator_info + member __.equals_operator_info = v_equals_operator_info + member __.not_equals_operator = v_not_equals_operator_info + member __.less_than_operator = v_less_than_operator_info + member __.less_than_or_equals_operator = v_less_than_or_equals_operator_info + member __.greater_than_operator = v_greater_than_operator_info + member __.greater_than_or_equals_operator = v_greater_than_or_equals_operator_info + member __.raise_info = v_raise_info member __.failwith_info = v_failwith_info member __.invalid_arg_info = v_invalid_arg_info @@ -1123,14 +1193,13 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member __.methodhandleof_info = v_methodhandleof_info member __.typeof_info = v_typeof_info member __.typedefof_info = v_typedefof_info - member __.array_length_info = v_array_length_info member val reraise_vref = ValRefForIntrinsic v_reraise_info member val methodhandleof_vref = ValRefForIntrinsic v_methodhandleof_info member val typeof_vref = ValRefForIntrinsic v_typeof_info member val sizeof_vref = ValRefForIntrinsic v_sizeof_info member val typedefof_vref = ValRefForIntrinsic v_typedefof_info - member val enum_vref = ValRefForIntrinsic v_enum_info + member val enum_vref = ValRefForIntrinsic v_enum_operator_info member val enumOfValue_vref = ValRefForIntrinsic v_enumOfValue_info member val range_op_vref = ValRefForIntrinsic v_range_op_info member val range_step_op_vref = ValRefForIntrinsic v_range_step_op_info @@ -1192,10 +1261,17 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member __.create_event_info = v_create_event_info member __.seq_to_list_info = v_seq_to_list_info member __.seq_to_array_info = v_seq_to_array_info + + member __.array_length_info = v_array_length_info member __.array_get_info = v_array_get_info - member __.array2D_get_info = v_array2D_get_info - member __.array3D_get_info = v_array3D_get_info - member __.array4D_get_info = v_array4D_get_info + member __.array2D_get_info = v_array2D_get_info + member __.array3D_get_info = v_array3D_get_info + member __.array4D_get_info = v_array4D_get_info + member __.array_set_info = v_array_set_info + member __.array2D_set_info = v_array2D_set_info + member __.array3D_set_info = v_array3D_set_info + member __.array4D_set_info = v_array4D_set_info + member __.deserialize_quoted_FSharp_20_plus_info = v_deserialize_quoted_FSharp_20_plus_info member __.deserialize_quoted_FSharp_40_plus_info = v_deserialize_quoted_FSharp_40_plus_info member __.cast_quotation_info = v_cast_quotation_info diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index 76f3dad6d7c..1eba79a8d24 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -199,6 +199,62 @@ module FSharpExprConvert = | Expr.Op(TOp.ValFieldSet rfref, _, _, _) when IsStaticInitializationField rfref -> Some () | _ -> None + let (|ILUnaryOp|_|) e = + match e with + | AI_neg -> Some mkCallUnaryNegOperator + | AI_not -> Some mkCallUnaryNotOperator + | _ -> None + + let (|ILBinaryOp|_|) e = + match e with + | AI_add + | AI_add_ovf + | AI_add_ovf_un -> Some mkCallAdditionOperator + | AI_sub + | AI_sub_ovf + | AI_sub_ovf_un -> Some mkCallSubtractionOperator + | AI_mul + | AI_mul_ovf + | AI_mul_ovf_un -> Some mkCallMultiplyOperator + | AI_div + | AI_div_un -> Some mkCallDivisionOperator + | AI_rem + | AI_rem_un -> Some mkCallModulusOperator + | AI_ceq -> Some mkCallEqualsOperator + | AI_clt + | AI_clt_un -> Some mkCallLessThanOperator + | AI_cgt + | AI_cgt_un -> Some mkCallGreaterThanOperator + | AI_and -> Some mkCallBitwiseAndOperator + | AI_or -> Some mkCallBitwiseOrOperator + | AI_xor -> Some mkCallBitwiseXorOperator + | AI_shl -> Some mkCallShiftLeftOperator + | AI_shr + | AI_shr_un -> Some mkCallShiftRightOperator + | _ -> None + + let (|ILConvertOp|_|) e = + match e with + | AI_conv basicTy + | AI_conv_ovf basicTy + | AI_conv_ovf_un basicTy -> + match basicTy with + | DT_R -> None + | DT_I1 -> Some mkCallToSByteOperator + | DT_U1 -> Some mkCallToByteOperator + | DT_I2 -> Some mkCallToInt16Operator + | DT_U2 -> Some mkCallToUInt16Operator + | DT_I4 -> Some mkCallToInt32Operator + | DT_U4 -> Some mkCallToUInt32Operator + | DT_I8 -> Some mkCallToInt64Operator + | DT_U8 -> Some mkCallToUInt64Operator + | DT_R4 -> Some mkCallToSingleOperator + | DT_R8 -> Some mkCallToDoubleOperator + | DT_I -> Some mkCallToIntPtrOperator + | DT_U -> Some mkCallToUIntPtrOperator + | DT_REF -> None + | _ -> None + let ConvType cenv typ = FSharpType(cenv, typ) let ConvTypes cenv typs = List.map (ConvType cenv) typs let ConvILTypeRefApp (cenv:Impl.cenv) m tref tyargs = @@ -532,11 +588,43 @@ module FSharpExprConvert = let argR = ConvExpr cenv env arg E.ILFieldSet(None, typR, fspec.Name, argR) + | TOp.ILAsm([ AI_ldnull; AI_cgt_un ], _), _, [arg] -> + let elemTy = tyOfExpr cenv.g arg + let nullVal = mkNull m elemTy + let op = mkCallNotEqualsOperator cenv.g m elemTy arg nullVal + ConvExprPrim cenv env op + + | TOp.ILAsm([ I_ldlen; AI_conv DT_I4 ], _), _, [arr] -> + let arrayTy = tyOfExpr cenv.g arr + let elemTy = destArrayTy cenv.g arrayTy + let op = mkCallArrayLength cenv.g m elemTy arr + ConvExprPrim cenv env op + + | TOp.ILAsm([ I_newarr (ILArrayShape [(Some 0, None)], _)], _), [elemTy], xa -> + E.NewArray(ConvType cenv elemTy, ConvExprs cenv env xa) + + | TOp.ILAsm([ I_ldelem_any (ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx1] -> + let op = mkCallArrayGet cenv.g m elemTy arr idx1 + ConvExprPrim cenv env op - | TOp.ILAsm([ AI_ceq ], _), _, [arg1;arg2] -> + | TOp.ILAsm([ I_stelem_any (ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx1; v] -> + let op = mkCallArraySet cenv.g m elemTy arr idx1 v + ConvExprPrim cenv env op + + | TOp.ILAsm([ ILUnaryOp unaryOp ], _), _, [arg] -> + let ty = tyOfExpr cenv.g arg + let op = unaryOp cenv.g m ty arg + ConvExprPrim cenv env op + + | TOp.ILAsm([ ILBinaryOp binaryOp ], _), _, [arg1;arg2] -> let ty = tyOfExpr cenv.g arg1 - let eq = mkCallEqualsOperator cenv.g m ty arg1 arg2 - ConvExprPrim cenv env eq + let op = binaryOp cenv.g m ty arg1 arg2 + ConvExprPrim cenv env op + + | TOp.ILAsm([ ILConvertOp convertOp ], _), _, [arg] -> + let ty = tyOfExpr cenv.g arg + let op = convertOp cenv.g m ty arg + ConvExprPrim cenv env op | TOp.ILAsm([ I_throw ], _), _, [arg1] -> let raiseExpr = mkCallRaise cenv.g m (tyOfExpr cenv.g expr) arg1 @@ -605,17 +693,18 @@ module FSharpExprConvert = | TOp.While _, [], [Expr.Lambda(_, _, _, [_], test, _, _);Expr.Lambda(_, _, _, [_], body, _, _)] -> E.WhileLoop(ConvExpr cenv env test, ConvExpr cenv env body) - | TOp.For(_, (FSharpForLoopUp |FSharpForLoopDown as dir) ), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], SimpleArrayLoopUpperBound, lm, _); SimpleArrayLoopBody cenv.g (arr, elemTy, body)] -> + | TOp.For(_, dir), [], [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 - E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, (dir = FSharpForLoopUp)) - - | TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _);Expr.Lambda(_, _, _, [_], lim1, _, _);body] -> - match dir with - | FSharpForLoopUp -> E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, true) - | FSharpForLoopDown -> E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, false) - | _ -> failwith "unexpected for-loop form" + mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty len (mkOne cenv.g lm) // len - 1 + E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, dir <> FSharpForLoopDown) + + | TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], lim1, lm, _); body] -> + let lim1 = + if dir = CSharpForLoopUp then + mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty lim1 (mkOne cenv.g lm) // len - 1 + else lim1 + E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, dir <> FSharpForLoopDown) | TOp.ILCall(_, _, _, isNewObj, valUseFlags, _isProp, _, ilMethRef, enclTypeArgs, methTypeArgs, _tys), [], callArgs -> ConvILCall cenv env (isNewObj, valUseFlags, ilMethRef, enclTypeArgs, methTypeArgs, callArgs, m) diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 157522539d5..b0b2ebbfdde 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -1793,7 +1793,7 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem | None -> invalidOp ("The project has no results due to critical errors in the project options. Check the HasCriticalErrors before accessing the detaild results. Errors: " + String.concat "\n" [ for e in errors -> e.Message ]) | Some d -> d - let tcConfig() = + let getTcConfig() = match tcConfigOption with | None -> invalidOp ("The project has no results due to critical errors in the project options. Check the HasCriticalErrors before accessing the detaild results. Errors: " + String.concat "\n" [ for e in errors -> e.Message ]) | Some d -> d @@ -1805,7 +1805,7 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem member info.AssemblySignature = let (tcGlobals, tcImports, thisCcu, ccuSig, _tcSymbolUses, topAttribs, _tcAssemblyData, _ilAssemRef, _ad, _tcAssemblyExpr, _dependencyFiles) = getDetails() FSharpAssemblySignature(tcGlobals, thisCcu, tcImports, topAttribs, ccuSig) - + member info.TypedImplementionFiles = if not keepAssemblyContents then invalidOp "The 'keepAssemblyContents' flag must be set to true on the FSharpChecker in order to access the checked contents of assemblies" let (tcGlobals, tcImports, thisCcu, _ccuSig, _tcSymbolUses, _topAttribs, _tcAssemblyData, _ilAssemRef, _ad, tcAssemblyExpr, _dependencyFiles) = getDetails() @@ -1817,13 +1817,13 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem member info.AssemblyContents = FSharpAssemblyContents(info.TypedImplementionFiles) - member info.OptimizedAssemblyContents = let tcGlobals, thisCcu, tcImports, mimpls = info.TypedImplementionFiles let outfile = null let importMap = tcImports.GetImportMap() let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) - let optimizedImpls, _optimizationData, _ = ApplyAllOptimizations (tcConfig(), tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, importMap, false, optEnv0, thisCcu, mimpls) + let tcConfig = getTcConfig() + let optimizedImpls, _optimizationData, _ = ApplyAllOptimizations (tcConfig, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, importMap, false, optEnv0, thisCcu, mimpls) let mimpls = match optimizedImpls with | TypedAssemblyAfterOptimization files ->