From 7bfb032bd73a678cd5a7efc089e4016fe884159c Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Mon, 16 Sep 2024 09:58:46 -0700 Subject: [PATCH 01/37] Switch to new VMR control set (#17703) * Now that fsharp is on 9.0, we can switch to the new control set. Generally: - DotNetBuildFromSource -> DotNetBuildSourceOnly - Building a source-only build. - DotnetBuildFromSourceFlavor == Product -> DotNetBuildOrchestrator == true - Building in the VMR, could be source-only or MS's build. - ArcadeBuildFromSource -> DotNetBuildRepo == true -> Indicates an outer repo build. * Split out source build args * Split out source build args * Remove unnecessary source build env var set * Add properties to the bootstrap compiler build * BuildRepo -> BuildInnerRepo * Only build proto repo in inner build * Additional VMR properties for completeness * Rename sourcebuild.props -> dotnetbuild.props --------- Co-authored-by: Petr --- Directory.Build.props | 4 ++-- Directory.Build.targets | 2 +- FSharpBuild.Directory.Build.props | 4 ++-- eng/Build.ps1 | 4 +++- eng/{SourceBuild.props => DotNetBuild.props} | 8 ++++---- eng/build.sh | 9 +++++++-- eng/test-determinism.ps1 | 2 +- proto.proj | 6 ++++-- setup/Swix/Directory.Build.targets | 2 +- 9 files changed, 25 insertions(+), 16 deletions(-) rename eng/{SourceBuild.props => DotNetBuild.props} (87%) diff --git a/Directory.Build.props b/Directory.Build.props index 719838f0a0d..7f5b362cb34 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,7 +7,7 @@ $(MSBuildThisFileDirectory) true net9.0 - $(DotNetBuildFromSource) + $(DotNetBuildSourceOnly) - + $(NetCurrent) diff --git a/Directory.Build.targets b/Directory.Build.targets index df0677f7673..c43425cc369 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -26,7 +26,7 @@ When .NET gets built from source, make the SDK aware there are bootstrap packages for Microsoft.NETCore.App.Runtime. and Microsoft.NETCore.App.Crossgen2.. --> - + %(RuntimePackRuntimeIdentifiers);$(NETCoreSdkRuntimeIdentifier) diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index b2b9ae303cb..148d9c95116 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -73,8 +73,8 @@ false - - + + false diff --git a/eng/Build.ps1 b/eng/Build.ps1 index a6bda85ef6b..6305083d0df 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -292,6 +292,8 @@ function BuildSolution([string] $solutionName, $nopack) { # Do not set the property to true explicitly, since that would override value projects might set. $suppressExtensionDeployment = if (!$deployExtensions) { "/p:DeployExtension=false" } else { "" } + $sourceBuildArgs = if ($sourceBuild) { "/p:DotNetBuildSourceOnly=true /p:DotNetBuildRepo=true" } else { "" } + $BUILDING_USING_DOTNET_ORIG = $env:BUILDING_USING_DOTNET $env:BUILDING_USING_DOTNET="false" @@ -314,10 +316,10 @@ function BuildSolution([string] $solutionName, $nopack) { /p:QuietRestore=$quietRestore ` /p:QuietRestoreBinaryLog=$binaryLog ` /p:TestTargetFrameworks=$testTargetFrameworks ` - /p:DotNetBuildFromSource=$sourceBuild ` /p:CompressAllMetadata=$CompressAllMetadata ` /p:BuildNoRealsig=$buildnorealsig ` /v:$verbosity ` + $sourceBuildArgs ` $suppressExtensionDeployment ` @properties diff --git a/eng/SourceBuild.props b/eng/DotNetBuild.props similarity index 87% rename from eng/SourceBuild.props rename to eng/DotNetBuild.props index c1759d53260..c7bc688ba3e 100644 --- a/eng/SourceBuild.props +++ b/eng/DotNetBuild.props @@ -13,7 +13,7 @@ --> + Condition="'$(DotNetBuildSourceOnly)' == 'true'"> $(InnerBuildArgs) /p:Projects="$(InnerSourceBuildRepoRoot)\Microsoft.FSharp.Compiler.sln" @@ -26,7 +26,7 @@ + Condition="'$(DotNetBuildSourceOnly)' == 'true'"> --tfm $(SourceBuildBootstrapTfm) @@ -41,9 +41,9 @@ -bl enables the binlogs for the tools and Proto builds, which make debugging failures here easier --> + EnvironmentVariables="@(InnerBuildEnv)" /> diff --git a/eng/build.sh b/eng/build.sh index 8544de1e72e..90260cbfa4f 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -241,6 +241,11 @@ function BuildSolution { if [[ "$UNAME" == "Darwin" ]]; then enable_analyzers=false fi + + local source_build_args="" + if [[ "$source_build" == true ]]; then + source_build_args="/p:DotNetBuildRepo=true /p:DotNetBuildSourceOnly=true" + fi # NuGet often exceeds the limit of open files on Mac and Linux # https://github.com/NuGet/Home/issues/2163 @@ -274,7 +279,7 @@ function BuildSolution { fi BuildMessage="Error building tools" - local args=" publish $repo_root/proto.proj $blrestore $bltools /p:Configuration=Proto /p:ArcadeBuildFromSource=$source_build $properties" + local args=" publish $repo_root/proto.proj $blrestore $bltools /p:Configuration=Proto $source_build_args $properties" echo $args "$DOTNET_INSTALL_DIR/dotnet" $args #$args || exit $? fi @@ -296,8 +301,8 @@ function BuildSolution { /p:ContinuousIntegrationBuild=$ci \ /p:QuietRestore=$quiet_restore \ /p:QuietRestoreBinaryLog="$binary_log" \ - /p:ArcadeBuildFromSource=$source_build \ /p:BuildNoRealsig=$buildnorealsig \ + $source_build_args \ $properties fi } diff --git a/eng/test-determinism.ps1 b/eng/test-determinism.ps1 index fcb5495f434..8056de2b371 100644 --- a/eng/test-determinism.ps1 +++ b/eng/test-determinism.ps1 @@ -78,7 +78,7 @@ function Run-Build([string]$rootDir, [string]$increment) { /p:ContinuousIntegrationBuild=false ` /p:OfficialBuildId="" ` /p:QuietRestore=false ` - /p:DotNetBuildFromSource=false ` + /p:DotNetBuildSourceOnly=false ` /p:Deterministic=true ` /p:DebugDeterminism=true ` /p:Features="debug-determinism" ` diff --git a/proto.proj b/proto.proj index 2d07b389fa6..eb0814976ea 100644 --- a/proto.proj +++ b/proto.proj @@ -4,8 +4,10 @@ Bootstrap - - + + diff --git a/setup/Swix/Directory.Build.targets b/setup/Swix/Directory.Build.targets index 5e826e8da63..85048309295 100644 --- a/setup/Swix/Directory.Build.targets +++ b/setup/Swix/Directory.Build.targets @@ -15,7 +15,7 @@ + Condition="'$(DotNetBuildSourceOnly)' != 'true'"> From d30b9761e5f645fcb8d6fdec846589299fc3b627 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Mon, 16 Sep 2024 20:11:35 +0200 Subject: [PATCH 02/37] Fix docs for F# language (#17750) --- docs/release-notes/About.md | 2 +- docs/release-notes/Language.fsx | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/About.md b/docs/release-notes/About.md index 20e5138533c..5a8434709d3 100644 --- a/docs/release-notes/About.md +++ b/docs/release-notes/About.md @@ -7,7 +7,7 @@ title: About # About -The release notes for the [F\# language](./Language.md), [FSharp.Core](./FSharp.Core.md) and [FSharp.Compiler.Service](./FSharp.Compiler.Service.md) are based on the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. +The release notes for the [F\# language](./Language.html), [FSharp.Core](./FSharp.Core.html) and [FSharp.Compiler.Service](./FSharp.Compiler.Service.html) are based on the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. The target audience of these release notes are the respective end-users. ## Writing a changelog entry diff --git a/docs/release-notes/Language.fsx b/docs/release-notes/Language.fsx index 73c173e7774..3bcd6f14c3d 100644 --- a/docs/release-notes/Language.fsx +++ b/docs/release-notes/Language.fsx @@ -25,7 +25,11 @@ Directory.EnumerateFiles(path, "*.md") | "preview", "preview" -> 0 | "preview", _ -> -1 | _, "preview" -> 1 - | _, _ -> compare (int b) (int a)) + | _, _ -> + match System.Decimal.TryParse(b), System.Decimal.TryParse(b) with + | (true, a) , ( true, b) -> compare (int b) (int a) + | _ -> failwithf "Cannot compare %s with %s" b a + ) |> Seq.map (fun file -> let version = Path.GetFileNameWithoutExtension(file) let version = if version = "preview" then "Preview" else version From 848c0385b1a405b7b17a1eaed233ca6eac46b48e Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 16 Sep 2024 13:21:58 -0700 Subject: [PATCH 03/37] Fix17713 - Reverting PR - 17649 - Make the interaction between #line and #nowarn directives consistent (#17724) * fix * temp * revert * readme --------- Co-authored-by: Vlad Zarytovskii --- buildtools/fsyacc/fsyaccdriver.fs | 2 - .../.FSharp.Compiler.Service/9.0.100.md | 1 - src/Compiler/AbstractIL/ilpars.fsy | 1 - src/Compiler/Driver/CompilerDiagnostics.fs | 25 +++++---- src/Compiler/Driver/CompilerDiagnostics.fsi | 3 +- src/Compiler/Driver/ParseAndCheckInputs.fs | 4 +- src/Compiler/Driver/fsc.fs | 2 +- src/Compiler/FSComp.txt | 3 +- src/Compiler/Facilities/LanguageFeatures.fs | 3 -- src/Compiler/Facilities/LanguageFeatures.fsi | 1 - src/Compiler/Service/IncrementalBuild.fs | 2 +- src/Compiler/Service/TransparentCompiler.fs | 7 +-- src/Compiler/pars.fsy | 1 - src/Compiler/pppars.fsy | 1 - src/Compiler/xlf/FSComp.txt.cs.xlf | 5 -- src/Compiler/xlf/FSComp.txt.de.xlf | 5 -- src/Compiler/xlf/FSComp.txt.es.xlf | 5 -- src/Compiler/xlf/FSComp.txt.fr.xlf | 5 -- src/Compiler/xlf/FSComp.txt.it.xlf | 5 -- src/Compiler/xlf/FSComp.txt.ja.xlf | 5 -- src/Compiler/xlf/FSComp.txt.ko.xlf | 5 -- src/Compiler/xlf/FSComp.txt.pl.xlf | 5 -- src/Compiler/xlf/FSComp.txt.pt-BR.xlf | 5 -- src/Compiler/xlf/FSComp.txt.ru.xlf | 5 -- src/Compiler/xlf/FSComp.txt.tr.xlf | 5 -- src/Compiler/xlf/FSComp.txt.zh-Hans.xlf | 5 -- src/Compiler/xlf/FSComp.txt.zh-Hant.xlf | 5 -- .../CompilerDirectives/Nowarn.fs | 51 ------------------- .../FSharp.Compiler.ComponentTests.fsproj | 1 - 29 files changed, 22 insertions(+), 151 deletions(-) delete mode 100644 tests/FSharp.Compiler.ComponentTests/CompilerDirectives/Nowarn.fs diff --git a/buildtools/fsyacc/fsyaccdriver.fs b/buildtools/fsyacc/fsyaccdriver.fs index f46e607f93a..c9ca12e4710 100644 --- a/buildtools/fsyacc/fsyaccdriver.fs +++ b/buildtools/fsyacc/fsyaccdriver.fs @@ -199,8 +199,6 @@ let writeSpecToFile (generatorState: GeneratorState) (spec: ParserSpec) (compile writer.WriteLineInterface "module %s" s; writer.WriteLine "#nowarn \"64\";; // turn off warnings that type variables used in production annotations are instantiated to concrete type"; - writer.WriteLine "#nowarn \"1182\" // the generated code often has unused variable 'parseState'" - writer.WriteLine "#nowarn \"3261\" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null`"; for s in generatorState.opens do writer.WriteLine "open %s" s; diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md index 22eee3e2e5b..91b91f3c3eb 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md @@ -1,6 +1,5 @@ ### Fixed -* Fix a bug in the interaction between ``#line` and `#nowarn` directives ([PR #17649](https://github.com/dotnet/fsharp/pull/17649)) * Fix wrong TailCall warning ([Issue #17604](https://github.com/dotnet/fsharp/issues/17604), [PR #17637](https://github.com/dotnet/fsharp/pull/17637)) * Compiler hangs when compiling inline recursive invocation ([Issue #17376](https://github.com/dotnet/fsharp/issues/17376), [PR #17394](https://github.com/dotnet/fsharp/pull/17394)) * Fix reporting IsFromComputationExpression only for CE builder type constructors and let bindings. ([PR #17375](https://github.com/dotnet/fsharp/pull/17375)) diff --git a/src/Compiler/AbstractIL/ilpars.fsy b/src/Compiler/AbstractIL/ilpars.fsy index b8380364f6b..ca06f6570be 100644 --- a/src/Compiler/AbstractIL/ilpars.fsy +++ b/src/Compiler/AbstractIL/ilpars.fsy @@ -2,7 +2,6 @@ %{ -#nowarn "64" // turn off warnings that type variables used in production annotations are instantiated to concrete type #nowarn "1182" // the generated code often has unused variable "parseState" #nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` diff --git a/src/Compiler/Driver/CompilerDiagnostics.fs b/src/Compiler/Driver/CompilerDiagnostics.fs index c73b8e5d197..1c50ca26781 100644 --- a/src/Compiler/Driver/CompilerDiagnostics.fs +++ b/src/Compiler/Driver/CompilerDiagnostics.fs @@ -24,7 +24,6 @@ open FSharp.Compiler.ConstraintSolver open FSharp.Compiler.DiagnosticMessage open FSharp.Compiler.Diagnostics open FSharp.Compiler.DiagnosticsLogger -open FSharp.Compiler.Features open FSharp.Compiler.Infos open FSharp.Compiler.IO open FSharp.Compiler.Lexhelp @@ -2300,13 +2299,17 @@ type PhasedDiagnostic with // Scoped #nowarn pragmas /// Build an DiagnosticsLogger that delegates to another DiagnosticsLogger but filters warnings turned off by the given pragma declarations +// +// NOTE: we allow a flag to turn of strict file checking. This is because file names sometimes don't match due to use of +// #line directives, e.g. for pars.fs/pars.fsy. In this case we just test by line number - in most cases this is sufficient +// because we install a filtering error handler on a file-by-file basis for parsing and type-checking. +// However this is indicative of a more systematic problem where source-line +// sensitive operations (lexfilter and warning filtering) do not always +// interact well with #line directives. type DiagnosticsLoggerFilteringByScopedPragmas - (langVersion: LanguageVersion, scopedPragmas, diagnosticOptions: FSharpDiagnosticOptions, diagnosticsLogger: DiagnosticsLogger) = + (checkFile, scopedPragmas, diagnosticOptions: FSharpDiagnosticOptions, diagnosticsLogger: DiagnosticsLogger) = inherit DiagnosticsLogger("DiagnosticsLoggerFilteringByScopedPragmas") - let needCompatibilityWithEarlierInconsistentInteraction = - not (langVersion.SupportsFeature LanguageFeature.ConsistentNowarnLineDirectiveInteraction) - let mutable realErrorPresent = false override _.DiagnosticSink(diagnostic: PhasedDiagnostic, severity) = @@ -2320,10 +2323,12 @@ type DiagnosticsLoggerFilteringByScopedPragmas match diagnostic.Range with | Some m -> scopedPragmas - |> List.exists (fun (ScopedPragma.WarningOff(pragmaRange, warningNumFromPragma)) -> + |> List.exists (fun pragma -> + let (ScopedPragma.WarningOff(pragmaRange, warningNumFromPragma)) = pragma + warningNum = warningNumFromPragma - && (needCompatibilityWithEarlierInconsistentInteraction - || m.FileIndex = pragmaRange.FileIndex && posGeq m.Start pragmaRange.Start)) + && (not checkFile || m.FileIndex = pragmaRange.FileIndex) + && posGeq m.Start pragmaRange.Start) |> not | None -> true @@ -2339,5 +2344,5 @@ type DiagnosticsLoggerFilteringByScopedPragmas override _.CheckForRealErrorsIgnoringWarnings = realErrorPresent -let GetDiagnosticsLoggerFilteringByScopedPragmas (langVersion, scopedPragmas, diagnosticOptions, diagnosticsLogger) = - DiagnosticsLoggerFilteringByScopedPragmas(langVersion, scopedPragmas, diagnosticOptions, diagnosticsLogger) :> DiagnosticsLogger +let GetDiagnosticsLoggerFilteringByScopedPragmas (checkFile, scopedPragmas, diagnosticOptions, diagnosticsLogger) = + DiagnosticsLoggerFilteringByScopedPragmas(checkFile, scopedPragmas, diagnosticOptions, diagnosticsLogger) :> DiagnosticsLogger diff --git a/src/Compiler/Driver/CompilerDiagnostics.fsi b/src/Compiler/Driver/CompilerDiagnostics.fsi index 7c5acef17d4..6139da434cf 100644 --- a/src/Compiler/Driver/CompilerDiagnostics.fsi +++ b/src/Compiler/Driver/CompilerDiagnostics.fsi @@ -7,7 +7,6 @@ open System.Text open FSharp.Compiler.CompilerConfig open FSharp.Compiler.Diagnostics open FSharp.Compiler.DiagnosticsLogger -open FSharp.Compiler.Features open FSharp.Compiler.Syntax open FSharp.Compiler.Text @@ -85,7 +84,7 @@ type PhasedDiagnostic with /// Get a diagnostics logger that filters the reporting of warnings based on scoped pragma information val GetDiagnosticsLoggerFilteringByScopedPragmas: - langVersion: LanguageVersion * + checkFile: bool * scopedPragmas: ScopedPragma list * diagnosticOptions: FSharpDiagnosticOptions * diagnosticsLogger: DiagnosticsLogger -> diff --git a/src/Compiler/Driver/ParseAndCheckInputs.fs b/src/Compiler/Driver/ParseAndCheckInputs.fs index d5d18d79651..a6804bfe746 100644 --- a/src/Compiler/Driver/ParseAndCheckInputs.fs +++ b/src/Compiler/Driver/ParseAndCheckInputs.fs @@ -511,7 +511,7 @@ let ParseInput finally // OK, now commit the errors, since the ScopedPragmas will (hopefully) have been scraped let filteringDiagnosticsLogger = - GetDiagnosticsLoggerFilteringByScopedPragmas(lexbuf.LanguageVersion, scopedPragmas, diagnosticOptions, diagnosticsLogger) + GetDiagnosticsLoggerFilteringByScopedPragmas(false, scopedPragmas, diagnosticOptions, diagnosticsLogger) delayLogger.CommitDelayedDiagnostics filteringDiagnosticsLogger @@ -1429,7 +1429,7 @@ let CheckOneInput // Within a file, equip loggers to locally filter w.r.t. scope pragmas in each input let DiagnosticsLoggerForInput (tcConfig: TcConfig, input: ParsedInput, oldLogger) = - GetDiagnosticsLoggerFilteringByScopedPragmas(tcConfig.langVersion, input.ScopedPragmas, tcConfig.diagnosticsOptions, oldLogger) + GetDiagnosticsLoggerFilteringByScopedPragmas(false, input.ScopedPragmas, tcConfig.diagnosticsOptions, oldLogger) /// Typecheck a single file (or interactive entry into F# Interactive) let CheckOneInputEntry (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt) tcState input = diff --git a/src/Compiler/Driver/fsc.fs b/src/Compiler/Driver/fsc.fs index 9dccdec826d..ac4ee179538 100644 --- a/src/Compiler/Driver/fsc.fs +++ b/src/Compiler/Driver/fsc.fs @@ -745,7 +745,7 @@ let main2 yield! pragmas ] - GetDiagnosticsLoggerFilteringByScopedPragmas(tcConfig.langVersion, scopedPragmas, tcConfig.diagnosticsOptions, oldLogger) + GetDiagnosticsLoggerFilteringByScopedPragmas(true, scopedPragmas, tcConfig.diagnosticsOptions, oldLogger) SetThreadDiagnosticsLoggerNoUnwind diagnosticsLogger diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt index 2e391fa5515..b5a50afc7c0 100644 --- a/src/Compiler/FSComp.txt +++ b/src/Compiler/FSComp.txt @@ -1783,5 +1783,4 @@ featureEmptyBodiedComputationExpressions,"Support for computation expressions wi featureAllowAccessModifiersToAutoPropertiesGettersAndSetters,"Allow access modifiers to auto properties getters and setters" 3871,tcAccessModifiersNotAllowedInSRTPConstraint,"Access modifiers cannot be applied to an SRTP constraint." featureAllowObjectExpressionWithoutOverrides,"Allow object expressions without overrides" -3872,tcPartialActivePattern,"Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern." -featureConsistentNowarnLineDirectiveInteraction,"The interaction between #nowarn and #line is now consistent." +3872,tcPartialActivePattern,"Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern." \ No newline at end of file diff --git a/src/Compiler/Facilities/LanguageFeatures.fs b/src/Compiler/Facilities/LanguageFeatures.fs index 5f16aead30a..5d71f3ed27b 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fs +++ b/src/Compiler/Facilities/LanguageFeatures.fs @@ -94,7 +94,6 @@ type LanguageFeature = | ParsedHashDirectiveArgumentNonQuotes | EmptyBodiedComputationExpressions | AllowObjectExpressionWithoutOverrides - | ConsistentNowarnLineDirectiveInteraction /// LanguageVersion management type LanguageVersion(versionText) = @@ -213,7 +212,6 @@ type LanguageVersion(versionText) = LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops, languageVersion90 LanguageFeature.ParsedHashDirectiveArgumentNonQuotes, languageVersion90 LanguageFeature.EmptyBodiedComputationExpressions, languageVersion90 - LanguageFeature.ConsistentNowarnLineDirectiveInteraction, languageVersion90 // F# preview LanguageFeature.EnforceAttributeTargets, previewVersion // waiting for fix of https://github.com/dotnet/fsharp/issues/17731 @@ -377,7 +375,6 @@ type LanguageVersion(versionText) = | LanguageFeature.ParsedHashDirectiveArgumentNonQuotes -> FSComp.SR.featureParsedHashDirectiveArgumentNonString () | LanguageFeature.EmptyBodiedComputationExpressions -> FSComp.SR.featureEmptyBodiedComputationExpressions () | LanguageFeature.AllowObjectExpressionWithoutOverrides -> FSComp.SR.featureAllowObjectExpressionWithoutOverrides () - | LanguageFeature.ConsistentNowarnLineDirectiveInteraction -> FSComp.SR.featureConsistentNowarnLineDirectiveInteraction () /// Get a version string associated with the given feature. static member GetFeatureVersionString feature = diff --git a/src/Compiler/Facilities/LanguageFeatures.fsi b/src/Compiler/Facilities/LanguageFeatures.fsi index 4ae722c7f60..7408300b943 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fsi +++ b/src/Compiler/Facilities/LanguageFeatures.fsi @@ -85,7 +85,6 @@ type LanguageFeature = | ParsedHashDirectiveArgumentNonQuotes | EmptyBodiedComputationExpressions | AllowObjectExpressionWithoutOverrides - | ConsistentNowarnLineDirectiveInteraction /// LanguageVersion management type LanguageVersion = diff --git a/src/Compiler/Service/IncrementalBuild.fs b/src/Compiler/Service/IncrementalBuild.fs index 7951f3c9328..b7560b222c2 100644 --- a/src/Compiler/Service/IncrementalBuild.fs +++ b/src/Compiler/Service/IncrementalBuild.fs @@ -259,7 +259,7 @@ type BoundModel private ( IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBETypechecked fileName) let capturingDiagnosticsLogger = CapturingDiagnosticsLogger("TypeCheck") - let diagnosticsLogger = GetDiagnosticsLoggerFilteringByScopedPragmas(tcConfig.langVersion, input.ScopedPragmas, tcConfig.diagnosticsOptions, capturingDiagnosticsLogger) + let diagnosticsLogger = GetDiagnosticsLoggerFilteringByScopedPragmas(false, input.ScopedPragmas, tcConfig.diagnosticsOptions, capturingDiagnosticsLogger) use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.TypeCheck) beforeFileChecked.Trigger fileName diff --git a/src/Compiler/Service/TransparentCompiler.fs b/src/Compiler/Service/TransparentCompiler.fs index 735a6b241f1..e3acd1d4c6c 100644 --- a/src/Compiler/Service/TransparentCompiler.fs +++ b/src/Compiler/Service/TransparentCompiler.fs @@ -1303,12 +1303,7 @@ type internal TransparentCompiler let diagnosticsLogger = errHandler.DiagnosticsLogger let diagnosticsLogger = - GetDiagnosticsLoggerFilteringByScopedPragmas( - tcConfig.langVersion, - input.ScopedPragmas, - tcConfig.diagnosticsOptions, - diagnosticsLogger - ) + GetDiagnosticsLoggerFilteringByScopedPragmas(false, input.ScopedPragmas, tcConfig.diagnosticsOptions, diagnosticsLogger) use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.TypeCheck) diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 54d47b7c4fb..2794edf560e 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -2,7 +2,6 @@ %{ -#nowarn "64" // turn off warnings that type variables used in production annotations are instantiated to concrete type #nowarn "1182" // generated code has lots of unused "parseState" #nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` diff --git a/src/Compiler/pppars.fsy b/src/Compiler/pppars.fsy index 41cb41ff38a..cd27722a254 100644 --- a/src/Compiler/pppars.fsy +++ b/src/Compiler/pppars.fsy @@ -3,7 +3,6 @@ %{ open FSharp.Compiler.DiagnosticsLogger -#nowarn "64" // turn off warnings that type variables used in production annotations are instantiated to concrete type #nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` let dummy = IfdefId("DUMMY") diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf index 39b41f3b382..2b1a9483def 100644 --- a/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -307,11 +307,6 @@ Vyvolá upozornění, pokud je atribut TailCall použit u nerekurzivních funkcí. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Průnik omezení u flexibilních typů diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index 402571c8a5a..a1b2532e4db 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -307,11 +307,6 @@ Löst Warnungen aus, wenn das Attribut "TailCall" für nicht rekursive Funktionen verwendet wird. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Einschränkungsüberschneidung für flexible Typen diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index d3267a7425c..dd9cbb7fec6 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -307,11 +307,6 @@ Genera advertencias si el atributo 'TailCall' se usa en funciones no recursivas. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Intersección de restricciones en tipos flexibles diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index f74bc4e3196..2cc92e5f4d5 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -307,11 +307,6 @@ Émet des avertissements si l’attribut « TailCall » est utilisé sur des fonctions non récursives. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Intersection de contraintes sur les types flexibles diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index 3495d0c1659..5b5793c4841 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -307,11 +307,6 @@ Genera avvisi se l'attributo 'TailCall' viene utilizzato in funzioni non ricorsive. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Intersezione di vincoli su tipi flessibili diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index a87915633be..d30efc74724 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -307,11 +307,6 @@ 'TailCall' 属性が再帰関数以外で使用されている場合、警告が発せられます。 - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types フレキシブル型の制約積集合 diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index 70a64e75a53..c9359c56807 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -307,11 +307,6 @@ 'TailCall' 특성이 비 재귀 함수에 사용되는 경우 경고를 발생합니다. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types 유연한 형식의 제약 조건 교집합 diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index 31b8d2a6215..933379b9f7b 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -307,11 +307,6 @@ Zgłasza ostrzeżenia, jeśli atrybut „TailCall” jest używany w funkcjach niekursywnych. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Przecięcie ograniczenia dla typów elastycznych diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index c49d815ca06..e6480e13025 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -307,11 +307,6 @@ Gera avisos se o atributo "TailCall" for usado em funções não recursivas. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Interseção de restrição em tipos flexíveis diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 495089d8c53..61c03885917 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -307,11 +307,6 @@ Выдает предупреждения, если атрибут TailCall используется в нерекурсивных функциях. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Пересечение ограничений на гибких типах diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index 93dfdedb2bd..09c113ee3f1 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -307,11 +307,6 @@ 'TailCall' özniteliği özyinelemeli olmayan işlevlerde kullanılıyorsa uyarılar oluşturur. - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types Esnek türlerde kısıtlama kesişimi diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index 54f6b088094..d9573b5bed2 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -307,11 +307,6 @@ 如果在非递归函数上使用“TailCall”属性,则引发警告。 - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types 灵活类型的约束交集 diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index df3a706ae28..1a6c3de6ccf 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -307,11 +307,6 @@ 如果 'TailCall' 屬性用於非遞迴函數,則引發警告。 - - The interaction between #nowarn and #line is now consistent. - The interaction between #nowarn and #line is now consistent. - - Constraint intersection on flexible types 彈性類型上的條件約束交集 diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerDirectives/Nowarn.fs b/tests/FSharp.Compiler.ComponentTests/CompilerDirectives/Nowarn.fs deleted file mode 100644 index 78067aa8c32..00000000000 --- a/tests/FSharp.Compiler.ComponentTests/CompilerDirectives/Nowarn.fs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -namespace CompilerDirectives - -open Xunit -open FSharp.Test.Compiler - -module Nowarn = - - let warn20Text = "The result of this expression has type 'string' and is implicitly ignored. Consider using 'ignore' to discard this value explicitly, e.g. 'expr |> ignore', or 'let' to bind the result to a name, e.g. 'let result = expr'." - - let checkFileBugSource = """ -module A -#nowarn "20" -#line 1 "xyz.fs" -"" - """ - - let checkFileBugSource2 = """ -module A -#line 1 "xyz.fs" -#nowarn "20" -"" - """ - - - [] - let ``checkFile bug simulation for compatibility`` () = - - FSharp checkFileBugSource - |> withLangVersion80 - |> compile - |> shouldSucceed - - [] - let ``checkFile bug fixed leads to new warning`` () = - - FSharp checkFileBugSource - |> withLangVersion90 - |> compile - |> shouldFail - |> withDiagnostics [ - (Warning 20, Line 1, Col 1, Line 1, Col 3, warn20Text) - ] - - [] - let ``checkFile bug fixed, no warning if nowarn is correctly used`` () = - - FSharp checkFileBugSource2 - |> withLangVersion90 - |> compile - |> shouldSucceed diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index f7e63b79621..5f352a315ee 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -33,7 +33,6 @@ - From 7edac8827c15a350a67c2e86c5f560fe499c7ef9 Mon Sep 17 00:00:00 2001 From: "Matt Mitchell (.NET)" Date: Mon, 16 Sep 2024 13:51:21 -0700 Subject: [PATCH 04/37] ExcludeFromSourceBuild->ExcludeFromSourceOnlyBuild --- setup/Directory.Build.props | 2 +- src/fsc/fscAnyCpuProject/fscAnyCpu.fsproj | 2 +- src/fsc/fscArm64Project/fscArm64.fsproj | 2 +- src/fsi/fsiAnyCpuProject/fsiAnyCpu.fsproj | 2 +- src/fsi/fsiArm64Project/fsiArm64.fsproj | 2 +- tests/Directory.Build.props | 2 +- .../FSharp.Compiler.ComponentTests.fsproj | 2 +- .../FSharp.Compiler.Private.Scripting.UnitTests.fsproj | 2 +- vsintegration/Directory.Build.props | 2 +- vsintegration/tests/MockTypeProviders/Directory.Build.props | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/setup/Directory.Build.props b/setup/Directory.Build.props index cca2c04ebcf..47bbe960ea3 100644 --- a/setup/Directory.Build.props +++ b/setup/Directory.Build.props @@ -12,7 +12,7 @@ $(ArtifactsDir)\VSSetup.obj\$(Configuration)\$(MSBuildProjectName) $(SetupRootFolder)..\artifacts\VSSetup\$(Configuration) $(SetupRootFolder)..\artifacts\VSSetup\$(Configuration)\Insertion - true + true Neutral diff --git a/src/fsc/fscAnyCpuProject/fscAnyCpu.fsproj b/src/fsc/fscAnyCpuProject/fscAnyCpu.fsproj index 3fac5305cae..a813df67d88 100644 --- a/src/fsc/fscAnyCpuProject/fscAnyCpu.fsproj +++ b/src/fsc/fscAnyCpuProject/fscAnyCpu.fsproj @@ -5,7 +5,7 @@ net472 anycpu - true + true diff --git a/src/fsc/fscArm64Project/fscArm64.fsproj b/src/fsc/fscArm64Project/fscArm64.fsproj index c7c42ca1adf..bcc20db5d6a 100644 --- a/src/fsc/fscArm64Project/fscArm64.fsproj +++ b/src/fsc/fscArm64Project/fscArm64.fsproj @@ -5,7 +5,7 @@ net472 arm64 - true + true diff --git a/src/fsi/fsiAnyCpuProject/fsiAnyCpu.fsproj b/src/fsi/fsiAnyCpuProject/fsiAnyCpu.fsproj index f11e2783e44..ae7238e556a 100644 --- a/src/fsi/fsiAnyCpuProject/fsiAnyCpu.fsproj +++ b/src/fsi/fsiAnyCpuProject/fsiAnyCpu.fsproj @@ -5,7 +5,7 @@ net472 anycpu - true + true $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER diff --git a/src/fsi/fsiArm64Project/fsiArm64.fsproj b/src/fsi/fsiArm64Project/fsiArm64.fsproj index 07e19f49d5e..acb66346e8a 100644 --- a/src/fsi/fsiArm64Project/fsiArm64.fsproj +++ b/src/fsi/fsiArm64Project/fsiArm64.fsproj @@ -5,7 +5,7 @@ net472 arm64 - true + true $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 06697bc35ed..80708062652 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -3,7 +3,7 @@ - true + true portable diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 5f352a315ee..03ff28e096a 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -10,7 +10,7 @@ true xunit true - true + true false false $(OtherFlags) --warnon:1182 diff --git a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharp.Compiler.Private.Scripting.UnitTests.fsproj b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharp.Compiler.Private.Scripting.UnitTests.fsproj index 8f69b337c5a..3bf2d528a4f 100644 --- a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharp.Compiler.Private.Scripting.UnitTests.fsproj +++ b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharp.Compiler.Private.Scripting.UnitTests.fsproj @@ -7,7 +7,7 @@ Library true xunit - true + true $(NoWarn);44 diff --git a/vsintegration/Directory.Build.props b/vsintegration/Directory.Build.props index 3506c3888d2..5a203ce69e2 100644 --- a/vsintegration/Directory.Build.props +++ b/vsintegration/Directory.Build.props @@ -4,7 +4,7 @@ net472 v4.7.2 true - true + true Neutral true diff --git a/vsintegration/tests/MockTypeProviders/Directory.Build.props b/vsintegration/tests/MockTypeProviders/Directory.Build.props index e97fa719a30..3a1978537b7 100644 --- a/vsintegration/tests/MockTypeProviders/Directory.Build.props +++ b/vsintegration/tests/MockTypeProviders/Directory.Build.props @@ -5,7 +5,7 @@ false - true + true From f564cc9563a412ac7bdfa0f011da17d2dfeef022 Mon Sep 17 00:00:00 2001 From: Alex Berezhnykh Date: Wed, 18 Sep 2024 13:30:30 +0300 Subject: [PATCH 05/37] Make ILTypeDef interface calculation lazy (#17392) * wip * wip * wip * wip * formatting * release notes --------- Co-authored-by: Petr Co-authored-by: Vlad Zarytovskii Co-authored-by: Tomas Grosup --- .../.FSharp.Compiler.Service/9.0.100.md | 2 +- src/Compiler/AbstractIL/il.fs | 40 ++++++++----- src/Compiler/AbstractIL/il.fsi | 27 +++++---- src/Compiler/AbstractIL/ilmorph.fs | 7 ++- src/Compiler/AbstractIL/ilprint.fs | 5 +- src/Compiler/AbstractIL/ilread.fs | 37 ++++++------ src/Compiler/AbstractIL/ilreflect.fs | 6 +- src/Compiler/AbstractIL/ilwrite.fs | 11 ++-- src/Compiler/Checking/TypeHierarchy.fs | 13 ++--- src/Compiler/CodeGen/EraseClosures.fs | 6 +- src/Compiler/CodeGen/EraseUnions.fs | 3 +- src/Compiler/CodeGen/IlxGen.fs | 57 +++++++++---------- src/Compiler/CodeGen/IlxGenSupport.fs | 8 +-- ...ervice.SurfaceArea.netstandard20.debug.bsl | 27 +++++++-- ...vice.SurfaceArea.netstandard20.release.bsl | 27 +++++++-- .../ModuleReaderCancellationTests.fs | 2 +- 16 files changed, 164 insertions(+), 114 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md index 91b91f3c3eb..4fdf50a224a 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md @@ -52,7 +52,7 @@ * Better CE error reporting when using `use!` with `and!` ([PR #17671](https://github.com/dotnet/fsharp/pull/17671)) * Better error reporting for let bindings. ([PR #17601](https://github.com/dotnet/fsharp/pull/17601)) * Optimize ILTypeDef interface impls reading from metadata. ([PR #17382](https://github.com/dotnet/fsharp/pull/17382)) +* Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) * Better error reporting for active patterns. ([PR #17666](https://github.com/dotnet/fsharp/pull/17666)) - ### Breaking Changes diff --git a/src/Compiler/AbstractIL/il.fs b/src/Compiler/AbstractIL/il.fs index 9ed1822676b..b10a119fced 100644 --- a/src/Compiler/AbstractIL/il.fs +++ b/src/Compiler/AbstractIL/il.fs @@ -1909,6 +1909,23 @@ let inline conditionalAdd condition flagToAdd source = let NoMetadataIdx = -1 +type InterfaceImpl = + { Idx: int; Type: ILType; mutable CustomAttrsStored: ILAttributesStored } + + member x.CustomAttrs = + match x.CustomAttrsStored with + | ILAttributesStored.Reader f -> + let res = ILAttributes(f x.Idx) + x.CustomAttrsStored <- ILAttributesStored.Given res + res + | ILAttributesStored.Given attrs -> attrs + + static member Create(ilType: ILType, customAttrsStored: ILAttributesStored) = + { Idx = NoMetadataIdx; Type = ilType; CustomAttrsStored = customAttrsStored } + + static member Create(ilType: ILType) = InterfaceImpl.Create(ilType, emptyILCustomAttrsStored) + + [] type ILMethodDef ( @@ -2635,8 +2652,7 @@ type ILTypeDef name: string, attributes: TypeAttributes, layout: ILTypeDefLayout, - implements: ILTypes, - implementsCustomAttrs: (ILAttributesStored * int) list option, + implements: InterruptibleLazy, genericParams: ILGenericParameterDefs, extends: ILType option, methods: ILMethodDefs, @@ -2659,7 +2675,6 @@ type ILTypeDef attributes, layout, implements, - implementsCustomAttrs, genericParams, extends, methods, @@ -2676,7 +2691,6 @@ type ILTypeDef attributes, layout, implements, - implementsCustomAttrs, genericParams, extends, methods, @@ -2703,8 +2717,6 @@ type ILTypeDef member _.Implements = implements - member _.ImplementsCustomAttrs = implementsCustomAttrs - member _.Extends = extends member _.Methods = methods @@ -2744,8 +2756,7 @@ type ILTypeDef ?properties, ?newAdditionalFlags, ?customAttrs, - ?securityDecls, - ?implementsCustomAttrs + ?securityDecls ) = ILTypeDef( name = defaultArg name x.Name, @@ -2754,7 +2765,6 @@ type ILTypeDef genericParams = defaultArg genericParams x.GenericParams, nestedTypes = defaultArg nestedTypes x.NestedTypes, implements = defaultArg implements x.Implements, - implementsCustomAttrs = defaultArg implementsCustomAttrs x.ImplementsCustomAttrs, extends = defaultArg extends x.Extends, methods = defaultArg methods x.Methods, securityDecls = defaultArg securityDecls x.SecurityDecls, @@ -3333,6 +3343,8 @@ let mkILTypeDefs l = mkILTypeDefsFromArray (Array.ofList l) let mkILTypeDefsComputed f = ILTypeDefs f let emptyILTypeDefs = mkILTypeDefsFromArray [||] +let emptyILInterfaceImpls = InterruptibleLazy.FromValue([]) + // -------------------------------------------------------------------- // Operations on method tables. // -------------------------------------------------------------------- @@ -4240,7 +4252,7 @@ let mkILSimpleStorageCtor (baseTySpec, ty, extraParams, flds, access, tag, impor let mkILStorageCtor (preblock, ty, flds, access, tag, imports) = mkILStorageCtorWithParamNames (preblock, ty, [], addParamNames flds, access, tag, imports) -let mkILGenericClass (nm, access, genparams, extends, impl, methods, fields, nestedTypes, props, events, attrs, init) = +let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, nestedTypes, props, events, attrs, init) = let attributes = convertTypeAccessFlags access ||| TypeAttributes.AutoLayout @@ -4254,8 +4266,7 @@ let mkILGenericClass (nm, access, genparams, extends, impl, methods, fields, nes name = nm, attributes = attributes, genericParams = genparams, - implements = impl, - implementsCustomAttrs = None, + implements = InterruptibleLazy.FromValue(impls), layout = ILTypeDefLayout.Auto, extends = Some extends, methods = methods, @@ -4279,8 +4290,7 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) = ||| TypeAttributes.ExplicitLayout ||| TypeAttributes.BeforeFieldInit ||| TypeAttributes.AnsiClass), - implements = [], - implementsCustomAttrs = None, + implements = emptyILInterfaceImpls, extends = Some iltyp_ValueType, layout = ILTypeDefLayout.Explicit { Size = Some size; Pack = Some pack }, methods = emptyILMethods, @@ -5586,7 +5596,7 @@ and refsOfILMethodImpl s m = and refsOfILTypeDef s (td: ILTypeDef) = refsOfILTypeDefs s td.NestedTypes refsOfILGenericParams s td.GenericParams - refsOfILTypes s td.Implements + refsOfILTypes s (td.Implements.Value |> List.map _.Type) Option.iter (refsOfILType s) td.Extends refsOfILMethodDefs s td.Methods refsOfILFieldDefs s (td.Fields.AsList()) diff --git a/src/Compiler/AbstractIL/il.fsi b/src/Compiler/AbstractIL/il.fsi index e3ec95a40d7..1487830e8f0 100644 --- a/src/Compiler/AbstractIL/il.fsi +++ b/src/Compiler/AbstractIL/il.fsi @@ -327,6 +327,15 @@ type ILCallingSignature = ArgTypes: ILTypes ReturnType: ILType } +type InterfaceImpl = + { Idx: int + Type: ILType + mutable CustomAttrsStored: ILAttributesStored } + + member CustomAttrs: ILAttributes + static member Create: ilType: ILType * customAttrsStored: ILAttributesStored -> InterfaceImpl + static member Create: ilType: ILType -> InterfaceImpl + /// Actual generic parameters are always types. type ILGenericArgs = ILType list @@ -1518,8 +1527,7 @@ type ILTypeDef = name: string * attributes: TypeAttributes * layout: ILTypeDefLayout * - implements: ILTypes * - implementsCustomAttrs: (ILAttributesStored * int) list option * + implements: InterruptibleLazy * genericParams: ILGenericParameterDefs * extends: ILType option * methods: ILMethodDefs * @@ -1539,8 +1547,7 @@ type ILTypeDef = name: string * attributes: TypeAttributes * layout: ILTypeDefLayout * - implements: ILTypes * - implementsCustomAttrs: (ILAttributesStored * int) list option * + implements: InterruptibleLazy * genericParams: ILGenericParameterDefs * extends: ILType option * methods: ILMethodDefs * @@ -1559,8 +1566,7 @@ type ILTypeDef = member GenericParams: ILGenericParameterDefs member Layout: ILTypeDefLayout member NestedTypes: ILTypeDefs - member Implements: ILTypes - member ImplementsCustomAttrs: (ILAttributesStored * int) list option + member Implements: InterruptibleLazy member Extends: ILType option member Methods: ILMethodDefs member SecurityDecls: ILSecurityDecls @@ -1609,7 +1615,7 @@ type ILTypeDef = ?name: string * ?attributes: TypeAttributes * ?layout: ILTypeDefLayout * - ?implements: ILTypes * + ?implements: InterruptibleLazy * ?genericParams: ILGenericParameterDefs * ?extends: ILType option * ?methods: ILMethodDefs * @@ -1620,8 +1626,7 @@ type ILTypeDef = ?properties: ILPropertyDefs * ?newAdditionalFlags: ILTypeDefAdditionalFlags * ?customAttrs: ILAttributesStored * - ?securityDecls: ILSecurityDecls * - ?implementsCustomAttrs: (ILAttributesStored * int) list option -> + ?securityDecls: ILSecurityDecls -> ILTypeDef /// Represents a prefix of information for ILTypeDef. @@ -2161,7 +2166,7 @@ val internal mkILGenericClass: ILTypeDefAccess * ILGenericParameterDefs * ILType * - ILType list * + InterfaceImpl list * ILMethodDefs * ILFieldDefs * ILTypeDefs * @@ -2245,6 +2250,8 @@ val internal mkCtorMethSpecForDelegate: ILGlobals -> ILType * bool -> ILMethodSp /// The toplevel "class" for a module or assembly. val internal mkILTypeForGlobalFunctions: ILScopeRef -> ILType +val emptyILInterfaceImpls: InterruptibleLazy + /// Making tables of custom attributes, etc. val mkILCustomAttrs: ILAttribute list -> ILAttributes val mkILCustomAttrsFromArray: ILAttribute[] -> ILAttributes diff --git a/src/Compiler/AbstractIL/ilmorph.fs b/src/Compiler/AbstractIL/ilmorph.fs index 334ed93d212..9f2f3d0582f 100644 --- a/src/Compiler/AbstractIL/ilmorph.fs +++ b/src/Compiler/AbstractIL/ilmorph.fs @@ -368,8 +368,13 @@ let rec tdef_ty2ty_ilmbody2ilmbody_mdefs2mdefs isInKnownSet enc fs (tdef: ILType let mdefsR = fMethodDefs (enc, tdef) tdef.Methods let fdefsR = fdefs_ty2ty fTyInCtxtR tdef.Fields + let implements = + tdef.Implements.Value + |> List.map (fun x -> { x with Type = fTyInCtxtR x.Type }) + |> InterruptibleLazy.FromValue + tdef.With( - implements = List.map fTyInCtxtR tdef.Implements, + implements = implements, genericParams = gparams_ty2ty fTyInCtxtR tdef.GenericParams, extends = Option.map fTyInCtxtR tdef.Extends, methods = mdefsR, diff --git a/src/Compiler/AbstractIL/ilprint.fs b/src/Compiler/AbstractIL/ilprint.fs index 9d278dbe317..6ed8aec9286 100644 --- a/src/Compiler/AbstractIL/ilprint.fs +++ b/src/Compiler/AbstractIL/ilprint.fs @@ -752,8 +752,9 @@ let goutput_superclass env os = output_string os "extends " (goutput_typ_with_shortened_class_syntax env) os typ -let goutput_implements env os (imp: ILTypes) = +let goutput_implements env os (imp: InterfaceImpl list) = if not (List.isEmpty imp) then + let imp = imp |> Seq.map _.Type output_string os "implements " output_seq ", " (goutput_typ_with_shortened_class_syntax env) os imp @@ -836,7 +837,7 @@ let rec goutput_tdef enc env contents os (cd: ILTypeDef) = output_string os "\n\t" goutput_superclass env os cd.Extends output_string os "\n\t" - goutput_implements env os cd.Implements + goutput_implements env os cd.Implements.Value output_string os "\n{\n " if contents then diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 02696c53f0e..7ffa71feeee 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -2192,8 +2192,7 @@ and typeDefReader ctxtH : ILTypeDefStored = let fdefs = seekReadFields ctxt (numTypars, hasLayout) fieldsIdx endFieldsIdx let nested = seekReadNestedTypeDefs ctxt idx - let impls, intImplsAttrs = - seekReadInterfaceImpls ctxt mdv numTypars idx |> List.unzip + let impls = seekReadInterfaceImpls ctxt mdv numTypars idx let mimpls = seekReadMethodImpls ctxt numTypars idx let props = seekReadProperties ctxt numTypars idx @@ -2206,7 +2205,6 @@ and typeDefReader ctxtH : ILTypeDefStored = layout = layout, nestedTypes = nested, implements = impls, - implementsCustomAttrs = Some intImplsAttrs, extends = super, methods = mdefs, securityDeclsStored = ctxt.securityDeclsReader_TypeDef, @@ -2240,19 +2238,26 @@ and seekReadNestedTypeDefs (ctxt: ILMetadataReader) tidx = |]) and seekReadInterfaceImpls (ctxt: ILMetadataReader) mdv numTypars tidx = - seekReadIndexedRows ( - ctxt.getNumRows TableNames.InterfaceImpl, - id, - id, - (fun idx -> - let mutable addr = ctxt.rowAddr TableNames.InterfaceImpl idx - let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr - simpleIndexCompare tidx _tidx), - isSorted ctxt TableNames.InterfaceImpl, - (fun idx -> - let intfIdx = seekReadInterfaceIdx ctxt mdv idx - seekReadTypeDefOrRef ctxt numTypars AsObject [] intfIdx, (ctxt.customAttrsReader_InterfaceImpl, idx)) - ) + InterruptibleLazy(fun () -> + seekReadIndexedRows ( + ctxt.getNumRows TableNames.InterfaceImpl, + id, + id, + (fun idx -> + let mutable addr = ctxt.rowAddr TableNames.InterfaceImpl idx + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv &addr + simpleIndexCompare tidx _tidx), + isSorted ctxt TableNames.InterfaceImpl, + (fun idx -> + let intfIdx = seekReadInterfaceIdx ctxt mdv idx + let ilType = seekReadTypeDefOrRef ctxt numTypars AsObject [] intfIdx + + { + Idx = idx + Type = ilType + CustomAttrsStored = ctxt.customAttrsReader_InterfaceImpl + }) + )) and seekReadGenericParams ctxt numTypars (a, b) : ILGenericParameterDefs = ctxt.seekReadGenericParams (GenericParamsIdx(numTypars, a, b)) diff --git a/src/Compiler/AbstractIL/ilreflect.fs b/src/Compiler/AbstractIL/ilreflect.fs index 9b0b7eddb9e..2a65eb8679b 100644 --- a/src/Compiler/AbstractIL/ilreflect.fs +++ b/src/Compiler/AbstractIL/ilreflect.fs @@ -2178,7 +2178,8 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef: ILTypeDef) = let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType typB) // add interface impls - tdef.Implements + tdef.Implements.Value + |> List.map _.Type |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog implT) // add methods, properties @@ -2339,7 +2340,8 @@ let createTypeRef (visited: Dictionary<_, _>, created: Dictionary<_, _>) emEnv t if verbose2 then dprintf "buildTypeDefPass4: Creating Interface Chain of %s\n" tdef.Name - tdef.Implements |> List.iter (traverseType CollectTypes.All) + tdef.Implements.Value + |> List.iter (fun x -> traverseType CollectTypes.All x.Type) if verbose2 then dprintf "buildTypeDefPass4: Do value types in fields of %s\n" tdef.Name diff --git a/src/Compiler/AbstractIL/ilwrite.fs b/src/Compiler/AbstractIL/ilwrite.fs index 832aa1c2810..3cbdd3c752b 100644 --- a/src/Compiler/AbstractIL/ilwrite.fs +++ b/src/Compiler/AbstractIL/ilwrite.fs @@ -1323,7 +1323,7 @@ and GenTypeDefPass2 pidx enc cenv (tdef: ILTypeDef) = // Now generate or assign index numbers for tables referenced by the maps. // Don't yet generate contents of these tables - leave that to pass3, as // code may need to embed these entries. - cenv.implementsIdxs[tidx] <- tdef.Implements |> List.map (GenImplementsPass2 cenv env tidx) + cenv.implementsIdxs[tidx] <- tdef.Implements.Value |> List.map (fun x -> GenImplementsPass2 cenv env tidx x.Type) tdef.Fields.AsList() |> List.iter (GenFieldDefPass2 tdef cenv tidx) tdef.Methods |> Seq.iter (GenMethodDefPass2 tdef cenv tidx) @@ -2875,12 +2875,9 @@ let rec GenTypeDefPass3 enc cenv (tdef: ILTypeDef) = let env = envForTypeDef tdef let tidx = GetIdxForTypeDef cenv (TdKey(enc, tdef.Name)) - match tdef.ImplementsCustomAttrs with - | None -> () - | Some attrList -> - attrList - |> List.zip cenv.implementsIdxs[tidx] - |> List.iter (fun (impIdx,(attrs,metadataIdx)) -> GenCustomAttrsPass3Or4 cenv (hca_InterfaceImpl,impIdx) (attrs.GetCustomAttrs metadataIdx)) + tdef.Implements.Value + |> List.zip cenv.implementsIdxs[tidx] + |> List.iter (fun (impIdx, impl) -> GenCustomAttrsPass3Or4 cenv (hca_InterfaceImpl,impIdx) impl.CustomAttrs) tdef.Properties.AsList() |> List.iter (GenPropertyPass3 cenv env) tdef.Events.AsList() |> List.iter (GenEventPass3 cenv env) diff --git a/src/Compiler/Checking/TypeHierarchy.fs b/src/Compiler/Checking/TypeHierarchy.fs index 102f36908fe..0805fcaf09b 100644 --- a/src/Compiler/Checking/TypeHierarchy.fs +++ b/src/Compiler/Checking/TypeHierarchy.fs @@ -117,17 +117,16 @@ let GetImmediateInterfacesOfMetadataType g amap m skipUnref ty (tcref: TyconRef) // succeeded with more reported. There are pathological corner cases where this // doesn't apply: e.g. for mscorlib interfaces like IComparable, but we can always // assume those are present. - match tdef.ImplementsCustomAttrs with - | Some attrsList when g.langFeatureNullness && g.checkNullness -> - for (attrs,attrsIdx),intfTy in tdef.Implements |> List.zip attrsList do - if skipUnref = SkipUnrefInterfaces.No || CanRescopeAndImportILType scoref amap m intfTy then + let checkNullness = g.langFeatureNullness && g.checkNullness + for {Idx = attrsIdx; Type = intfTy; CustomAttrsStored = attrs} in tdef.Implements.Value do + if skipUnref = SkipUnrefInterfaces.No || CanRescopeAndImportILType scoref amap m intfTy then + if checkNullness then let typeAttrs = AttributesFromIL(attrsIdx,attrs) let nullness = {DirectAttributes = typeAttrs; Fallback = FromClass typeAttrs} RescopeAndImportILType scoref amap m tinst nullness intfTy - | _ -> - for intfTy in tdef.Implements do - if skipUnref = SkipUnrefInterfaces.No || CanRescopeAndImportILType scoref amap m intfTy then + else RescopeAndImportILTypeSkipNullness scoref amap m tinst intfTy + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> for intfTy in tcref.ImmediateInterfaceTypesOfFSharpTycon do instType (mkInstForAppTy g ty) intfTy ] diff --git a/src/Compiler/CodeGen/EraseClosures.fs b/src/Compiler/CodeGen/EraseClosures.fs index ed32d83b369..df2604717ed 100644 --- a/src/Compiler/CodeGen/EraseClosures.fs +++ b/src/Compiler/CodeGen/EraseClosures.fs @@ -572,8 +572,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = name = td.Name, genericParams = td.GenericParams, attributes = td.Attributes, - implements = [], - implementsCustomAttrs = None, + implements = emptyILInterfaceImpls, nestedTypes = emptyILTypeDefs, layout = ILTypeDefLayout.Auto, extends = Some cenv.mkILTyFuncTy, @@ -707,8 +706,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = name = td.Name, genericParams = td.GenericParams, attributes = td.Attributes, - implements = [], - implementsCustomAttrs = None, + implements = emptyILInterfaceImpls, layout = ILTypeDefLayout.Auto, nestedTypes = emptyILTypeDefs, extends = Some nowEnvParentClass, diff --git a/src/Compiler/CodeGen/EraseUnions.fs b/src/Compiler/CodeGen/EraseUnions.fs index 88336c057b2..79788107475 100644 --- a/src/Compiler/CodeGen/EraseUnions.fs +++ b/src/Compiler/CodeGen/EraseUnions.fs @@ -1571,8 +1571,7 @@ let mkClassUnionDef genericParams = td.GenericParams, attributes = enum 0, layout = ILTypeDefLayout.Auto, - implements = [], - implementsCustomAttrs = None, + implements = emptyILInterfaceImpls, extends = Some g.ilg.typ_Object, methods = emptyILMethods, securityDecls = emptyILSecurityDecls, diff --git a/src/Compiler/CodeGen/IlxGen.fs b/src/Compiler/CodeGen/IlxGen.fs index 6758b6dcd94..82572ea888a 100644 --- a/src/Compiler/CodeGen/IlxGen.fs +++ b/src/Compiler/CodeGen/IlxGen.fs @@ -2227,7 +2227,8 @@ type AnonTypeGenerationTable() = let ilInterfaceTys = [ - for intfTy, _, _ in tcaug.tcaug_interfaces -> GenType cenv m (TypeReprEnv.Empty.ForTypars tps) intfTy + for intfTy, _, _ in tcaug.tcaug_interfaces -> + GenType cenv m (TypeReprEnv.Empty.ForTypars tps) intfTy |> InterfaceImpl.Create ] let ilTypeDef = @@ -6023,7 +6024,8 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel let interfaceTys = GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g cenv.amap m templateStructTy - let ilInterfaceTys = List.map (GenType cenv m eenvinner.tyenv) interfaceTys + let ilInterfaceTys = + List.map (GenType cenv m eenvinner.tyenv >> InterfaceImpl.Create) interfaceTys let super = g.iltyp_ValueType @@ -6254,8 +6256,7 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel methods = mkILMethods mdefs, methodImpls = mkILMethodImpls mimpls, nestedTypes = emptyILTypeDefs, - implements = ilInterfaceTys, - implementsCustomAttrs = None, + implements = InterruptibleLazy.FromValue(ilInterfaceTys), extends = Some super, additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls @@ -6381,7 +6382,8 @@ and GenObjectExpr cenv cgbuf eenvouter objExpr (baseType, baseValOpt, basecall, let mimpls = mimpls |> List.choose id // choose the ones that actually have method impls let interfaceTys = - interfaceImpls |> List.map (fst >> GenType cenv m eenvinner.tyenv) + interfaceImpls + |> List.map (fst >> GenType cenv m eenvinner.tyenv >> InterfaceImpl.Create) let super = (if isInterfaceTy g baseType then @@ -6390,7 +6392,11 @@ and GenObjectExpr cenv cgbuf eenvouter objExpr (baseType, baseValOpt, basecall, ilCloRetTy) let interfaceTys = - interfaceTys @ (if isInterfaceTy g baseType then [ ilCloRetTy ] else []) + interfaceTys + @ (if isInterfaceTy g baseType then + [ InterfaceImpl.Create(ilCloRetTy) ] + else + []) let cloTypeDefs = GenClosureTypeDefs @@ -6688,8 +6694,7 @@ and GenClosureTypeDefs methods = mkILMethods mdefs, methodImpls = mkILMethodImpls mimpls, nestedTypes = emptyILTypeDefs, - implements = ilIntfTys, - implementsCustomAttrs = None, + implements = InterruptibleLazy.FromValue(ilIntfTys), extends = Some ext, additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls @@ -10770,23 +10775,20 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) : ILTypeRef option let ilThisTy = GenType cenv m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange + let checkNullness = g.langFeatureNullness && g.checkNullness let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon - |> List.map (GenType cenv m eenvinner.tyenv) - - let ilIntCustomAttrs = - if g.langFeatureNullness && g.checkNullness && not (isNil ilIntfTys) then - tycon.ImmediateInterfaceTypesOfFSharpTycon - |> List.map ( - GenAdditionalAttributesForTy g - >> mkILCustomAttrs - >> ILAttributesStored.Given - >> (fun x -> x, 0) - ) - |> Some - else - None + |> List.map (fun x -> + let ilType = GenType cenv m eenvinner.tyenv x + + let customAttrs = + if checkNullness then + GenAdditionalAttributesForTy g x |> mkILCustomAttrs |> ILAttributesStored.Given + else + emptyILCustomAttrsStored + + InterfaceImpl.Create(ilType, customAttrs)) let ilTypeName = tref.Name @@ -11447,11 +11449,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) : ILTypeRef option .WithSerializable(isSerializable) .WithAbstract(isAbstract) .WithImport(isComInteropTy g thisTy) - .With( - methodImpls = mkILMethodImpls methodImpls, - newAdditionalFlags = additionalFlags, - implementsCustomAttrs = ilIntCustomAttrs - ) + .With(methodImpls = mkILMethodImpls methodImpls, newAdditionalFlags = additionalFlags) let tdLayout, tdEncoding = match TryFindFSharpAttribute g g.attrib_StructLayoutAttribute tycon.Attribs with @@ -11613,8 +11611,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) : ILTypeRef option methods = mkILMethods ilMethods, methodImpls = mkILMethodImpls methodImpls, nestedTypes = emptyILTypeDefs, - implements = ilIntfTys, - implementsCustomAttrs = None, + implements = InterruptibleLazy.FromValue(ilIntfTys), extends = Some( if tycon.IsStructOrEnumTycon then @@ -11837,7 +11834,7 @@ and GenExnDef cenv mgbuf eenv m (exnc: Tycon) : ILTypeRef option = let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon - |> List.map (GenType cenv m eenv.tyenv) + |> List.map (GenType cenv m eenv.tyenv >> InterfaceImpl.Create) let tdef = mkILGenericClass ( diff --git a/src/Compiler/CodeGen/IlxGenSupport.fs b/src/Compiler/CodeGen/IlxGenSupport.fs index 073b4473ea9..0e163db4069 100644 --- a/src/Compiler/CodeGen/IlxGenSupport.fs +++ b/src/Compiler/CodeGen/IlxGenSupport.fs @@ -46,7 +46,7 @@ let mkLocalPrivateAttributeWithDefaultConstructor (g: TcGlobals, name: string) = ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Attribute, - ILTypes.Empty, + [], ilMethods, emptyILFields, emptyILTypeDefs, @@ -140,7 +140,7 @@ let mkLocalPrivateAttributeWithPropertyConstructors ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Attribute, - ILTypes.Empty, + [], mkILMethods ( ilCtorDef :: (ilElements |> List.fold (fun acc (_, getter, _, _) -> getter @ acc) []) @@ -205,7 +205,7 @@ let mkLocalPrivateAttributeWithByteAndByteArrayConstructors (g: TcGlobals, name: ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Attribute, - ILTypes.Empty, + [], mkILMethods ([ ilScalarCtorDef; ilArrayCtorDef ]), mkILFields [ fieldDef ], emptyILTypeDefs, @@ -233,7 +233,7 @@ let mkLocalPrivateInt32Enum (g: TcGlobals, tref: ILTypeRef, values: (string * in ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Enum, - ILTypes.Empty, + [], mkILMethods [], mkILFields enumFields, emptyILTypeDefs, diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index 3ae2414fc07..543c92ef5cc 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -1565,7 +1565,7 @@ FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILPropertyDefs Properties FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILPropertyDefs get_Properties() FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILSecurityDecls SecurityDecls FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILSecurityDecls get_SecurityDecls() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDef With(Microsoft.FSharp.Core.FSharpOption`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Reflection.TypeAttributes], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefLayout], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILFieldDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodImplDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILEventDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILPropertyDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefAdditionalFlags], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILAttributesStored], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILSecurityDecls], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]]]) +FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDef With(Microsoft.FSharp.Core.FSharpOption`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Reflection.TypeAttributes], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefLayout], Microsoft.FSharp.Core.FSharpOption`1[Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILFieldDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodImplDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILEventDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILPropertyDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefAdditionalFlags], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILAttributesStored], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILSecurityDecls]) FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefAccess Access FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefAccess get_Access() FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefLayout Layout @@ -1574,20 +1574,18 @@ FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefs NestedTypes FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefs get_NestedTypes() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Int32 MetadataIndex FSharp.Compiler.AbstractIL.IL+ILTypeDef: Int32 get_MetadataIndex() +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] Implements +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] get_Implements() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef] GenericParams FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef] get_GenericParams() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType] Implements -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType] get_Implements() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType] Extends FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType] get_Extends() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]] ImplementsCustomAttrs -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]] get_ImplementsCustomAttrs() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.Reflection.TypeAttributes Attributes FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.Reflection.TypeAttributes get_Attributes() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String Name FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String ToString() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String get_Name() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Void .ctor(System.String, System.Reflection.TypeAttributes, ILTypeDefLayout, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType], ILMethodDefs, ILTypeDefs, ILFieldDefs, ILMethodImplDefs, ILEventDefs, ILPropertyDefs, ILTypeDefAdditionalFlags, ILSecurityDecls, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Void .ctor(System.String, System.Reflection.TypeAttributes, ILTypeDefLayout, Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType], ILMethodDefs, ILTypeDefs, ILFieldDefs, ILMethodImplDefs, ILEventDefs, ILPropertyDefs, ILTypeDefAdditionalFlags, ILSecurityDecls, ILAttributesStored) FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Nested: ILMemberAccess Item FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Nested: ILMemberAccess get_Item() FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Tags: Int32 Nested @@ -1773,6 +1771,20 @@ FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Major() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Minor() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Revision() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: Void .ctor(UInt16, UInt16, UInt16, UInt16) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributes CustomAttrs +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributes get_CustomAttrs() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored CustomAttrsStored +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored CustomAttrsStored@ +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored get_CustomAttrsStored() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILType Type +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILType get_Type() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Int32 Idx +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Int32 get_Idx() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: InterfaceImpl Create(ILType) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: InterfaceImpl Create(ILType, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: System.String ToString() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Void .ctor(Int32, ILType, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Void set_CustomAttrsStored(ILAttributesStored) FSharp.Compiler.AbstractIL.IL+MethodBody+IL: Internal.Utilities.Library.InterruptibleLazy`1[FSharp.Compiler.AbstractIL.IL+ILMethodBody] Item FSharp.Compiler.AbstractIL.IL+MethodBody+IL: Internal.Utilities.Library.InterruptibleLazy`1[FSharp.Compiler.AbstractIL.IL+ILMethodBody] get_Item() FSharp.Compiler.AbstractIL.IL+MethodBody+PInvoke: System.Lazy`1[FSharp.Compiler.AbstractIL.IL+PInvokeMethod] Item @@ -1909,6 +1921,7 @@ FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeInit FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeRef FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeSpec FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILVersionInfo +FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+InterfaceImpl FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+MethodBody FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+PublicKey FSharp.Compiler.AbstractIL.IL: ILAttributes emptyILCustomAttrs @@ -1957,6 +1970,8 @@ FSharp.Compiler.AbstractIL.IL: ILTypeDefs mkILTypeDefsComputed(Microsoft.FSharp. FSharp.Compiler.AbstractIL.IL: ILTypeDefs mkILTypeDefsFromArray(ILTypeDef[]) FSharp.Compiler.AbstractIL.IL: Int32 NoMetadataIdx FSharp.Compiler.AbstractIL.IL: Int32 get_NoMetadataIdx() +FSharp.Compiler.AbstractIL.IL: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] emptyILInterfaceImpls +FSharp.Compiler.AbstractIL.IL: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] get_emptyILInterfaceImpls() FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: ILModuleDef ILModuleDef FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: ILModuleDef get_ILModuleDef() FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILAssemblyRef] ILAssemblyRefs diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index 3ae2414fc07..543c92ef5cc 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -1565,7 +1565,7 @@ FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILPropertyDefs Properties FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILPropertyDefs get_Properties() FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILSecurityDecls SecurityDecls FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILSecurityDecls get_SecurityDecls() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDef With(Microsoft.FSharp.Core.FSharpOption`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Reflection.TypeAttributes], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefLayout], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILFieldDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodImplDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILEventDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILPropertyDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefAdditionalFlags], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILAttributesStored], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILSecurityDecls], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]]]) +FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDef With(Microsoft.FSharp.Core.FSharpOption`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Reflection.TypeAttributes], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefLayout], Microsoft.FSharp.Core.FSharpOption`1[Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType]], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILFieldDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodImplDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILEventDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILPropertyDefs], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILTypeDefAdditionalFlags], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILAttributesStored], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILSecurityDecls]) FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefAccess Access FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefAccess get_Access() FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefLayout Layout @@ -1574,20 +1574,18 @@ FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefs NestedTypes FSharp.Compiler.AbstractIL.IL+ILTypeDef: ILTypeDefs get_NestedTypes() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Int32 MetadataIndex FSharp.Compiler.AbstractIL.IL+ILTypeDef: Int32 get_MetadataIndex() +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] Implements +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] get_Implements() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef] GenericParams FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef] get_GenericParams() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType] Implements -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType] get_Implements() FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType] Extends FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType] get_Extends() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]] ImplementsCustomAttrs -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]] get_ImplementsCustomAttrs() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.Reflection.TypeAttributes Attributes FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.Reflection.TypeAttributes get_Attributes() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String Name FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String ToString() FSharp.Compiler.AbstractIL.IL+ILTypeDef: System.String get_Name() -FSharp.Compiler.AbstractIL.IL+ILTypeDef: Void .ctor(System.String, System.Reflection.TypeAttributes, ILTypeDefLayout, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`2[FSharp.Compiler.AbstractIL.IL+ILAttributesStored,System.Int32]]], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType], ILMethodDefs, ILTypeDefs, ILFieldDefs, ILMethodImplDefs, ILEventDefs, ILPropertyDefs, ILTypeDefAdditionalFlags, ILSecurityDecls, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+ILTypeDef: Void .ctor(System.String, System.Reflection.TypeAttributes, ILTypeDefLayout, Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILType], ILMethodDefs, ILTypeDefs, ILFieldDefs, ILMethodImplDefs, ILEventDefs, ILPropertyDefs, ILTypeDefAdditionalFlags, ILSecurityDecls, ILAttributesStored) FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Nested: ILMemberAccess Item FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Nested: ILMemberAccess get_Item() FSharp.Compiler.AbstractIL.IL+ILTypeDefAccess+Tags: Int32 Nested @@ -1773,6 +1771,20 @@ FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Major() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Minor() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: UInt16 get_Revision() FSharp.Compiler.AbstractIL.IL+ILVersionInfo: Void .ctor(UInt16, UInt16, UInt16, UInt16) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributes CustomAttrs +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributes get_CustomAttrs() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored CustomAttrsStored +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored CustomAttrsStored@ +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILAttributesStored get_CustomAttrsStored() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILType Type +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: ILType get_Type() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Int32 Idx +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Int32 get_Idx() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: InterfaceImpl Create(ILType) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: InterfaceImpl Create(ILType, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: System.String ToString() +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Void .ctor(Int32, ILType, ILAttributesStored) +FSharp.Compiler.AbstractIL.IL+InterfaceImpl: Void set_CustomAttrsStored(ILAttributesStored) FSharp.Compiler.AbstractIL.IL+MethodBody+IL: Internal.Utilities.Library.InterruptibleLazy`1[FSharp.Compiler.AbstractIL.IL+ILMethodBody] Item FSharp.Compiler.AbstractIL.IL+MethodBody+IL: Internal.Utilities.Library.InterruptibleLazy`1[FSharp.Compiler.AbstractIL.IL+ILMethodBody] get_Item() FSharp.Compiler.AbstractIL.IL+MethodBody+PInvoke: System.Lazy`1[FSharp.Compiler.AbstractIL.IL+PInvokeMethod] Item @@ -1909,6 +1921,7 @@ FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeInit FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeRef FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILTypeSpec FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILVersionInfo +FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+InterfaceImpl FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+MethodBody FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+PublicKey FSharp.Compiler.AbstractIL.IL: ILAttributes emptyILCustomAttrs @@ -1957,6 +1970,8 @@ FSharp.Compiler.AbstractIL.IL: ILTypeDefs mkILTypeDefsComputed(Microsoft.FSharp. FSharp.Compiler.AbstractIL.IL: ILTypeDefs mkILTypeDefsFromArray(ILTypeDef[]) FSharp.Compiler.AbstractIL.IL: Int32 NoMetadataIdx FSharp.Compiler.AbstractIL.IL: Int32 get_NoMetadataIdx() +FSharp.Compiler.AbstractIL.IL: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] emptyILInterfaceImpls +FSharp.Compiler.AbstractIL.IL: Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+InterfaceImpl]] get_emptyILInterfaceImpls() FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: ILModuleDef ILModuleDef FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: ILModuleDef get_ILModuleDef() FSharp.Compiler.AbstractIL.ILBinaryReader+ILModuleReader: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILAssemblyRef] ILAssemblyRefs diff --git a/tests/FSharp.Compiler.Service.Tests/ModuleReaderCancellationTests.fs b/tests/FSharp.Compiler.Service.Tests/ModuleReaderCancellationTests.fs index 9ce34ec9be7..ed245117916 100644 --- a/tests/FSharp.Compiler.Service.Tests/ModuleReaderCancellationTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/ModuleReaderCancellationTests.fs @@ -115,7 +115,7 @@ type PreTypeDefData = mkILMethods [] let typeAttributes = TypeAttributes.Public - ILTypeDef(this.Name, typeAttributes, ILTypeDefLayout.Auto, [], None, [], + ILTypeDef(this.Name, typeAttributes, ILTypeDefLayout.Auto, emptyILInterfaceImpls, [], None, methodsDefs, mkILTypeDefs [], mkILFields [], emptyILMethodImpls, mkILEvents [], mkILProperties [], ILTypeDefAdditionalFlags.None, emptyILSecurityDecls, emptyILCustomAttrsStored) From 5f958fbd28cf4d36b6191013dbee67aa7b575e55 Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:34:33 +0200 Subject: [PATCH 06/37] FSI: make scripting temp directory one per session instead of global (#17760) * make scripting temp per session * release notes --- .../.FSharp.Compiler.Service/9.0.100.md | 1 + src/Compiler/Interactive/fsi.fs | 57 +++++++++---------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md index 4fdf50a224a..b98195c81d7 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md @@ -54,5 +54,6 @@ * Optimize ILTypeDef interface impls reading from metadata. ([PR #17382](https://github.com/dotnet/fsharp/pull/17382)) * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) * Better error reporting for active patterns. ([PR #17666](https://github.com/dotnet/fsharp/pull/17666)) +* Multiple fsi sessions use separate temporary directories ([PR #17760](https://github.com/dotnet/fsharp/pull/17760)) ### Breaking Changes diff --git a/src/Compiler/Interactive/fsi.fs b/src/Compiler/Interactive/fsi.fs index 832327656d9..10991bb59f7 100644 --- a/src/Compiler/Interactive/fsi.fs +++ b/src/Compiler/Interactive/fsi.fs @@ -1675,34 +1675,6 @@ let internal mkBoundValueTypedImpl tcGlobals m moduleName name ty = let qname = QualifiedNameOfFile.QualifiedNameOfFile(Ident(moduleName, m)) entity, v, CheckedImplFile.CheckedImplFile(qname, [], mty, contents, false, false, StampMap.Empty, Map.empty) -let scriptingSymbolsPath = - let createDirectory (path: string) = - lazy - try - if not (Directory.Exists(path)) then - Directory.CreateDirectory(path) |> ignore - - path - with _ -> - path - - createDirectory (Path.Combine(Path.GetTempPath(), $"{DateTime.Now:s}-{Guid.NewGuid():n}".Replace(':', '-'))) - -let deleteScriptingSymbols () = - try -#if !DEBUG - if scriptingSymbolsPath.IsValueCreated then - if Directory.Exists(scriptingSymbolsPath.Value) then - Directory.Delete(scriptingSymbolsPath.Value, true) -#else - () -#endif - with _ -> - () - -AppDomain.CurrentDomain.ProcessExit -|> Event.add (fun _ -> deleteScriptingSymbols ()) - let dynamicCcuName = "FSI-ASSEMBLY" /// Encapsulates the coordination of the typechecking, optimization and code generation @@ -1764,6 +1736,33 @@ type internal FsiDynamicCompiler let reportedAssemblies = Dictionary() + let scriptingSymbolsPath = + let createDirectory (path: string) = + try + if not (Directory.Exists(path)) then + Directory.CreateDirectory(path) |> ignore + + path + with _ -> + path + + createDirectory (Path.Combine(Path.GetTempPath(), $"{DateTime.Now:s}-{Guid.NewGuid():n}".Replace(':', '-'))) + + let deleteScriptingSymbols () = + try +#if !DEBUG + if Directory.Exists(scriptingSymbolsPath) then + Directory.Delete(scriptingSymbolsPath, true) +#else + () +#endif + with _ -> + () + + do + AppDomain.CurrentDomain.ProcessExit + |> Event.add (fun _ -> deleteScriptingSymbols ()) + /// Add attributes let CreateModuleFragment (tcConfigB: TcConfigBuilder, dynamicCcuName, codegenResults) = if progress then @@ -1841,7 +1840,7 @@ type internal FsiDynamicCompiler { ilg = tcGlobals.ilg outfile = $"{multiAssemblyName}-{dynamicAssemblyId}.dll" - pdbfile = Some(Path.Combine(scriptingSymbolsPath.Value, $"{multiAssemblyName}-{dynamicAssemblyId}.pdb")) + pdbfile = Some(Path.Combine(scriptingSymbolsPath, $"{multiAssemblyName}-{dynamicAssemblyId}.pdb")) emitTailcalls = tcConfig.emitTailcalls deterministic = tcConfig.deterministic portablePDB = true From 8d04015e517878677c2982567f148cba1bbc9c77 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Wed, 18 Sep 2024 12:50:49 +0200 Subject: [PATCH 07/37] Update Versions.props (#17764) * Update Versions.props * Update release notes --- .../release-notes/.FSharp.Compiler.Service/9.0.200.md | 11 +++++++++++ eng/Versions.props | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 docs/release-notes/.FSharp.Compiler.Service/9.0.200.md diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md new file mode 100644 index 00000000000..a2a0f964f7f --- /dev/null +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -0,0 +1,11 @@ +### Fixed + + +### Added + + +### Changed + +* Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) + +### Breaking Changes diff --git a/eng/Versions.props b/eng/Versions.props index c56fb4a3cd0..24e8f6f6790 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -14,7 +14,7 @@ 9 0 - 100 + 200 0 From 767b5ecfc3ea740f41a833a180e6443c5ed2dbc4 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 18 Sep 2024 04:26:45 -0700 Subject: [PATCH 08/37] reenable attribute usage (#17763) --- src/Compiler/Facilities/LanguageFeatures.fs | 2 +- .../AttributeUsage/AttributeUsage.fs | 62 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/Compiler/Facilities/LanguageFeatures.fs b/src/Compiler/Facilities/LanguageFeatures.fs index 5d71f3ed27b..5c311237594 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fs +++ b/src/Compiler/Facilities/LanguageFeatures.fs @@ -212,9 +212,9 @@ type LanguageVersion(versionText) = LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops, languageVersion90 LanguageFeature.ParsedHashDirectiveArgumentNonQuotes, languageVersion90 LanguageFeature.EmptyBodiedComputationExpressions, languageVersion90 + LanguageFeature.EnforceAttributeTargets, languageVersion90 // F# preview - LanguageFeature.EnforceAttributeTargets, previewVersion // waiting for fix of https://github.com/dotnet/fsharp/issues/17731 LanguageFeature.UnmanagedConstraintCsharpInterop, previewVersion // not enabled because: https://github.com/dotnet/fsharp/issues/17509 LanguageFeature.FromEndSlicing, previewVersion // Unfinished features --- needs work LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters, previewVersion diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs index bf413c777d3..f6d8a0cc530 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs @@ -98,7 +98,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargets01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -134,7 +134,7 @@ module CustomAttributes_AttributeUsage = let ``E_AttributeTargetIsField01_fs`` compilation = compilation |> withOptions ["--nowarn:25"] - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -187,7 +187,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsMethod02_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> withOptions ["--nowarn:25"] |> verifyCompile |> shouldFail @@ -218,7 +218,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsMethod03_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> withOptions ["--nowarn:25"] |> verifyCompile |> shouldFail @@ -336,7 +336,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsStruct_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -366,7 +366,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsClass_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -387,7 +387,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsClass01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -485,7 +485,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsField03_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -505,7 +505,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsProperty01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -525,7 +525,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsCtor01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -562,7 +562,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetIsEnum01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -599,7 +599,7 @@ module CustomAttributes_AttributeUsage = [] let ``E_AttributeTargetsIsDelegate01_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -648,7 +648,7 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = [] let ``E_AttributeTargetIsInterface_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -670,7 +670,7 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = [] let ``E_AttributeTargetIsClass02_fs`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -698,9 +698,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=CLIMutableAttribute01.fs # CLIMutableAttribute01.fs [] - let ``CLIMutableAttribute01 preview`` compilation = + let ``CLIMutableAttribute01 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldSucceed @@ -724,9 +724,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=E_CLIMutableAttribute.fs # E_CLIMutableAttribute.fs [] - let ``E_CLIMutableAttribute preview`` compilation = + let ``E_CLIMutableAttribute 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -761,9 +761,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=E_AllowNullLiteral.fs # E_AllowNullLiteral.fs [] - let ``E_AllowNullLiteral preview`` compilation = + let ``E_AllowNullLiteral 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -788,9 +788,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=AllowNullLiteral01.fs # AllowNullLiteral01.fs [] - let ``AllowNullLiteral01 preview`` compilation = + let ``AllowNullLiteral01 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldSucceed @@ -816,9 +816,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=E_VolatileField.fs # E_VolatileField.fs [] - let ``E_VolatileField preview`` compilation = + let ``E_VolatileField 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -844,9 +844,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=VolatileField01.fs # VolatileField01.fs [] - let ``VolatileField01 preview`` compilation = + let ``VolatileField01 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldSucceed @@ -865,9 +865,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=E_SealedAttribute01.fs # E_SealedAttribute01.fs [] - let ``E_SealedAttribute01 preview`` compilation = + let ``E_SealedAttribute01 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -893,9 +893,9 @@ type InterruptibleLazy<'T> private (valueFactory: unit -> 'T) = // SOURCE=E_StructLayout01.fs # E_StructLayout01.fs [] - let ``E_StructLayout01 preview`` compilation = + let ``E_StructLayout01 90`` compilation = compilation - |> withLangVersionPreview + |> withLangVersion90 |> verifyCompile |> shouldFail |> withDiagnostics [ @@ -925,7 +925,7 @@ and [] """ [] - [] + [] [] let ``Regression for - F# 9 compiler cannot find constructor for attribute`` langVersion = FSharp missingConstructorRepro From 398d16d95c14c96f5ff7173b5fa529fa879cbee6 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 23 Sep 2024 12:18:18 +0100 Subject: [PATCH 09/37] Better ranges for CE `let!` and `use!` error reporting. (#17712) --- .../.FSharp.Compiler.Service/9.0.200.md | 1 + .../CheckComputationExpressions.fs | 49 +++-- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 7 +- src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 2 + src/Compiler/pars.fsy | 8 +- .../Language/ComputationExpressionTests.fs | 196 ++++++++++++++++++ ...ervice.SurfaceArea.netstandard20.debug.bsl | 4 +- ...vice.SurfaceArea.netstandard20.release.bsl | 4 +- .../DataExpressions/ComputationExpressions.fs | 8 +- tests/fsharp/typecheck/sigs/neg61.bsl | 4 +- ...atStartsAtAndAndEndsAfterExpression.fs.bsl | 3 +- ...geStartsAtAndAndEndsAfterExpression.fs.bsl | 3 +- ...BangContainsTheRangeOfTheEqualsSign.fs.bsl | 3 +- 13 files changed, 250 insertions(+), 42 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index a2a0f964f7f..ce187cb8421 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -7,5 +7,6 @@ ### Changed * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) +* Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) ### Breaking Changes diff --git a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs index 3a3682fbf53..5d9f3562ed9 100644 --- a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs @@ -1589,10 +1589,10 @@ let rec TryTranslateComputationExpression Some(TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp2 translatedCtxt) else - if ceenv.isQuery && not (innerComp1.IsArbExprAndThusAlreadyReportedError) then match innerComp1 with - | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential + | SynExpr.JoinIn _ -> () + | SynExpr.DoBang(range = m) -> errorR (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), m)) | _ -> errorR (Error(FSComp.SR.tcUnrecognizedQueryOperator (), innerComp1.RangeOfFirstPortion)) match @@ -1854,12 +1854,14 @@ let rec TryTranslateComputationExpression // or // --> build.BindReturn(e1, (fun _argN -> match _argN with pat -> expr-without-return)) | SynExpr.LetOrUseBang( - bindDebugPoint = spBind; isUse = false; isFromSource = isFromSource; pat = pat; rhs = rhsExpr; andBangs = []; body = innerComp) -> - - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m - | _ -> rhsExpr.Range + bindDebugPoint = spBind + isUse = false + isFromSource = isFromSource + pat = pat + rhs = rhsExpr + andBangs = [] + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) -> if ceenv.isQuery then error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) @@ -1900,7 +1902,8 @@ let rec TryTranslateComputationExpression pat = SynPat.Named(ident = SynIdent(id, _); isThisVal = false) as pat rhs = rhsExpr andBangs = [] - body = innerComp) + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) | SynExpr.LetOrUseBang( bindDebugPoint = spBind isUse = true @@ -1908,12 +1911,8 @@ let rec TryTranslateComputationExpression pat = SynPat.LongIdent(longDotId = SynLongIdent(id = [ id ])) as pat rhs = rhsExpr andBangs = [] - body = innerComp) -> - - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m - | _ -> rhsExpr.Range + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) -> if ceenv.isQuery then error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) @@ -1988,9 +1987,9 @@ let rec TryTranslateComputationExpression Some(translatedCtxt bindExpr) // 'use! pat = e1 ... in e2' where 'pat' is not a simple name -> error - | SynExpr.LetOrUseBang(isUse = true; pat = pat; andBangs = andBangs) -> + | SynExpr.LetOrUseBang(isUse = true; andBangs = andBangs; trivia = { LetOrUseBangKeyword = mBind }) -> if isNil andBangs then - error (Error(FSComp.SR.tcInvalidUseBangBinding (), pat.Range)) + error (Error(FSComp.SR.tcInvalidUseBangBinding (), mBind)) else let m = match andBangs with @@ -2013,17 +2012,17 @@ let rec TryTranslateComputationExpression rhs = letRhsExpr andBangs = andBangBindings body = innerComp - range = letBindRange) -> + trivia = { LetOrUseBangKeyword = mBind }) -> if not (cenv.g.langVersion.SupportsFeature LanguageFeature.AndBang) then - error (Error(FSComp.SR.tcAndBangNotSupported (), comp.Range)) + let andBangRange = + match andBangBindings with + | [] -> comp.Range + | h :: _ -> h.Trivia.AndBangKeyword - if ceenv.isQuery then - error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), letBindRange)) + error (Error(FSComp.SR.tcAndBangNotSupported (), andBangRange)) - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m - | _ -> letRhsExpr.Range + if ceenv.isQuery then + error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) let sources = (letRhsExpr diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 0932befd7c1..bbc5f8ea0ce 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -93,10 +93,15 @@ type SynExprLetOrUseTrivia = [] type SynExprLetOrUseBangTrivia = { + LetOrUseBangKeyword: range EqualsRange: range option } - static member Zero: SynExprLetOrUseBangTrivia = { EqualsRange = None } + static member Zero: SynExprLetOrUseBangTrivia = + { + LetOrUseBangKeyword = Range.Zero + EqualsRange = None + } [] type SynExprMatchTrivia = diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 24bfc1b7a52..08f8228c3bc 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -139,6 +139,8 @@ type SynExprLetOrUseTrivia = [] type SynExprLetOrUseBangTrivia = { + /// The syntax range of the `let!` or `use!` keyword. + LetOrUseBangKeyword: range /// The syntax range of the `=` token. EqualsRange: range option } diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 2794edf560e..c930398b24b 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4419,7 +4419,7 @@ declExpr: { let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, $7, $8, m, trivia) } | OBINDER headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP moreBinders typedSequentialExprBlock %prec expr_let @@ -4428,7 +4428,7 @@ declExpr: let spBind = DebugPointAtBinding.Yes(unionRanges (rhs parseState 1) $4.Range) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, $7, $8, m, trivia) } | OBINDER headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP error %prec expr_let @@ -4437,12 +4437,12 @@ declExpr: let mEquals = rhs parseState 3 let mAll = unionRanges (rhs parseState 1) (rhs parseState 7) let m = $4.Range.EndRange // zero-width range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, [], SynExpr.ImplicitZero m, mAll, trivia) } | DO_BANG typedSequentialExpr IN opt_OBLOCKSEP typedSequentialExprBlock %prec expr_let { let spBind = DebugPointAtBinding.NoneAtDo - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = None } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = Range.Zero; EqualsRange = None } SynExpr.LetOrUseBang(spBind, false, true, SynPat.Const(SynConst.Unit, $2.Range), $2, [], $5, unionRanges (rhs parseState 1) $5.Range, trivia) } | ODO_BANG typedSequentialExprBlock hardwhiteDefnBindingsTerminator %prec expr_let diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index d5c6a5a0a63..8333657e699 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -246,4 +246,200 @@ let run r2 r3 = |> shouldFail |> withDiagnostics [ (Error 3345, Line 22, Col 9, Line 22, Col 13, "use! may not be combined with and!") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Bind' method`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + let! a = r2 + return! a + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 23, Col 9, Line 23, Col 13, "This control construct may only be used if the computation expression builder defines a 'Bind' method") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Using' method`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + use! a = r2 + return! a + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 23, Col 9, Line 23, Col 13, "This control construct may only be used if the computation expression builder defines a 'Using' method") + ] + + [] + let ``do! expressions may not be used in queries`` () = + Fsx """ +query { + do! failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 3, Col 5, Line 3, Col 20, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``let! expressions may not be used in queries`` () = + Fsx """ +query { + let! x = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 3, Col 5, Line 3, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``let!, and! expressions may not be used in queries`` () = + Fsx """ +query { + let! x = failwith "" + and! y = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 3, Col 5, Line 3, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``use! expressions may not be used in queries`` () = + Fsx """ +query { + use! x = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 3, Col 5, Line 3, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``do! expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +query { + for c in [1..10] do + do! failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 4, Col 5, Line 4, Col 20, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``let! expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +query { + for c in [1..10] do + let! x = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 4, Col 5, Line 4, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``let!, and! expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +query { + for c in [1..10] do + let! x = failwith "" + and! y = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 4, Col 5, Line 4, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``use! expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +query { + for c in [1..10] do + use! x = failwith "" + yield 1 +} + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3143, Line 4, Col 5, Line 4, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") ] \ No newline at end of file diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index 543c92ef5cc..c41cdbbea96 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -10203,7 +10203,9 @@ FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.SyntaxTr FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] EqualsRange FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_EqualsRange() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.Text.Range LetOrUseBangKeyword +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.Text.Range get_LetOrUseBangKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia Zero FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia get_Zero() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index 543c92ef5cc..c41cdbbea96 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -10203,7 +10203,9 @@ FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.SyntaxTr FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] EqualsRange FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_EqualsRange() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.Text.Range LetOrUseBangKeyword +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: FSharp.Compiler.Text.Range get_LetOrUseBangKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia Zero FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia get_Zero() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword diff --git a/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs b/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs index 715a1e060a1..c6269705d17 100644 --- a/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs +++ b/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs @@ -281,7 +281,7 @@ let ceResult : Trace = return if y then x else -1 } """ - [| FSharpDiagnosticSeverity.Error, 3344, (6, 9, 8, 35), "This feature is not supported in this version of F#. You may need to add /langversion:preview to use this feature." |] + [| FSharpDiagnosticSeverity.Error, 3344, (7, 9, 7, 13), "This feature is not supported in this version of F#. You may need to add /langversion:preview to use this feature." |] [] let ``AndBang TraceMultiBindingMonoid`` () = @@ -582,7 +582,7 @@ let _ = return x + y } """ - [|(FSharpDiagnosticSeverity.Error, 3343, (6, 9, 6, 25), "The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a 'Bind2' method or appropriate 'MergeSources' and 'Bind' methods")|] + [|(FSharpDiagnosticSeverity.Error, 3343, (6, 9, 6, 13), "The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a 'Bind2' method or appropriate 'MergeSources' and 'Bind' methods")|] [] let ``AndBang Negative TraceApplicative missing Bind and BindReturn`` () = @@ -596,7 +596,7 @@ let _ = return x + y } """ - [|(FSharpDiagnosticSeverity.Error, 708, (6, 9, 6, 25), "This control construct may only be used if the computation expression builder defines a 'Bind' method")|] + [|(FSharpDiagnosticSeverity.Error, 708, (6, 9, 6, 13), "This control construct may only be used if the computation expression builder defines a 'Bind' method")|] [] @@ -612,7 +612,7 @@ let _ = return x + y } """ - [| FSharpDiagnosticSeverity.Error, 708, (7, 9, 7, 25), "This control construct may only be used if the computation expression builder defines a 'Bind' method" |] + [| FSharpDiagnosticSeverity.Error, 708, (7, 9, 7, 13), "This control construct may only be used if the computation expression builder defines a 'Bind' method" |] [] let ``AndBang TraceApplicative with do-bang`` () = diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index e0b2fb5eafb..8a8bd79e168 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -59,9 +59,7 @@ neg61.fs(86,13,86,16): typecheck error FS3141: 'try/finally' expressions may not neg61.fs(92,13,92,70): typecheck error FS3142: 'use' expressions may not be used in queries -neg61.fs(97,13,97,33): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries - -neg61.fs(102,13,102,28): typecheck error FS3145: 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. +neg61.fs(97,13,97,17): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries neg61.fs(102,13,102,28): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries diff --git a/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl b/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl index 2c7ca108bc8..72f8528c23f 100644 --- a/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl +++ b/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl @@ -40,7 +40,8 @@ ImplFile EqualsRange = (5,13--5,14) InKeyword = None })], YieldOrReturn ((false, true), Ident bar, (6,4--6,14)), - (3,4--6,14), { EqualsRange = Some (3,13--3,14) }), + (3,4--6,14), { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,13--3,14) }), (2,6--7,1)), (2,0--7,1)), (2,0--7,1))], PreXmlDocEmpty, [], None, (2,0--7,1), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl b/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl index 105a94f5b46..d0dd3083e64 100644 --- a/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl +++ b/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl @@ -29,7 +29,8 @@ ImplFile EqualsRange = (5,13--5,14) InKeyword = None })], YieldOrReturn ((false, true), Ident bar, (7,4--7,14)), - (3,4--7,14), { EqualsRange = Some (3,13--3,14) }), + (3,4--7,14), { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,13--3,14) }), (2,6--8,1)), (2,0--8,1)), (2,0--8,1))], PreXmlDocEmpty, [], None, (2,0--8,1), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl index 7dfd05fc1ad..a0f54029820 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl @@ -27,7 +27,8 @@ ImplFile InKeyword = None })], YieldOrReturn ((false, true), Const (Unit, (5,11--5,13)), (5,4--5,13)), - (3,4--5,13), { EqualsRange = Some (3,11--3,12) }), + (3,4--5,13), { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,11--3,12) }), (2,5--6,1)), (2,0--6,1)), (2,0--6,1))], PreXmlDocEmpty, [], None, (2,0--6,1), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] From 2907d595bccae9f43ec14673600ace62c9ce9933 Mon Sep 17 00:00:00 2001 From: Petr Date: Mon, 23 Sep 2024 19:01:06 +0200 Subject: [PATCH 10/37] Migrate VisualFSharp tests to Xunit (#17751) * Migrate last Nunit tests to Xunit * up * up * up * Update TestLib.LanguageService.fs * up * up * up * Remove unused tests * one more * up --------- Co-authored-by: Kevin Ransom (msft) --- TESTGUIDE.md | 8 - .../tests/UnitTests/AssemblyResolver.fs | 7 - .../UnitTests/DocCommentIdParserTests.fs | 9 +- .../Tests.LanguageService.Completion.fs | 1262 ++++++++--------- .../Tests.LanguageService.ErrorList.fs | 200 +-- .../Tests.LanguageService.ErrorRecovery.fs | 48 +- .../Tests.LanguageService.General.fs | 57 +- .../Tests.LanguageService.GotoDefinition.fs | 287 ++-- .../Tests.LanguageService.NavigationBar.fs | 6 +- .../Tests.LanguageService.ParameterInfo.fs | 556 +++----- .../Tests.LanguageService.QuickInfo.fs | 489 +++---- .../Tests.LanguageService.QuickParse.fs | 112 +- .../Tests.LanguageService.Script.fs | 289 ++-- .../Tests.LanguageService.TimeStamp.fs | 39 +- .../Tests.ProjectSystem.Configs.fs | 37 +- .../Tests.ProjectSystem.Miscellaneous.fs | 179 ++- .../Tests.ProjectSystem.MultiTargeting.fs | 85 +- .../Tests.ProjectSystem.Project.fs | 88 +- .../Tests.ProjectSystem.ProjectItems.fs | 21 +- .../Tests.ProjectSystem.References.fs | 139 +- .../Tests.ProjectSystem.RoundTrip.fs | 23 +- .../Tests.ProjectSystem.UpToDate.fs | 157 +- .../UnitTests/TestLib.LanguageService.fs | 113 +- .../tests/UnitTests/TestLib.ProjectSystem.fs | 16 +- .../tests/UnitTests/TestLib.Salsa.fs | 4 +- .../tests/UnitTests/TestLib.Utils.fs | 2 +- vsintegration/tests/UnitTests/Tests.Build.fs | 93 +- .../UnitTests/Tests.InternalCollections.fs | 70 +- .../tests/UnitTests/Tests.Powerpack.fs | 87 -- .../tests/UnitTests/Tests.TaskReporter.fs | 23 +- vsintegration/tests/UnitTests/Tests.Watson.fs | 79 +- .../tests/UnitTests/Tests.XmlDocComments.fs | 17 +- .../tests/UnitTests/UnusedOpensTests.fs | 151 +- .../UnitTests/VisualFSharp.UnitTests.fsproj | 6 +- .../UnitTests/Workspace/WorkspaceTests.fs | 33 +- vsintegration/tests/UnitTests/app.runsettings | 8 - .../tests/UnitTests/xunit.runner.json | 5 + 37 files changed, 2046 insertions(+), 2759 deletions(-) delete mode 100644 vsintegration/tests/UnitTests/Tests.Powerpack.fs delete mode 100644 vsintegration/tests/UnitTests/app.runsettings create mode 100644 vsintegration/tests/UnitTests/xunit.runner.json diff --git a/TESTGUIDE.md b/TESTGUIDE.md index d9faeafde73..265241917a4 100644 --- a/TESTGUIDE.md +++ b/TESTGUIDE.md @@ -151,14 +151,6 @@ Tags are in the left column, paths to to corresponding test folders are in the r If you want to re-run a particular test area, the easiest way to do so is to set a temporary tag for that area in test.lst (e.g. "RERUN") and adjust `ttags` [run.fsharpqa.test.fsx script](tests/fsharpqa/run.fsharpqa.test.fsx) and run it. -### VisualFSharp.UnitTests - -These are currently NUnit tests (we hope to migrate them to xUnit). You can execute these tests individually via the Visual Studio NUnit3 runner -extension or the command line via `nunit3-console.exe`. - -Note that for compatibility reasons, the IDE unit tests should be run in a 32-bit process, -using the `--x86` flag to `nunit3-console.exe` - ### Logs and output All test execution logs and result files will be dropped into the `tests\TestResults` folder, and have file names matching diff --git a/vsintegration/tests/UnitTests/AssemblyResolver.fs b/vsintegration/tests/UnitTests/AssemblyResolver.fs index 65e717f2618..aab95cc46fc 100644 --- a/vsintegration/tests/UnitTests/AssemblyResolver.fs +++ b/vsintegration/tests/UnitTests/AssemblyResolver.fs @@ -1,6 +1,5 @@ namespace Microsoft.VisualStudio.FSharp -open NUnit.Framework open System open System.IO open System.Reflection @@ -46,9 +45,3 @@ module AssemblyResolver = match found() with | None -> Unchecked.defaultof | Some name -> Assembly.Load(name) ) - -[] -type public AssemblyResolverTestFixture () = - - [] - member public _.Init () = AssemblyResolver.addResolver () diff --git a/vsintegration/tests/UnitTests/DocCommentIdParserTests.fs b/vsintegration/tests/UnitTests/DocCommentIdParserTests.fs index b9cc39f66dc..a20cc3381a9 100644 --- a/vsintegration/tests/UnitTests/DocCommentIdParserTests.fs +++ b/vsintegration/tests/UnitTests/DocCommentIdParserTests.fs @@ -1,14 +1,11 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -[] + module Tests.ServiceAnalysis.DocCommentIdParser -open NUnit.Framework +open Xunit open Microsoft.VisualStudio.FSharp.Editor - - - -[] +[] let ``Test DocCommentId parser``() = let testData = dict [ "T:N.X.Nested", DocCommentId.Type ["N"; "X"; "Nested"]; diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs index be79eb48a9f..cb08d34ae88 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs @@ -7,7 +7,7 @@ open Microsoft.VisualStudio.FSharp.LanguageService open Salsa.Salsa open Salsa.VsMocks open Salsa.VsOpsUtils -open NUnit.Framework +open Xunit open UnitTests.TestLib.Salsa open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService @@ -25,7 +25,6 @@ module StandardSettings = let AC x y = AutoCompleteExpected(x,y) let DC x y = DotCompleteExpected(x,y) -[][] type UsingMSBuild() as this = inherit LanguageServiceBaseTests() @@ -212,11 +211,10 @@ type UsingMSBuild() as this = fileContents, marker, (fun completions -> - Assert.AreNotEqual(0,completions.Length) + Assert.NotEqual(0,completions.Length) let found = completions |> Array.exists(fun (CompletionItem(s,_,_,_,_)) -> s = expected) if not(found) then - printfn "Expected: %A to contain %s" completions expected - Assert.Fail() + failwithf "Expected: %A to contain %s" completions expected ), ?addtlRefAssy = addtlRefAssy ) @@ -232,7 +230,7 @@ type UsingMSBuild() as this = let (_, _, file) = this.CreateSingleFileProject(fileContents) MoveCursorToEndOfMarker(file,marker) let completions = AutoCompleteAtCursor file - Assert.AreNotEqual(0,completions.Length) + Assert.NotEqual(0,completions.Length) member public this.TestCompletionNotShowingWhenFastUpdate (firstSrc : string list) secondSrc marker = let (_, _, file) = this.CreateSingleFileProject(firstSrc) @@ -270,7 +268,7 @@ type UsingMSBuild() as this = let completions = DotCompletionAtStartOfMarker file marker AssertCompListIsEmpty(completions) - [] + [] member this.``AutoCompletion.ObjectMethods``() = let code = [ @@ -315,7 +313,7 @@ type UsingMSBuild() as this = test "DU_3." "DU_3." ["ExtensionPropObj"; "ExtensionMethodObj"; "Equals"] ["GetHashCode"] // no gethashcode, has equals defined in DU3 type test "DU_4." "DU_4." ["ExtensionPropObj"; "ExtensionMethodObj"; "GetHashCode"] ["Equals"] // no equals, has gethashcode defined in DU4 type - [] + [] member this.``AutoCompletion.BeforeThis``() = let code = [ @@ -348,9 +346,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompletionListIsEmptyNoCoffeeBreak c "this." AssertAutoCompleteCompletionListIsEmptyNoCoffeeBreak c "this." - [] - [] - [] + [] member this.``TypeProvider.VisibilityChecksForGeneratedTypes``() = let extraRefs = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] let check = DoWithAutoCompleteUsingExtraRefs extraRefs None true SourceFileKind.FS BackgroundRequestReason.MemberSelect @@ -385,49 +381,48 @@ type UsingMSBuild() as this = AssertCompListDoesNotContainAny(ci, ["f"; "ProtectedProp"; "ProtectedM"; "PrivateProp"; "PrivateM"]) - [] member public this.``AdjacentToDot_01``() = testAutoCompleteAdjacentToDot ".." - [] member public this.``AdjacentToDot_02``() = testAutoCompleteAdjacentToDot ".<" - [] member public this.``AdjacentToDot_03``() = testAutoCompleteAdjacentToDot ".>" - [] member public this.``AdjacentToDot_04``() = testAutoCompleteAdjacentToDot ".=" - [] member public this.``AdjacentToDot_05``() = testAutoCompleteAdjacentToDot ".!=" - [] member public this.``AdjacentToDot_06``() = testAutoCompleteAdjacentToDot ".$" - [] member public this.``AdjacentToDot_07``() = testAutoCompleteAdjacentToDot ".[]" - [] member public this.``AdjacentToDot_08``() = testAutoCompleteAdjacentToDot ".[]<-" - [] member public this.``AdjacentToDot_09``() = testAutoCompleteAdjacentToDot ".[,]<-" - [] member public this.``AdjacentToDot_10``() = testAutoCompleteAdjacentToDot ".[,,]<-" - [] member public this.``AdjacentToDot_11``() = testAutoCompleteAdjacentToDot ".[,,,]<-" - [] member public this.``AdjacentToDot_12``() = testAutoCompleteAdjacentToDot ".[,,,]" - [] member public this.``AdjacentToDot_13``() = testAutoCompleteAdjacentToDot ".[,,]" - [] member public this.``AdjacentToDot_14``() = testAutoCompleteAdjacentToDot ".[,]" - [] member public this.``AdjacentToDot_15``() = testAutoCompleteAdjacentToDot ".[..]" - [] member public this.``AdjacentToDot_16``() = testAutoCompleteAdjacentToDot ".[..,..]" - [] member public this.``AdjacentToDot_17``() = testAutoCompleteAdjacentToDot ".[..,..,..]" - [] member public this.``AdjacentToDot_18``() = testAutoCompleteAdjacentToDot ".[..,..,..,..]" - [] member public this.``AdjacentToDot_19``() = testAutoCompleteAdjacentToDot ".()" - [] member public this.``AdjacentToDot_20``() = testAutoCompleteAdjacentToDot ".()<-" - [] member public this.``AdjacentToDot_02_Negative``() = testAutoCompleteAdjacentToDotNegative ".<" - [] member public this.``AdjacentToDot_03_Negative``() = testAutoCompleteAdjacentToDotNegative ".>" - [] member public this.``AdjacentToDot_04_Negative``() = testAutoCompleteAdjacentToDotNegative ".=" - [] member public this.``AdjacentToDot_05_Negative``() = testAutoCompleteAdjacentToDotNegative ".!=" - [] member public this.``AdjacentToDot_06_Negative``() = testAutoCompleteAdjacentToDotNegative ".$" - [] member public this.``AdjacentToDot_07_Negative``() = testAutoCompleteAdjacentToDotNegative ".[]" - [] member public this.``AdjacentToDot_08_Negative``() = testAutoCompleteAdjacentToDotNegative ".[]<-" - [] member public this.``AdjacentToDot_09_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,]<-" - [] member public this.``AdjacentToDot_10_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,]<-" - [] member public this.``AdjacentToDot_11_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,,]<-" - [] member public this.``AdjacentToDot_12_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,,]" - [] member public this.``AdjacentToDot_13_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,]" - [] member public this.``AdjacentToDot_14_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,]" - [] member public this.``AdjacentToDot_15_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..]" - [] member public this.``AdjacentToDot_16_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..]" - [] member public this.``AdjacentToDot_17_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..,..]" - [] member public this.``AdjacentToDot_18_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..,..,..]" - [] member public this.``AdjacentToDot_19_Negative``() = testAutoCompleteAdjacentToDotNegative ".()" - [] member public this.``AdjacentToDot_20_Negative``() = testAutoCompleteAdjacentToDotNegative ".()<-" - [] member public this.``AdjacentToDot_21_Negative``() = testAutoCompleteAdjacentToDotNegative ".+." - - [] - [] + [] member public this.``AdjacentToDot_01``() = testAutoCompleteAdjacentToDot ".." + [] member public this.``AdjacentToDot_02``() = testAutoCompleteAdjacentToDot ".<" + [] member public this.``AdjacentToDot_03``() = testAutoCompleteAdjacentToDot ".>" + [] member public this.``AdjacentToDot_04``() = testAutoCompleteAdjacentToDot ".=" + [] member public this.``AdjacentToDot_05``() = testAutoCompleteAdjacentToDot ".!=" + [] member public this.``AdjacentToDot_06``() = testAutoCompleteAdjacentToDot ".$" + [] member public this.``AdjacentToDot_07``() = testAutoCompleteAdjacentToDot ".[]" + [] member public this.``AdjacentToDot_08``() = testAutoCompleteAdjacentToDot ".[]<-" + [] member public this.``AdjacentToDot_09``() = testAutoCompleteAdjacentToDot ".[,]<-" + [] member public this.``AdjacentToDot_10``() = testAutoCompleteAdjacentToDot ".[,,]<-" + [] member public this.``AdjacentToDot_11``() = testAutoCompleteAdjacentToDot ".[,,,]<-" + [] member public this.``AdjacentToDot_12``() = testAutoCompleteAdjacentToDot ".[,,,]" + [] member public this.``AdjacentToDot_13``() = testAutoCompleteAdjacentToDot ".[,,]" + [] member public this.``AdjacentToDot_14``() = testAutoCompleteAdjacentToDot ".[,]" + [] member public this.``AdjacentToDot_15``() = testAutoCompleteAdjacentToDot ".[..]" + [] member public this.``AdjacentToDot_16``() = testAutoCompleteAdjacentToDot ".[..,..]" + [] member public this.``AdjacentToDot_17``() = testAutoCompleteAdjacentToDot ".[..,..,..]" + [] member public this.``AdjacentToDot_18``() = testAutoCompleteAdjacentToDot ".[..,..,..,..]" + [] member public this.``AdjacentToDot_19``() = testAutoCompleteAdjacentToDot ".()" + [] member public this.``AdjacentToDot_20``() = testAutoCompleteAdjacentToDot ".()<-" + [] member public this.``AdjacentToDot_02_Negative``() = testAutoCompleteAdjacentToDotNegative ".<" + [] member public this.``AdjacentToDot_03_Negative``() = testAutoCompleteAdjacentToDotNegative ".>" + [] member public this.``AdjacentToDot_04_Negative``() = testAutoCompleteAdjacentToDotNegative ".=" + [] member public this.``AdjacentToDot_05_Negative``() = testAutoCompleteAdjacentToDotNegative ".!=" + [] member public this.``AdjacentToDot_06_Negative``() = testAutoCompleteAdjacentToDotNegative ".$" + [] member public this.``AdjacentToDot_07_Negative``() = testAutoCompleteAdjacentToDotNegative ".[]" + [] member public this.``AdjacentToDot_08_Negative``() = testAutoCompleteAdjacentToDotNegative ".[]<-" + [] member public this.``AdjacentToDot_09_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,]<-" + [] member public this.``AdjacentToDot_10_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,]<-" + [] member public this.``AdjacentToDot_11_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,,]<-" + [] member public this.``AdjacentToDot_12_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,,]" + [] member public this.``AdjacentToDot_13_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,,]" + [] member public this.``AdjacentToDot_14_Negative``() = testAutoCompleteAdjacentToDotNegative ".[,]" + [] member public this.``AdjacentToDot_15_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..]" + [] member public this.``AdjacentToDot_16_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..]" + [] member public this.``AdjacentToDot_17_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..,..]" + [] member public this.``AdjacentToDot_18_Negative``() = testAutoCompleteAdjacentToDotNegative ".[..,..,..,..]" + [] member public this.``AdjacentToDot_19_Negative``() = testAutoCompleteAdjacentToDotNegative ".()" + [] member public this.``AdjacentToDot_20_Negative``() = testAutoCompleteAdjacentToDotNegative ".()<-" + [] member public this.``AdjacentToDot_21_Negative``() = testAutoCompleteAdjacentToDotNegative ".+." + + [] member public this.``LambdaOverloads.Completion``() = let prologue = "open System.Linq" let cases = @@ -452,8 +447,7 @@ type UsingMSBuild() as this = let code = [prologue; case] AssertCtrlSpaceCompleteContains code "(*$*)x.Len" ["Length"] [] - [] - [] + [] member public this.``Query.CompletionInJoinOn``() = let code = [ @@ -467,7 +461,7 @@ type UsingMSBuild() as this = - [] + [] member public this.``TupledArgsInLambda.Completion.Bug312557_1``() = let code = [ @@ -477,7 +471,7 @@ type UsingMSBuild() as this = ] AssertCtrlSpaceCompleteContains code "(*MARKER*)" ["xxx"; "yyy"] [] - [] + [] member public this.``TupledArgsInLambda.Completion.Bug312557_2``() = let code = [ @@ -491,7 +485,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompleteContains code "b a" ["aaa"; "bbb"] [] AssertCtrlSpaceCompleteContains code "a b" ["aaa"; "bbb"] [] - [] + [] member this.``AutoCompletion.OnTypeConstraintError``() = let code = [ @@ -508,14 +502,12 @@ type UsingMSBuild() as this = ] AssertCtrlSpaceCompleteContains code "abcd." ["Bar"; "Equals"; "GetHashCode"; "GetType"; "InternalMethod"; "PublicMethodForIntellisense"; "ToString"] [] - [] - [] + [] member public this.``RangeOperator.IncorrectUsage``() = AssertCtrlSpaceCompletionListIsEmpty [".."] ".." AssertCtrlSpaceCompletionListIsEmpty ["..."] "..." - [] - [] + [] member public this.``Inherit.CompletionInConstructorArguments1``() = let code = [ @@ -524,8 +516,7 @@ type UsingMSBuild() as this = ] AssertCtrlSpaceCompleteContains code "inherit A(a" ["abs"] [] - [] - [] + [] member public this.``Inherit.CompletionInConstructorArguments2``() = let code = [ @@ -534,8 +525,7 @@ type UsingMSBuild() as this = ] AssertCtrlSpaceCompleteContains code "System.String." ["Empty"] ["Array"; "Collections"] - [] - [] + [] member public this.``ObjectInitializer.CompletionForProperties``() = let typeDef1 = [ @@ -602,8 +592,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompleteContains (typeDef4 @ ["new M.A<_, _>(S = 1)"]) "A<_, _>(S = 1" [] ["NonSettableProperty"; "SettableProperty"] AssertCtrlSpaceCompleteContains (typeDef4 @ ["new M.A<_, _>(S = 1,)"]) "A<_, _>(S = 1," ["AnotherSettableProperty"] ["NonSettableProperty"] - [] - [] + [] member public this.``ObjectInitializer.CompletionForSettableExtensionProperties``() = let typeDef = [ @@ -615,8 +604,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompleteContains (typeDef @ ["open Ext"; "A((**))"]) "A((**)" ["XYZ"] [] // positive AssertCtrlSpaceCompleteContains (typeDef @ ["A((**))"]) "A((**)" [] ["XYZ"] // negative - [] - [] + [] member public this.``ObjectInitializer.CompletionForNamedParameters``() = let typeDef1 = [ @@ -639,8 +627,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompleteContains (typeDef2 @ ["A.Run<_>(x = 1)"]) ".Run<_>(x" ["xyz"] [] AssertCtrlSpaceCompleteContains (typeDef2 @ ["A.Run<_>(x = 1,)"]) ".Run<_>(x = 1," ["xyz"; "zyx"] [] - [] - [] + [] member public this.``ObjectInitializer.CompletionForSettablePropertiesInReturnValue``() = let typeDef1 = [ @@ -675,8 +662,7 @@ type UsingMSBuild() as this = AssertCtrlSpaceCompleteContains (typeDef2 @ ["A.Run<_>(Settable = 1,)"]) ".Run<_>(Settable = 1," ["Settable0"] ["NonSettable"] - [] - [] + [] member public this.``RangeOperator.CorrectUsage``() = let useCases = [ @@ -697,7 +683,7 @@ type UsingMSBuild() as this = - [] + [] member public this.``Array.Length.InForRange``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let a = [|1;2;3|] @@ -706,7 +692,7 @@ for i in 0..a."] [ "Length" ] // should contain [ ] // should not contain - [] + [] member public this.``ProtectedMembers.BaseClass`` () = let sourceCode = [ @@ -716,7 +702,7 @@ for i in 0..a."] ] AssertCtrlSpaceCompleteContains sourceCode "x." ["Message"; "HResult"] [] - [] + [] member public this.``ProtectedMembers.SelfOrDerivedClass`` () = let sources = [ @@ -737,9 +723,7 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains src "x." ["Message"; "HResult"] [] - [] - [] - [] + [] member public this.``Records.DotCompletion.ConstructingRecords1``() = let prologue = "type OuterRec = {XX : int; YY : string}" @@ -754,8 +738,7 @@ for i in 0..a."] let code = [prologue; code] AssertCtrlSpaceCompleteContains code marker should ["abs"] - [] - [] + [] member public this.``Records.DotCompletion.ConstructingRecords2``() = let prologue = [ @@ -774,8 +757,7 @@ for i in 0..a."] let code = prologue @ [code] AssertCtrlSpaceCompleteContains code marker should shouldnot - [] - [] + [] member public this.``Records.CopyOnUpdate``() = let prologue = [ @@ -793,8 +775,7 @@ for i in 0..a."] let code = prologue @ [code] AssertCtrlSpaceCompleteContains code marker ["a"; "b"] ["abs"] - [] - [] + [] member public this.``Records.CopyOnUpdate.NoFieldsCompletionBeforeWith``() = let code = [ @@ -804,8 +785,7 @@ for i in 0..a."] ] AssertCtrlSpaceCompleteContains code "{r " [] ["AAA"] - [] - [] + [] member public this.``Records.Constructors1``() = let prologue = [ @@ -825,8 +805,7 @@ for i in 0..a."] let code = prologue @ [code] AssertCtrlSpaceCompleteContains code marker ["field1"; "field2"] ["abs"] - [] - [] + [] member public this.``Records.Constructors2.UnderscoresInNames``() = let prologue = [ @@ -845,14 +824,12 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains code marker ["_field1"; "_field2"] ["abs"] - [] - [] + [] member public this.``Records.NestedRecordPatterns``() = let code = ["[1..({contents = 5}).]"] AssertCtrlSpaceCompleteContains code "5})." ["Value"; "contents"] ["CompareTo"] - [] - [] + [] member public this.``Records.Separators1``() = let useCases = [ @@ -872,8 +849,7 @@ for i in 0..a."] printfn "%A" code AssertCtrlSpaceCompleteContains code marker ["abs"] ["AAA"; "BBB"] - [] - [] + [] member public this.``Records.Separators2``() = let useCases = [ @@ -909,8 +885,7 @@ for i in 0..a."] printfn "%A" code AssertCtrlSpaceCompleteContains code marker should ["abs"] - [] - [] + [] member public this.``Records.Inherits``() = let prologue = [ @@ -935,8 +910,7 @@ for i in 0..a."] printfn "%s" (String.concat "\r\n" code) AssertCtrlSpaceCompleteContains code marker should ["abs"] - [] - [] + [] member public this.``Records.MissingBindings``() = let prologue = [ @@ -956,8 +930,7 @@ for i in 0..a."] printfn "%s" (String.concat "\r\n" code) AssertCtrlSpaceCompleteContains code marker should ["abs"] - [] - [] + [] member public this.``Records.WRONG.ErrorsInFirstBinding``() = // errors in the first binding are critical now let prologue = @@ -976,8 +949,7 @@ for i in 0..a."] let code = prologue @ [code] AssertCtrlSpaceCompleteContains code marker [] ["field1"; "field2"] - [] - [] + [] member public this.``Records.InferByFieldsInPriorMethodArguments``() = let prologue = @@ -1005,7 +977,7 @@ for i in 0..a."] let code = prologue @ [code] AssertCtrlSpaceCompleteContains code marker should [] - [] + [] member this.``Completion.DetectInterfaces``() = let shouldBeInterface = [ @@ -1028,7 +1000,7 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains ifs "(*M*)" ["seq"] ["obj"] - [] + [] member this.``Completion.DetectClasses``() = let shouldBeClass = @@ -1056,7 +1028,7 @@ for i in 0..a."] for cls in shouldBeClass do AssertCtrlSpaceCompleteContains cls "(*M*)" ["obj"] ["seq"] - [] + [] member this.``Completion.DetectUnknownCompletionContext``() = let content = [ @@ -1066,7 +1038,7 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains content "(*M*)" ["obj"; "seq"] ["abs"] - [] + [] member this.``Completion.DetectInvalidCompletionContext``() = let shouldBeInvalid = [ @@ -1105,7 +1077,7 @@ for i in 0..a."] AssertCtrlSpaceCompletionListIsEmpty invalid "(*M*)" - [] + [] member this.``Completion.LongIdentifiers``() = // System.Diagnostics.Debugger.Launch() |> ignore AssertCtrlSpaceCompleteContains @@ -1188,8 +1160,7 @@ for i in 0..a."] ["Collections"; "IDisposable"] [] - [] - [] + [] member public this.``Query.GroupJoin.CompletionInIncorrectJoinRelations``() = let code = [ @@ -1202,8 +1173,7 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains code "(x." ["CompareTo"] ["abs"] AssertCtrlSpaceCompleteContains code "? y." ["Chars"; "Length"] ["abs"] - [] - [] + [] member public this.``Query.Join.CompletionInIncorrectJoinRelations``() = let code = [ @@ -1216,8 +1186,7 @@ for i in 0..a."] AssertCtrlSpaceCompleteContains code "(x." ["CompareTo"] ["abs"] AssertCtrlSpaceCompleteContains code "? y." ["Chars"; "Length"] ["abs"] - [] - [] + [] member public this.``Query.ForKeywordCanCompleteIntoIdentifier``() = let code = [ @@ -1229,7 +1198,7 @@ for i in 0..a."] ] AssertCtrlSpaceCompleteContains code "for" ["form"] [] // 'for' is a keyword, but should not prevent completion - [] + [] member public this.``ObjInstance.InheritedClass.MethodsWithDiffAccessibility``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type Base = @@ -1249,7 +1218,7 @@ derived.derivedField"] [ "baseField"; "derivedField" ] // should contain [ "baseFieldPrivate"; "derivedFieldPrivate" ] // should not contain - [] + [] member public this.``ObjInstance.InheritedClass.MethodsWithDiffAccessibilityWithSameNameMethod``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type Base = @@ -1270,7 +1239,7 @@ derived.derivedField"] [ "baseField"; "derivedField" ] // should contain [ "baseFieldPrivate"; "derivedFieldPrivate" ] // should not contain - [] + [] member public this.``Visibility.InheritedClass.MethodsWithDiffAccessibility``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type Base = @@ -1289,7 +1258,7 @@ type Derived = [ "baseField"; "derivedField"; "derivedFieldPrivate" ] // should contain [ "baseFieldPrivate" ] // should not contain - [] + [] member public this.``Visibility.InheritedClass.MethodsWithDiffAccessibilityWithSameNameMethod``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type Base = @@ -1309,7 +1278,7 @@ type Derived = [ "baseField"; "derivedField"; "derivedFieldPrivate" ] // should contain [ "baseFieldPrivate" ] // should not contain - [] + [] member public this.``Visibility.InheritedClass.MethodsWithSameNameMethod``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type MyClass = @@ -1330,7 +1299,7 @@ let x = new MyClass2(0) [ "foo" ] // should contain [ ] // should not contain - [] + [] member public this.``Identifier.Array.AfterassertKeyword``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let x = [1;2;3] " @@ -1339,7 +1308,7 @@ let x = new MyClass2(0) [ "Head" ] // should contain (from List) [ "Listeners" ] // should not contain (from System.Diagnostics.Debug) - [] + [] member public this.``CtrlSpaceCompletion.Bug130670.Case1``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak [ "let i = async.Return(4)" ] @@ -1347,7 +1316,7 @@ let x = new MyClass2(0) [ "AbstractClassAttribute" ] // should contain (top-level) [ "GetType" ] // should not contain (object instance method) - [] + [] member public this.``CtrlSpaceCompletion.Bug130670.Case2``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak [ """ @@ -1357,7 +1326,7 @@ let x = new MyClass2(0) [ "AbstractClassAttribute" ] // should contain (top-level) [ "CompareTo" ] // should not contain (instance method on int) - [] + [] member public this.``CtrlSpaceCompletion.Bug294974.Case1``() = AssertCtrlSpaceCompleteContains @@ -1368,7 +1337,7 @@ let x = new MyClass2(0) [ "xxx" ] // should contain (completions before dot) [ "IsEmpty" ] // should not contain (completions after dot) - [] + [] member public this.``CtrlSpaceCompletion.Bug294974.Case2``() = AssertCtrlSpaceCompleteContains [ """ @@ -1378,7 +1347,7 @@ let x = new MyClass2(0) [ "AbstractClassAttribute" ] // should contain (top-level) [ "IsEmpty" ] // should not contain (completions after dot) - [] + [] member public this.``ObsoleteProperties.6377_1``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Security.SecurityManager." ] @@ -1386,7 +1355,7 @@ let x = new MyClass2(0) [ "GetStandardSandbox" ] // should contain [ "get_SecurityEnabled"; "set_SecurityEnabled" ] // should not contain - [] + [] member public this.``ObsoleteProperties.6377_2``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Threading.Thread.CurrentThread." ] @@ -1394,7 +1363,7 @@ let x = new MyClass2(0) [ "CurrentCulture" ] // should contain: just make sure something shows [ "get_ApartmentState"; "set_ApartmentState" ] // should not contain - [] + [] member public this.``PopupsVersusCtrlSpaceOnDotDot.FirstDot.Popup``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Console..BackgroundColor" ] @@ -1402,7 +1371,7 @@ let x = new MyClass2(0) [ "BackgroundColor" ] // should contain (from prior System.Console) [ "abs" ] // should not contain (top-level autocomplete on empty identifier) - [] + [] member public this.``PopupsVersusCtrlSpaceOnDotDot.FirstDot.CtrlSpace``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak [ "System.Console..BackgroundColor" ] @@ -1410,17 +1379,17 @@ let x = new MyClass2(0) [ "BackgroundColor" ] // should contain (from prior System.Console) [ "abs" ] // should not contain (top-level autocomplete on empty identifier) - [] + [] member public this.``DotCompletionInPatternsPartOfLambda``() = let content = ["let _ = fun x . -> x + 1"] AssertCtrlSpaceCompletionListIsEmpty content "x ." - [] + [] member public this.``DotCompletionInBrokenLambda``() = let content = ["1 |> id (fun x .> x)"] AssertCtrlSpaceCompletionListIsEmpty content "x ." - [] + [] member public this.``DotCompletionInPatterns``() = let useCases = [ @@ -1433,7 +1402,7 @@ let x = new MyClass2(0) AssertCtrlSpaceCompletionListIsEmpty source marker - [] + [] member public this.``DotCompletionWithBrokenLambda``() = let errors = [ @@ -1458,8 +1427,7 @@ let x = new MyClass2(0) AssertCtrlSpaceCompleteContains source marker should shouldnot - [] - [] + [] member public this.``AfterConstructor.5039_1``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let someCall(x) = null" @@ -1468,8 +1436,7 @@ let x = new MyClass2(0) [ "ReadBlock" ] // should contain (StringReader) [ "LastIndexOfAny" ] // should not contain (String) - [] - [] + [] member public this.``AfterConstructor.5039_1.CoffeeBreak``() = AssertAutoCompleteContains [ "let someCall(x) = null" @@ -1478,7 +1445,7 @@ let x = new MyClass2(0) [ "ReadBlock" ] // should contain (StringReader) [ "LastIndexOfAny" ] // should not contain (String) - [] + [] member public this.``AfterConstructor.5039_2``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Random()." ] @@ -1486,7 +1453,7 @@ let x = new MyClass2(0) [ "NextDouble" ] // should contain [ ] // should not contain - [] + [] member public this.``AfterConstructor.5039_3``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Collections.Generic.List()." ] @@ -1494,7 +1461,7 @@ let x = new MyClass2(0) [ "BinarySearch" ] // should contain [ ] // should not contain - [] + [] member public this.``AfterConstructor.5039_4``() = AssertAutoCompleteContainsNoCoffeeBreak [ "System.Collections.Generic.List()." ] @@ -1502,7 +1469,7 @@ let x = new MyClass2(0) [ "BinarySearch" ] // should contain [ ] // should not contain - [] + [] member public this.``Literal.809979``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let value=uint64." ] @@ -1510,7 +1477,7 @@ let x = new MyClass2(0) [ ] // should contain [ "Parse" ] // should not contain - [] + [] member public this.``NameSpace.AsConstructor``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak [ "new System.DateTime()" ] @@ -1518,7 +1485,7 @@ let x = new MyClass2(0) ["System";"Array2D"] ["DaysInMonth"; "AddDays" ] // should contain top level info, no static or instance DateTime members! - [] + [] member public this.``DotAfterApplication1``() = AssertAutoCompleteContainsNoCoffeeBreak ["let g a = new System.Random()" @@ -1527,7 +1494,7 @@ let x = new MyClass2(0) ["Next"] [ ] - [] + [] member public this.``DotAfterApplication2``() = AssertAutoCompleteContainsNoCoffeeBreak ["let g a = new System.Random()" @@ -1536,7 +1503,7 @@ let x = new MyClass2(0) ["Head"] [ ] - [] + [] member public this.``Quickinfo.809979``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let value=uint64." ] @@ -1545,19 +1512,19 @@ let x = new MyClass2(0) [ "Parse" ] // should not contain /// No intellisense in comments/strings! - [] + [] member public this.``InString``() = this.VerifyCtrlSpaceCompListIsEmptyAtEndOfMarker( fileContents = """ // System.C """ , marker = "// System.C" ) - [] + [] member public this.``InComment``() = this.VerifyCtrlSpaceCompListIsEmptyAtEndOfMarker( fileContents = """ let s = "System.C" """, marker = "\"System.C") /// Intellisense at the top level (on white space) - [] + [] member public this.``Identifier.OnWhiteSpace.AtTopLevel``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["(*marker*) "] @@ -1566,7 +1533,7 @@ let x = new MyClass2(0) ["Int32"] /// Intellisense at the top level (after a partial token). All matches should be shown even if there is a unique match - [] + [] member public this.``TopLevelIdentifier.AfterPartialToken1``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let foobaz = 1" @@ -1575,7 +1542,7 @@ let x = new MyClass2(0) ["System";"Array2D";"foobaz"] ["Int32"] - [] + [] member public this.``TopLevelIdentifier.AfterPartialToken2``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let foobaz = 1" @@ -1585,7 +1552,7 @@ let x = new MyClass2(0) [] (* these issues have not been fixed yet, but when they are, here are some tests - [] + [] member public this.``AutoComplete.Bug65730``() = AssertAutoCompleteContains [ "let f x y = x.Equals(y)" ] @@ -1593,7 +1560,7 @@ let x = new MyClass2(0) [ "Equals" ] // should contain [ ] // should not contain - [] + [] member public this.``AutoComplete.Bug65731_A``() = AssertAutoCompleteContains [ @@ -1605,7 +1572,7 @@ let x = new MyClass2(0) [ "a" ] // should contain [ ] // should not contain - [] + [] member public this.``AutoComplete.Bug65731_B``() = AssertAutoCompleteContains [ @@ -1617,7 +1584,7 @@ let x = new MyClass2(0) [ "a" ] // should contain [ ] // should not contain - [] + [] member public this.``AutoComplete.Bug69654_0``() = let code = [ @" let q = @@ -1646,7 +1613,7 @@ let x = new MyClass2(0) gpatcc.AssertExactly(0,0) - [] + [] member public this.``AutoComplete.Bug69654_1``() = let code = [ "let s = async {" @@ -1685,7 +1652,7 @@ let x = new MyClass2(0) gpatcc.AssertExactly(0,0) - [] + [] member public this.``AutoComplete.Bug69654_2``() = let code = [ "let s = async {" @@ -1725,7 +1692,7 @@ let x = new MyClass2(0) gpatcc.AssertExactly(0,0) *) - [] + [] member public this.``List.AfterAddLinqNamespace.Bug3754``() = let code = ["open System.Xml.Linq" @@ -1735,7 +1702,7 @@ let x = new MyClass2(0) let completions = AutoCompleteAtCursor file AssertCompListContainsAll(completions, [ "map"; "filter" ] ) - [] + [] member public this.``Global``() = AssertAutoCompleteContainsNoCoffeeBreak ["global."] @@ -1743,7 +1710,7 @@ let x = new MyClass2(0) ["System"; "Microsoft" ] [] - [] + [] member public this.``Duplicates.Bug4103a``() = let code = [ @@ -1762,7 +1729,7 @@ let x = new MyClass2(0) AssertEqualWithMessage(2, occurrences, "The entry for 'Expr.Var' is duplicated.") /// Testing autocomplete after a dot directly following method call - [] + [] member public this.``AfterMethod.Bug2296``() = AssertAutoCompleteContainsNoCoffeeBreak [ "type System.Int32 with" @@ -1773,7 +1740,7 @@ let x = new MyClass2(0) [] /// Testing autocomplete after a dot directly following overloaded method call - [] + [] member public this.``AfterMethod.Overloaded.Bug2296``() = AssertAutoCompleteContainsNoCoffeeBreak ["type System.Boolean with" @@ -1783,7 +1750,7 @@ let x = new MyClass2(0) ["BooleanMember"] [] - [] + [] member public this.``BasicGlobalMemberList``() = AssertAutoCompleteContainsNoCoffeeBreak ["let x = 1" @@ -1792,7 +1759,7 @@ let x = new MyClass2(0) ["CompareTo"; "GetHashCode"] [] - [] + [] member public this.``CharLiteral``() = AssertAutoCompleteContainsNoCoffeeBreak ["let x = \"foo\"" @@ -1802,7 +1769,7 @@ let x = new MyClass2(0) ["CompareTo";"GetHashCode"] [] - [] + [] member public this.``GlobalMember.ListOnIdentifierEndingWithTick``() = AssertAutoCompleteContainsNoCoffeeBreak ["let x' = 1" @@ -1811,7 +1778,7 @@ let x = new MyClass2(0) ["CompareTo";"GetHashCode"] [] - [] + [] member public this.``GlobalMember.ListOnIdentifierContainingTick``() = AssertAutoCompleteContainsNoCoffeeBreak ["let x'y = 1" @@ -1820,7 +1787,7 @@ let x = new MyClass2(0) ["CompareTo";"GetHashCode"] [] - [] + [] member public this.``GlobalMember.ListWithPartialMember1``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let x = 1" @@ -1829,7 +1796,7 @@ let x = new MyClass2(0) ["CompareTo";"GetHashCode"] [] - [] + [] member public this.``GlobalMember.ListWithPartialMember2``() = AssertAutoCompleteContainsNoCoffeeBreak ["let x = 1" @@ -1839,7 +1806,7 @@ let x = new MyClass2(0) [] /// Wrong intellisense for array - [] + [] member public this.``DotOff.Parenthesized.Expr``() = AssertAutoCompleteContainsNoCoffeeBreak ["let string_of_int (x:int) = x.ToString()" @@ -1850,7 +1817,7 @@ let x = new MyClass2(0) [] /// Wrong intellisense for array - [] + [] member public this.``DotOff.ArrayIndexerNotation``() = AssertAutoCompleteContainsNoCoffeeBreak ["let string_of_int (x:int) = x.ToString()" @@ -1861,7 +1828,7 @@ let x = new MyClass2(0) [] /// Wrong intellisense for array - [] + [] member public this.``DotOff.ArraySliceNotation1``() = AssertAutoCompleteContainsNoCoffeeBreak ["let string_of_int (x:int) = x.ToString()" @@ -1873,7 +1840,7 @@ let x = new MyClass2(0) ["Length"] [] - [] + [] member public this.``DotOff.ArraySliceNotation2``() = AssertAutoCompleteContainsNoCoffeeBreak ["let string_of_int (x:int) = x.ToString()" @@ -1885,7 +1852,7 @@ let x = new MyClass2(0) ["Length"] [] - [] + [] member public this.``DotOff.ArraySliceNotation3``() = AssertAutoCompleteContainsNoCoffeeBreak ["let string_of_int (x:int) = x.ToString()" @@ -1897,7 +1864,7 @@ let x = new MyClass2(0) ["Length"] [] - [] + [] member public this.``DotOff.DictionaryIndexer``() = AssertAutoCompleteContainsNoCoffeeBreak ["let dict = new System.Collections.Generic.Dictionary()" @@ -1907,13 +1874,13 @@ let x = new MyClass2(0) [] /// intellisense on DOT - [] + [] member public this.``EmptyFile.Dot.Bug1115``() = this.VerifyAutoCompListIsEmptyAtEndOfMarker( fileContents = "." , marker = ".") - [] + [] member public this.``Identifier.NonDottedNamespace.Bug1347``() = this.AssertCtrlSpaceCompletionContains( ["open System" @@ -1926,7 +1893,7 @@ let x = new MyClass2(0) "let x = Mic", "Microsoft") - [] + [] member public this.``MatchStatement.WhenClause.Bug2519``() = AssertAutoCompleteContainsNoCoffeeBreak ["type DU = X of int" @@ -1938,7 +1905,7 @@ let x = new MyClass2(0) ["CompareTo";"GetHashCode"] [] - [] + [] member public this.``String.BeforeIncompleteModuleDefinition.Bug2385``() = AssertAutoCompleteContainsNoCoffeeBreak ["let s = \"hello\"." @@ -1947,7 +1914,7 @@ let x = new MyClass2(0) ["Substring";"GetHashCode"] [] - [] + [] member public this.``Project.FsFileWithBuildAction``() = AssertAutoCompleteContainsNoCoffeeBreak ["let i = 4" @@ -1958,7 +1925,7 @@ let x = new MyClass2(0) [] /// Dotting off a string literal should work. - [] + [] member public this.``DotOff.String``() = AssertAutoCompleteContainsNoCoffeeBreak ["\"x\". (*marker*)" @@ -1968,7 +1935,7 @@ let x = new MyClass2(0) [] /// FEATURE: Pressing dot (.) after an local variable will produce an Intellisense list of members the user may select. - [] + [] member public this.``BasicLocalMemberList``() = AssertAutoCompleteContainsNoCoffeeBreak ["let MyFunction (s:string) = " @@ -1979,7 +1946,7 @@ let x = new MyClass2(0) ["Substring";"GetHashCode"] [] - [] + [] member public this.``LocalMemberList.WithPartialMemberEntry1``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let MyFunction (s:string) = " @@ -1990,7 +1957,7 @@ let x = new MyClass2(0) ["Substring";"GetHashCode"] [] - [] + [] member public this.``LocalMemberList.WithPartialMemberEntry2``() = AssertAutoCompleteContainsNoCoffeeBreak ["let MyFunction (s:string) = " @@ -2001,8 +1968,7 @@ let x = new MyClass2(0) ["Substring";"GetHashCode"] [] - [] - [] + [] member public this.``CurriedArguments.Regression1``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2014,7 +1980,7 @@ let x = new MyClass2(0) ["fffff"] [] - [] + [] member public this.``CurriedArguments.Regression2``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2026,7 +1992,7 @@ let x = new MyClass2(0) ["fffff"] [] - [] + [] member public this.``CurriedArguments.Regression3``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2038,7 +2004,7 @@ let x = new MyClass2(0) ["ggggg"] [] - [] + [] member public this.``CurriedArguments.Regression4``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2050,7 +2016,7 @@ let x = new MyClass2(0) ["ggggg"] [] - [] + [] member public this.``CurriedArguments.Regression5``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2062,7 +2028,7 @@ let x = new MyClass2(0) ["ggggg"] [] - [] + [] member public this.``CurriedArguments.Regression6``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["let fffff x y = 1" @@ -2075,7 +2041,7 @@ let x = new MyClass2(0) [] // Test whether standard types appear in the completion list under both F# and .NET name - [] + [] member public this.``StandardTypes.Bug4403``() = AssertCtrlSpaceCompleteContainsNoCoffeeBreak ["open System"; "let x=" ] @@ -2084,7 +2050,7 @@ let x = new MyClass2(0) [ ] // Test whether standard types appear in the completion list under both F# and .NET name - [] + [] member public this.``ValueDeclarationHidden.Bug4405``() = AssertAutoCompleteContainsNoCoffeeBreak [ "do " @@ -2094,7 +2060,7 @@ let x = new MyClass2(0) ["IndexOf"; "Substring"] [ ] - [] + [] member public this.``StringFunctions``() = let code = [ @@ -2105,7 +2071,7 @@ let x = new MyClass2(0) MoveCursorToEndOfMarker(file,"String.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length > 0) + Assert.True(completions.Length > 0) for completion in completions do match completion with | CompletionItem(_,_,_,_,DeclarationType.Method) -> () @@ -2113,7 +2079,7 @@ let x = new MyClass2(0) // FEATURE: Pressing ctrl+space or ctrl+j will give a list of valid completions. - [] + [] //Verified at least "Some" is contained in the Ctrl-Space Completion list member public this.``NonDotCompletion``() = this.AssertCtrlSpaceCompletionContains( @@ -2121,10 +2087,7 @@ let x = new MyClass2(0) "x = S", "Some") - [] - [] - [] - [] + [] // This test case checks Pressing ctrl+space on the provided Type instance method shows list of valid completions member this.``TypeProvider.EditorHideMethodsAttribute.InstanceMethod.CtrlSpaceCompletionContains``() = this.AssertCtrlSpaceCompletionContains( @@ -2135,10 +2098,7 @@ let x = new MyClass2(0) expected = "IM1", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] // This test case checks Pressing ctrl+space on the provided Type Event shows list of valid completions member this.``TypeProvider.EditorHideMethodsAttribute.Event.CtrlSpaceCompletionContains``() = this.AssertCtrlSpaceCompletionContains( @@ -2149,9 +2109,7 @@ let x = new MyClass2(0) expected = "Event1", addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] - [] - [] + [] // This test case checks Pressing ctrl+space on the provided Type static parameter and verify "int" is in the list just to make sure bad things don't happen and autocomplete window pops up member this.``TypeProvider.EditorHideMethodsAttribute.Type.CtrlSpaceCompletionContains``() = this.AssertCtrlSpaceCompletionContains( @@ -2163,7 +2121,7 @@ let x = new MyClass2(0) // In this bug, pressing dot after this was producing an invalid member list. - [] + [] member public this.``Class.Self.Bug1544``() = this.VerifyAutoCompListIsEmptyAtEndOfMarker( fileContents = " @@ -2172,14 +2130,14 @@ let x = new MyClass2(0) marker = "this.") // No completion list at the end of file. - [] + [] member public this.``Identifier.AfterDefined.Bug1545``() = this.AutoCompletionListNotEmpty ["let x = [|\"hello\"|]" "x."] "x." - [] + [] member public this.``Bug243082.DotAfterNewBreaksCompletion`` () = this.AutoCompletionListNotEmpty [ @@ -2190,7 +2148,7 @@ let x = new MyClass2(0) "let z = new A."] "s." - [] + [] member public this.``Bug243082.DotAfterNewBreaksCompletion2`` () = this.AutoCompletionListNotEmpty [ @@ -2199,9 +2157,7 @@ let x = new MyClass2(0) "new System."] "s." - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest0``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2211,9 +2167,7 @@ let x = new MyClass2(0) list = ["sin"], addtlRefAssy=standard40AssemblyRefs ) - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest0b``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2223,9 +2177,7 @@ let x = new MyClass2(0) list = ["query"], addtlRefAssy=standard40AssemblyRefs ) - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest1``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2235,9 +2187,7 @@ let x = new MyClass2(0) list = ["select"], addtlRefAssy=standard40AssemblyRefs ) - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest1b``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2249,9 +2199,7 @@ let x = new MyClass2(0) - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest2``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2262,9 +2210,7 @@ let x = new MyClass2(0) addtlRefAssy=standard40AssemblyRefs ) - [] - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest3``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2275,8 +2221,7 @@ let x = new MyClass2(0) addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest3b``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2288,8 +2233,7 @@ let x = new MyClass2(0) - [] - [] + [] member this.``QueryExpression.CtrlSpaceSmokeTest3c``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2300,8 +2244,7 @@ let x = new MyClass2(0) addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member this.``AsyncExpression.CtrlSpaceSmokeTest3d``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -2349,11 +2292,8 @@ let x = new MyClass2(0) let y = x + 1 (*TYPING*)""" ] - [] + [] /// This is the case where at (*TYPING*) we first type 1...N-1 characters of the target custom operation and then invoke the completion list, and we check that the completion list contains the custom operation - [] - [] - [] member this.``QueryExpression.CtrlSpaceSystematic1``() = let rec strictPrefixes (s:string) = seq { if s.Length > 1 then let s = s.[0..s.Length-2] in yield s; yield! strictPrefixes s} for customOperation in ["select";"skip";"contains";"groupJoin"] do @@ -2433,10 +2373,7 @@ let x = new MyClass2(0) if failures.Count <> 0 || unexpectedSuccesses.Count <> 0 then raise <| new Exception("there were unexpected results, see console output for details") - [] - [] - [] - [] + [] member this.``QueryExpressions.QueryAndSequenceExpressionWithForYieldLoopSystematic``() = let prefix = """ @@ -2494,9 +2431,7 @@ let aaaaaa = [| "1" |] this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, ["seq";"query"], knownFailures) - [] - [] - [] + [] /// Incrementally enter a seq{ .. while ...} loop and check for availability of intellisense etc. member this.``SequenceExpressions.SequenceExprWithWhileLoopSystematic``() = @@ -2535,10 +2470,7 @@ let aaaaaa = 0 this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, [""], knownFailures) - [] - [] - [] - [] + [] /// Incrementally enter query with a 'join' and check for availability of quick info, auto completion and dot completion member this.``QueryAndOtherExpressions.WordByWordSystematicJoinQueryOnSingleLine``() = @@ -2589,11 +2521,8 @@ let aaaaaa = 0 this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, [""], knownFailures) - [] + [] /// This is a sanity check that the multiple-line case is much the same as the single-line case - [] - [] - [] member this.``QueryAndOtherExpressions.WordByWordSystematicJoinQueryOnMultipleLine``() = let prefix = """ @@ -2739,8 +2668,7 @@ let x = query { for bbbb in abbbbc(*D0*) do this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, [""], knownFailures) - [] - [] + [] /// This is the case where (*TYPING*) nothing has been typed yet and we invoke the completion list /// This is a known failure right now for some of the example files above. member this.``QueryExpression.CtrlSpaceSystematic2``() = @@ -2767,14 +2695,14 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = time1 CtrlSpaceCompleteAtCursor file "Time of first autocomplete." AssertCompListContainsAll(completions, expected) - [] + [] member public this.``Parameter.CommonCase.Bug2884``() = this.AutoCompleteRecoveryTest ([ "type T1(aaa1) =" " do (" ], "do (", [ "aaa1" ]) - [] + [] member public this.``Parameter.SubsequentLet.Bug2884``() = this.AutoCompleteRecoveryTest ([ @@ -2782,7 +2710,7 @@ let x = query { for bbbb in abbbbc(*D0*) do " do (" "let a = 0" ], "do (", [ "aaa1" ]) - [] + [] member public this.``Parameter.SubsequentMember.Bug2884``() = this.AutoCompleteRecoveryTest ([ @@ -2791,7 +2719,7 @@ let x = query { for bbbb in abbbbc(*D0*) do " do (" " member x.Bar = 0" ], "do (", [ "aaa1"; "aaa2" ]) - [] + [] member public this.``Parameter.System.DateTime.Bug2884``() = this.AutoCompleteRecoveryTest ([ @@ -2799,7 +2727,7 @@ let x = query { for bbbb in abbbbc(*D0*) do " member x.Foo(aaa2) = " " let dt = new System.DateTime(" ], "Time(", [ "aaa1"; "aaa2" ]) - [] + [] member public this.``Parameter.DirectAfterDefined.Bug2884``() = this.AutoCompleteRecoveryTest ([ @@ -2807,21 +2735,21 @@ let x = query { for bbbb in abbbbc(*D0*) do " let aaa1 = 0" " (" ], "(", [ "aaa1" ]) - [] + [] member public this.``NotShowInfo.LetBinding.Bug3602``() = this.VerifyAutoCompListIsEmptyAtEndOfMarker( fileContents = "let s. = \"Hello world\" ()", marker = "let s.") - [] + [] member public this.``NotShowInfo.FunctionParameter.Bug3602``() = this.VerifyAutoCompListIsEmptyAtEndOfMarker( fileContents = "let foo s. = s + \"Hello world\" ()", marker = "let foo s.") - [] + [] member public this.``NotShowInfo.ClassMemberDeclA.Bug3602``() = this.TestCompletionNotShowingWhenFastUpdate [ @@ -2837,7 +2765,7 @@ let x = query { for bbbb in abbbbc(*D0*) do "(*marker*) this." // Another test case for the same thing - this goes through a different code path - [] + [] member public this.``NotShowInfo.ClassMemberDeclB.Bug3602``() = this.TestCompletionNotShowingWhenFastUpdate [ @@ -2852,7 +2780,7 @@ let x = query { for bbbb in abbbbc(*D0*) do "()" ] "marker$" - [] + [] member public this.``ComputationExpression.LetBang``() = AssertAutoCompleteContainsNoCoffeeBreak ["let http(url:string) = " @@ -2884,19 +2812,19 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListContainsAll(completions, expected) gpatcc.AssertExactly(0,0) - [] + [] member public this.``Generics.Typeof``() = this.TestGenericAutoComplete ("let _ = typeof.", [ "Assembly"; "AssemblyQualifiedName"; (* ... *) ]) - [] + [] member public this.``Generics.NonGenericTypeMembers``() = this.TestGenericAutoComplete ("let _ = GT2.", [ "R"; "S" ]) - [] + [] member public this.``Generics.GenericTypeMembers``() = this.TestGenericAutoComplete ("let _ = GT.", [ "P"; "Q" ]) - //[] // keep disabled unless trying to prove that UnhandledExceptionHandler is working + //[] // keep disabled unless trying to prove that UnhandledExceptionHandler is working member public this.EnsureThatUnhandledExceptionsCauseAnAssert() = // Do something that causes LanguageService to load AssertAutoCompleteContains @@ -2913,7 +2841,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t.Start() System.Threading.Thread.Sleep(1000) - [] + [] member public this.``DotBetweenParens.Bug175360.Case1``() = AssertAutoCompleteContains [ @@ -2923,7 +2851,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "ToDecimal" ] // should contain [] // should not contain - [] + [] member public this.``DotBetweenParens.Bug175360.Case2``() = AssertAutoCompleteContains [ "[| 1 |].(0)" ] @@ -2931,8 +2859,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Clone" ] // should contain [] // should not contain - [] - [] + [] member public this.``GenericType.Self.Bug69673_1.01``() = AssertCtrlSpaceCompleteContains ["type Base(o:obj) = class end" @@ -2945,7 +2872,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["this"] [] - [] + [] member public this.``GenericType.Self.Bug69673_1.02``() = AssertCtrlSpaceCompleteContains ["type Base(o:obj) = class end" @@ -2958,7 +2885,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["this"] [] - [] + [] member public this.``GenericType.Self.Bug69673_1.03``() = AssertCtrlSpaceCompleteContains ["type Base(o:obj) = class end" @@ -2971,7 +2898,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["this"] [] - [] + [] member public this.``GenericType.Self.Bug69673_1.04``() = AssertAutoCompleteContains ["type Base(o:obj) = class end" @@ -2984,8 +2911,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["Bar"] [] - [] - [] + [] member public this.``GenericType.Self.Bug69673_2.1``() = AssertAutoCompleteContains ["type Base(o:obj) = class end" @@ -2999,8 +2925,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["this"] [] - [] - [] + [] member public this.``GenericType.Self.Bug69673_2.2``() = AssertAutoCompleteContains ["type Base(o:obj) = class end" @@ -3014,7 +2939,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["this"] [] - [] + [] member public this.``UnitMeasure.Bug78932_1``() = AssertAutoCompleteContains [ @" @@ -3027,7 +2952,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Kg" ] // should contain [ ] // should not contain - [] + [] member public this.``UnitMeasure.Bug78932_2``() = // Note: in this case, pressing '.' does not automatically pop up a completion list in VS, but ctrl-space does get the right list // This is just like how @@ -3044,7 +2969,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Kg" ] // should contain [ ] // should not contain - [] + [] member public this.``Array.AfterOperator...Bug65732_A``() = AssertAutoCompleteContains [ "let r = [1 .. System.Int32.MaxValue]" ] @@ -3052,7 +2977,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Int32" ] // should contain [ "abs" ] // should not contain (from top level) - [] + [] member public this.``Array.AfterOperator...Bug65732_B``() = AssertCtrlSpaceCompleteContains [ "let r = [System.Int32.MaxValue..42]" ] @@ -3060,7 +2985,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "abs" ] // should contain (top level) [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Array.AfterOperator...Bug65732_B2``() = AssertCtrlSpaceCompleteContains [ "let r = [System.Int32.MaxValue.. 42]" ] @@ -3068,7 +2993,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "abs" ] // should contain (top level) [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Array.AfterOperator...Bug65732_B3``() = AssertCtrlSpaceCompleteContains [ "let r = [System.Int32.MaxValue .. 42]" ] @@ -3076,7 +3001,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "abs" ] // should contain (top level) [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Array.AfterOperator...Bug65732_C``() = AssertCtrlSpaceCompleteContains [ "let r = [System.Int32.MaxValue..]" ] @@ -3084,7 +3009,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "abs" ] // should contain (top level) [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Array.AfterOperator...Bug65732_D``() = AssertCtrlSpaceCompleteContains [ "let r = [System.Int32.MaxValue .. ]" ] @@ -3094,7 +3019,7 @@ let x = query { for bbbb in abbbbc(*D0*) do // Verify the auto completion after the close-parentheses, // there should be auto completion - [] + [] member public this.``Array.AfterParentheses.Bug175360``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let a = 10." @@ -3103,7 +3028,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "ToDecimal" ] // should contain (top level) [ ] // should not contain - [] + [] member public this.``Identifier.FuzzyDefined.Bug67133``() = AssertAutoCompleteContainsNoCoffeeBreak [ "let gDateTime (arr: System.DateTime[]) =" @@ -3112,7 +3037,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["AddDays"] [] - [] + [] member public this.``Identifier.FuzzyDefined.Bug67133.Negative``() = let code = [ "let gDateTime (arr: DateTime[]) =" // Note: no 'open System', so DateTime is unknown " arr.[0]." ] @@ -3124,7 +3049,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListContainsExactly(completions, []) // we don't want any completions on . when has unknown type due to errors // (In particular, we don't want the "didn't find any completions, so just show top-level entities like 'abs' here" logic to kick in.) - [] + [] member public this.``Class.Property.Bug69150_A``() = AssertCtrlSpaceCompleteContains [ "type ClassType(x : int) =" @@ -3134,7 +3059,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Value" ] // should contain [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Class.Property.Bug69150_B``() = AssertCtrlSpaceCompleteContains [ "type ClassType(x : int) =" @@ -3144,7 +3069,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Value" ] // should contain [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Class.Property.Bug69150_C``() = AssertCtrlSpaceCompleteContains [ "type ClassType(x : int) =" @@ -3155,7 +3080,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Value" ] // should contain [ "CompareTo" ] // should not contain (from Int32) - [] + [] member public this.``Class.Property.Bug69150_D``() = AssertCtrlSpaceCompleteContains [ "type ClassType(x : int) =" @@ -3165,7 +3090,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Value" ] // should contain [ "VolatileFieldAttribute" ] // should not contain (from top-level) - [] + [] member public this.``Class.Property.Bug69150_E``() = AssertCtrlSpaceCompleteContains [ "type ClassType(x : int) =" @@ -3175,7 +3100,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Value" ] // should contain [ "VolatileFieldAttribute" ] // should not contain (from top-level) - [] + [] member public this.``AssignmentToProperty.Bug231283``() = AssertCtrlSpaceCompleteContains [""" @@ -3190,7 +3115,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "AbstractClassAttribute" ] // top-level completions [ "Bar" ] // not stuff from the lhs of assignment - [] + [] member public this.``Dot.AfterOperator.Bug69159``() = AssertAutoCompleteContains [ "let x1 = [|0..1..10|]." ] @@ -3198,7 +3123,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Length" ] // should contain (array) [ "abs" ] // should not contain (top-level) - [] + [] member public this.``Residues1``() = AssertCtrlSpaceCompleteContains [ "System . Int32 . M" ] @@ -3206,7 +3131,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "MaxValue"; "MinValue" ] // should contain [ "MailboxProcessor"; "Map" ] // should not contain (top-level) - [] + [] member public this.``Residues2``() = AssertCtrlSpaceCompleteContains [ "let x = 42" @@ -3215,7 +3140,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // should contain (Int32) [ "CLIEventAttribute"; "Checked"; "Choice" ] // should not contain (top-level) - [] + [] member public this.``Residues3``() = AssertCtrlSpaceCompleteContains [ "let x = 42" @@ -3224,7 +3149,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // should contain (Int32) [ "CLIEventAttribute"; "Checked"; "Choice" ] // should not contain (top-level) - [] + [] member public this.``Residues4``() = AssertCtrlSpaceCompleteContains [ "let x = 42" @@ -3233,7 +3158,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // should contain (Int32) [ "CLIEventAttribute"; "Checked"; "Choice" ] // should not contain (top-level) - [] + [] member public this.``CtrlSpaceInWhiteSpace.Bug133112``() = AssertCtrlSpaceCompleteContains [ """ @@ -3246,7 +3171,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "AbstractClassAttribute" ] // should contain (top-level) [ "A"; "B" ] // should not contain (Foo) - [] + [] member public this.``Residues5``() = AssertCtrlSpaceCompleteContains [ "let x = 42" @@ -3254,7 +3179,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ". " // marker [ "CompareTo" ] // should contain (Int32) [ "CLIEventAttribute"; "Checked"; "Choice" ] // should not contain (top-level) - [] + [] member public this.``CompletionInDifferentEnvs1``() = AssertCtrlSpaceCompleteContains ["let f1 num =" @@ -3265,7 +3190,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["completeword"] // should contain [""] - [] + [] member public this.``CompletionInDifferentEnvs2``() = AssertCtrlSpaceCompleteContains ["let aaa = 1" @@ -3276,7 +3201,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["aaa"; "aab"] ["aac"] - [] + [] member public this.``CompletionInDifferentEnvs3``() = AssertCtrlSpaceCompleteContains ["let mb1 = new MailboxProcessor>(fun inbox -> async { let! msg = inbox.Receive()" @@ -3285,7 +3210,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["msg"] [] - [] + [] member public this.``CompletionInDifferentEnvs4``() = AssertCtrlSpaceCompleteContains ["async {" @@ -3305,7 +3230,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["b"] ["i"] - [] + [] member public this.``CompletionForAndBang_BaseLine0``() = AssertCtrlSpaceCompleteContains ["type Builder() =" @@ -3320,7 +3245,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx3"] [] - [] + [] member public this.``CompletionForAndBang_BaseLine1``() = AssertCtrlSpaceCompleteContains ["type Builder() =" @@ -3337,7 +3262,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx1"; "xxx2"; "xxx3"] [] - [] + [] member public this.``CompletionForAndBang_BaseLine2``() = /// Without closing '}' AssertCtrlSpaceCompleteContains @@ -3354,7 +3279,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["yyy1"; "yyy2"; "yyy3"] [] - [] + [] member public this.``CompletionForAndBang_BaseLine3``() = /// Without closing ')' AssertCtrlSpaceCompleteContains @@ -3371,7 +3296,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["zzz1"; "zzz2"; "zzz3"] [] - [] + [] member public this.``CompletionForAndBang_BaseLine4``() = AssertCtrlSpaceCompleteContains ["type Builder() =" @@ -3386,7 +3311,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["zzz1"; "zzz3"] [] - [] + [] member public this.``CompletionForAndBang_Test_MergeSources_Bind_Return0``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3404,7 +3329,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx3"; "xxx4"] [] - [] + [] member public this.``CompletionForAndBang_Test_MergeSources_Bind_Return1``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3424,7 +3349,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx1"; "xxx2"; "xxx3"; "xxx4"] [] - [] + [] member public this.``CompletionForAndBang_Test_MergeSources_Bind_Return2``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3443,7 +3368,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["yyy1"; "yyy2"; "yyy3"; "yyy4"] [] - [] + [] member public this.``CompletionForAndBang_Test_MergeSources_Bind_Return3``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3462,7 +3387,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["zzz1"; "zzz2"; "zzz3"; "zzz4"] [] - [] + [] member public this.``CompletionForAndBang_Test_MergeSources_Bind_Return4``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3480,7 +3405,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["zzz1"; "zzz3"; "zzz4"] [] - [] + [] member public this.``CompletionForAndBang_Test_Bind2Return0``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3496,7 +3421,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx3"; "xxx4"] [] - [] + [] member public this.``CompletionForAndBang_Test_Bind2Return1``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3514,7 +3439,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["xxx1"; "xxx2"; "xxx3"; "xxx4"] [] - [] + [] member public this.``CompletionForAndBang_Test_Bind2Return2``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3531,7 +3456,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["yyy1"; "yyy2"; "yyy3"; "yyy4"] [] - [] + [] member public this.``CompletionForAndBang_Test_Bind2Return3``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3548,7 +3473,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["zzz1"; "zzz2"; "zzz3"; "zzz4"] [] - [] + [] member public this.``CompletionForAndBang_Test_Bind2Return4``() = AssertCtrlSpaceCompleteContainsWithOtherFlags "/langversion:preview" @@ -3565,7 +3490,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] (**) - [] + [] member public this.``Bug229433.AfterMismatchedParensCauseWeirdParseTreeAndExceptionDuringTypecheck``() = AssertAutoCompleteContains [ """ type T() = @@ -3588,7 +3513,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Bar"; "X" ] [] - [] + [] member public this.``Bug130733.LongIdSet.CtrlSpace``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3600,7 +3525,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.LongIdSet.Dot``() = AssertAutoCompleteContains [ """ type C() = @@ -3612,7 +3537,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.ExprDotSet.CtrlSpace``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3624,7 +3549,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.ExprDotSet.Dot``() = AssertAutoCompleteContains [ """ type C() = @@ -3637,7 +3562,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] - [] + [] member public this.``Bug130733.Nested.LongIdSet.CtrlSpace``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3650,7 +3575,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.Nested.LongIdSet.Dot``() = AssertAutoCompleteContains [ """ type C() = @@ -3663,7 +3588,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.Nested.ExprDotSet.CtrlSpace``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3676,7 +3601,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.Nested.ExprDotSet.Dot``() = AssertAutoCompleteContains [ """ type C() = @@ -3689,7 +3614,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug130733.NamedIndexedPropertyGet.Dot``() = AssertAutoCompleteContains [ """ let str = "foo" @@ -3698,7 +3623,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // char [] - [] + [] member public this.``Bug130733.NamedIndexedPropertyGet.CtrlSpace``() = AssertCtrlSpaceCompleteContains [ """ let str = "foo" @@ -3707,7 +3632,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // char [] - [] + [] member public this.``Bug230533.NamedIndexedPropertySet.CtrlSpace.Case1``() = AssertCtrlSpaceCompleteContains [ """ type Foo() = @@ -3721,7 +3646,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "MutableInstanceIndexer" ] [] - [] + [] member public this.``Bug230533.NamedIndexedPropertySet.CtrlSpace.Case2``() = AssertCtrlSpaceCompleteContains [ """ type Foo() = @@ -3737,7 +3662,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "MutableInstanceIndexer" ] [] - [] + [] member public this.``Bug230533.ExprDotSet.CtrlSpace.Case1``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3750,7 +3675,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Bug230533.ExprDotSet.CtrlSpace.Case2``() = AssertCtrlSpaceCompleteContains [ """ type C() = @@ -3763,21 +3688,21 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "XX" ] [] - [] + [] member public this.``Attribute.WhenAttachedToLet.Bug70080``() = this.AutoCompleteBug70080Helper @" open System [] + [] member public this.``Attribute.WhenAttachedToType.Bug70080``() = this.AutoCompleteBug70080Helper(@" open System [] + [] member public this.``Attribute.WhenAttachedToLetInNamespace.Bug70080``() = this.AutoCompleteBug70080Helper @" namespace Foo @@ -3785,7 +3710,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] + [] member public this.``Attribute.WhenAttachedToTypeInNamespace.Bug70080``() = this.AutoCompleteBug70080Helper(@" namespace Foo @@ -3793,7 +3718,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] + [] member public this.``Attribute.WhenAttachedToNothingInNamespace.Bug70080``() = this.AutoCompleteBug70080Helper(@" namespace Foo @@ -3801,7 +3726,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] + [] member public this.``Attribute.WhenAttachedToModuleInNamespace.Bug70080``() = this.AutoCompleteBug70080Helper(@" namespace Foo @@ -3810,7 +3735,7 @@ let x = query { for bbbb in abbbbc(*D0*) do module Foo = let x = 42") - [] + [] member public this.``Attribute.WhenAttachedToModule.Bug70080``() = this.AutoCompleteBug70080Helper(@" open System @@ -3818,7 +3743,7 @@ let x = query { for bbbb in abbbbc(*D0*) do module Foo = let x = 42") - [] + [] member public this.``Identifer.InMatchStatement.Bug72595``() = // in this bug, "match blah with let" caused the lexfilter to go awry, which made things hopeless for the parser, yielding no parse tree and thus no intellisense AssertAutoCompleteContains @@ -3842,7 +3767,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Chars" ] // should contain [ ] // should not contain - [] + [] member public this.``HandleInlineComments1``() = AssertAutoCompleteContains [ "let rrr = System (* boo! *) . Int32 . MaxValue" ] @@ -3850,7 +3775,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Int32"] [ "abs" ] // should not contain (top-level) - [] + [] member public this.``HandleInlineComments2``() = AssertAutoCompleteContains [ "let rrr = System (* boo! *) . Int32 . MaxValue" ] @@ -3858,7 +3783,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "MaxValue" ] // should contain [ "abs" ] // should not contain (top-level) - [] + [] member public this.``OpenNamespaceOrModule.CompletionOnlyContainsNamespaceOrModule.Case1``() = AssertAutoCompleteContains [ "open System." ] @@ -3866,7 +3791,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Collections" ] // should contain (namespace) [ ] // should not contain - [] + [] member public this.``OpenNamespaceOrModule.CompletionOnlyContainsNamespaceOrModule.Case2``() = AssertAutoCompleteContains [ "open Microsoft.FSharp.Collections.Array." ] @@ -3874,7 +3799,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Parallel" ] // should contain (module) [ "map" ] // should not contain (let-bound value) - [] + [] member public this.``BY_DESIGN.CommonScenarioThatBegsTheQuestion.Bug73940``() = AssertAutoCompleteContains [ @" @@ -3887,7 +3812,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ ] // should contain (ideally would be string) [ "Chars" ] // should not contain (documenting the undesirable behavior, that this does not show up) - [] + [] member public this.``BY_DESIGN.ExplicitlyCloseTheParens.Bug73940``() = AssertAutoCompleteContains [ @" @@ -3903,7 +3828,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Chars" ] // should contain (string) [ ] // should not contain - [] + [] member public this.``BY_DESIGN.MismatchedParenthesesAreHardToRecoverFromAndHereIsWhy.Bug73940``() = AssertAutoCompleteContains [ @" @@ -3920,7 +3845,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Chars" ] // should not contain (string) (* - [] + [] member public this.``AutoComplete.Bug72596_A``() = AssertAutoCompleteContains [ "type ClassType() =" @@ -3930,7 +3855,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "foo" ] // should not contain - [] + [] member public this.``AutoComplete.Bug72596_B``() = AssertAutoCompleteContains [ "let f() =" @@ -3940,7 +3865,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "foo" ] // should not contain *) - [] + [] member public this.``Expression.MultiLine.Bug66705``() = AssertAutoCompleteContains [ "let x = 4" @@ -3950,7 +3875,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "ToString" ] // should contain [ ] // should not contain - [] + [] member public this.``Expressions.Computation``() = AssertAutoCompleteContains [ @@ -3962,7 +3887,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Next" ] // should contain [ "GetEnumerator" ] // should not contain - [] + [] member public this.``Identifier.DefineByVal.InFsiFile.Bug882304_1``() = AutoCompleteInInterfaceFileContains [ @@ -3974,7 +3899,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ ] // should contain [ "Equals" ] // should not contain - [] + [] member public this.``NameSpace.InFsiFile.Bug882304_2``() = AutoCompleteInInterfaceFileContains [ @@ -3989,7 +3914,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ] // should contain [ ] // should not contain - [] + [] member public this.``CLIEvents.DefinedInAssemblies.Bug787438``() = AssertAutoCompleteContains [ "let mb = new MailboxProcessor(fun _ -> ())" @@ -3998,7 +3923,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Error" ] // should contain [ "add_Error"; "remove_Error" ] // should not contain - [] + [] member public this.CLIEventsWithByRefArgs() = AssertAutoCompleteContains [ "type MyDelegate = delegate of obj * string byref -> unit" @@ -4009,7 +3934,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "add_myEvent"; "remove_myEvent" ] // should contain [ "myEvent" ] // should not contain - [] + [] member public this.``Identifier.AfterParenthesis.Bug835276``() = AssertAutoCompleteContains [ "let f ( s : string ) =" @@ -4021,7 +3946,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Length" ] // should contain [ ] // should not contain - [] + [] member public this.``Identifier.AfterParenthesis.Bug6484_1``() = AssertAutoCompleteContains [ "for x in 1..10 do" @@ -4030,7 +3955,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // should contain (a method on the 'int' type) [ ] // should not contain - [] + [] member public this.``Identifier.AfterParenthesis.Bug6484_2``() = AssertAutoCompleteContains [ "for x = 1 to 10 do" @@ -4039,7 +3964,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "CompareTo" ] // should contain (a method on the 'int' type) [ ] // should not contain - [] + [] member public this.``Type.Indexers.Bug4898_1``() = AssertAutoCompleteContains [ @@ -4052,7 +3977,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "ToString" ] // should contain [ "Value" ] // should not contain - [] + [] member public this.``Type.Indexers.Bug4898_2``() = AssertAutoCompleteContains [ @@ -4070,7 +3995,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "ToString" ] // should contain [ "Chars" ] // should not contain - [] + [] member public this.``Expressions.Sequence``() = AssertAutoCompleteContains [ @@ -4079,7 +4004,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "GetEnumerator" ] // should contain [ ] // should not contain - [] + [] member public this.``LambdaExpression.WithoutClosing.Bug1346``() = AssertAutoCompleteContains [ @@ -4093,7 +4018,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Length" ] // should contain [ ] // should not contain - [] + [] member public this.``LambdaExpression.WithoutClosing.Bug1346c``() = AssertAutoCompleteContains [ @@ -4107,7 +4032,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Length" ] // should contain [ ] // should not contain - [] + [] member public this.``LambdaExpression.WithoutClosing.Bug1346b``() = AssertAutoCompleteContains [ @@ -4122,7 +4047,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Length" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.If_A``() = AssertAutoCompleteContains [ @@ -4132,7 +4057,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.If_C``() = AssertAutoCompleteContains [ @@ -4143,7 +4068,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Try_A``() = AssertAutoCompleteContains [ @@ -4153,7 +4078,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Try_B``() = AssertAutoCompleteContains [ @@ -4163,7 +4088,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Try_C``() = AssertAutoCompleteContains [ @@ -4173,7 +4098,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Try_D``() = AssertAutoCompleteContains [ @@ -4184,7 +4109,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Match_A``() = AssertAutoCompleteContains [ @@ -4194,7 +4119,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteStatement.Match_C``() = AssertAutoCompleteContains [ @@ -4205,7 +4130,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [ "Contains" ] // should contain [ ] // should not contain - [] + [] member public this.``IncompleteIfClause.Bug4594``() = AssertCtrlSpaceCompleteContains [ "let Bar(xyz) ="; @@ -4219,7 +4144,7 @@ let x = query { for bbbb in abbbbc(*D0*) do (* dot completions on them *) // Obsolete and CompilerMessage(IsError=true) should not appear. - [] + [] member public this.``ObsoleteAndOCamlCompatDontAppear``() = let code= [ @@ -4287,28 +4212,28 @@ let x = query { for bbbb in abbbbc(*D0*) do // When the module isn't empty, we should show completion for the module // (and not type-inference based completion on strings - therefore test for 'Chars') - [] + [] member public this.``Obsolete.TopLevelModule``() = this.AutoCompleteObsoleteTest "level <- O" false [ "None" ] [ "ObsoleteTop"; "Chars" ] - [] + [] member public this.``Obsolete.NestedTypeOrModule``() = this.AutoCompleteObsoleteTest "level <- Module" true [ "Other" ] [ "ObsoleteM"; "ObsoleteT"; "Chars" ] - [] + [] member public this.``Obsolete.CompletionOnObsoleteModule.Bug3992``() = this.AutoCompleteObsoleteTest "level <- Module.ObsoleteM" true [ "A" ] [ "ObsoleteNested"; "Chars" ] - [] + [] member public this.``Obsolete.DoubleNested``() = this.AutoCompleteObsoleteTest "level <- Module.ObsoleteM.ObsoleteNested" true [ "C" ] [ "Chars" ] - [] + [] member public this.``Obsolete.CompletionOnObsoleteType``() = this.AutoCompleteObsoleteTest "level <- Module.ObsoleteT" true [ "B" ] [ "Chars" ] /// BUG: Referencing a nonexistent DLL caused an assert. - [] + [] member public this.``WithNonExistentDll``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4365,7 +4290,7 @@ let x = query { for bbbb in abbbbc(*D0*) do // This is some tag in the tooltip that also contains the overload name text if descr.Contains("[Signature:") then occurrences - 1 else occurrences - [] + [] member public this.``Duplicates.Bug4103b``() = for args in [ "Test.", "foo", "foo"; @@ -4378,7 +4303,7 @@ let x = query { for bbbb in abbbbc(*D0*) do "TestType.", "Event", "TestType.Event" ] do this.AutoCompleteDuplicatesTest args - [] + [] member public this.``Duplicates.Bug4103c``() = let code = [ @@ -4394,7 +4319,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let occurrences = this.CountMethodOccurrences(descrFunc(), "File.Open") AssertEqualWithMessage(3, occurrences, "Found wrong number of overloads for 'File.Open'.") - [] + [] member public this.``Duplicates.Bug2094``() = let code = [ @@ -4409,7 +4334,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let occurrences = this.CountMethodOccurrences(descrFunc(), "Start") AssertEqualWithMessage(2, occurrences, sprintf "Found wrong number of overloads for 'MailboxProcessor.Start'. Found %A." completions) - [] + [] member public this.``WithinMatchClause.Bug1603``() = let code = [ @@ -4424,11 +4349,11 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"let y = xx.") let completions = AutoCompleteAtCursor file // Should contain something - Assert.AreNotEqual(0,completions.Length) - Assert.IsTrue(completions |> Array.exists (fun (CompletionItem(name,_,_,_,_)) -> name.Contains("AddMilliseconds"))) + Assert.NotEqual(0,completions.Length) + Assert.True(completions |> Array.exists (fun (CompletionItem(name,_,_,_,_)) -> name.Contains("AddMilliseconds"))) // FEATURE: Saving file N does not cause files 1 to N-1 to re-typecheck (but does cause files N to to - [] + [] member public this.``Performance.Bug5774``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4462,8 +4387,7 @@ let x = query { for bbbb in abbbbc(*D0*) do gpatcc.AssertExactly(notAA[file2], notAA[file2;file3]) /// FEATURE: References added to the project bring corresponding new .NET and F# items into scope. - [] - [] + [] member public this.``AfterAssemblyReferenceAdded``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4476,18 +4400,17 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.Deployment.Application.") let completions = AutoCompleteAtCursor(file) // printf "Completions=%A\n" completions - Assert.AreEqual(0, completions.Length) // Expect none here because reference hasn't been added. + Assert.Equal(0, completions.Length) // Expect none here because reference hasn't been added. // Now, add a reference to the given assembly. this.AddAssemblyReference(project,"System.Deployment") TakeCoffeeBreak(this.VS) let completions = AutoCompleteAtCursor(file) - Assert.AreNotEqual(0, completions.Length, "Expected some items in the list after adding a reference.") + Assert.NotEqual(0, completions.Length) /// FEATURE: Updating the active project configuration influences the language service - [] - [] + [] member public this.``AfterUpdateProjectConfiguration``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4505,17 +4428,16 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.Deployment.Application.") let completions = AutoCompleteAtCursor(file) // printf "Completions=%A\n" completions - Assert.AreEqual(0, completions.Length) // Expect none here because reference hasn't been added. + Assert.Equal(0, completions.Length) // Expect none here because reference hasn't been added. // Now, update active configuration SetConfigurationAndPlatform(project, "Foo|x86") TakeCoffeeBreak(this.VS) let completions = AutoCompleteAtCursor(file) - Assert.AreNotEqual(0, completions.Length, "Expected some items in the list after updating configuration.") + Assert.NotEqual(0, completions.Length) /// FEATURE: Updating the active project platform influences the language service - [] - [] + [] member public this.``AfterUpdateProjectPlatform``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4534,16 +4456,16 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.Deployment.Application.") let completions = AutoCompleteAtCursor(file) // printf "Completions=%A\n" completions - Assert.AreEqual(0, completions.Length) // Expect none here because reference hasn't been added. + Assert.Equal(0, completions.Length) // Expect none here because reference hasn't been added. // Now, update active platform SetConfigurationAndPlatform(project, "Debug|x86") let completions = AutoCompleteAtCursor(file) - Assert.AreNotEqual(0, completions.Length, "Expected some items in the list after updating platform.") + Assert.NotEqual(0, completions.Length) (* /// FEATURE: The fileName on disk and the fileName in the project can differ in case. - [] + [] member this.``Filenames.MayBeDifferentlyCased``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4556,16 +4478,16 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.Deployment.Application.") let completions = AutoCompleteAtCursor(file) // printf "Completions=%A\n" completions - Assert.AreEqual(0, completions.Length) // Expect none here because reference hasn't been added. + Assert.Equal(0, completions.Length) // Expect none here because reference hasn't been added. // Now, add a reference to the given assembly. this.AddAssemblyReference(project,"System.Deployment") let completions = AutoCompleteAtCursor(file) - Assert.AreNotEqual(0, completions.Length, "Expected some items in the list after adding a reference.") + Assert.NotEqual(0, completions.Length, "Expected some items in the list after adding a reference.") *) /// In this bug, a bogus flag caused the rest of flag parsing to be ignored. - [] + [] member public this.``FlagsAndSettings.Bug1969``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -4580,30 +4502,29 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.Deployment.Application.") let completions = AutoCompleteAtCursor(file) // printf "Completions=%A\n" completions - Assert.AreEqual(0, completions.Length) // Expect none here because reference hasn't been added. + Assert.Equal(0, completions.Length) // Expect none here because reference hasn't been added. // Add an unknown flag followed by the reference to our assembly. let deploymentAssembly = sprintf @"%s\Microsoft.NET\Framework\v4.0.30319\System.Deployment.dll" (System.Environment.GetEnvironmentVariable("windir")) SetOtherFlags(project,"--doo-da -r:" + deploymentAssembly) let completions = AutoCompleteAtCursor(file) // Now, make sure the reference added after the erroneous reference is still honored. - Assert.AreNotEqual(0, completions.Length, "Expected some items in the list after adding a reference.") + Assert.NotEqual(0, completions.Length) ShowErrors(project) /// In this bug there was an exception if the user pressed dot after a long identifier /// that was unknown. - [] - [] + [] member public this.``OfSystemWindows``() = let code = ["let y=new System.Windows."] let (_, _, file) = this.CreateSingleFileProject(code, references = ["System.Windows.Forms"]) MoveCursorToEndOfMarker(file,"System.Windows.") let completions = AutoCompleteAtCursor(file) printfn "Completions=%A" completions - Assert.AreEqual(3, completions.Length) + Assert.Equal(3, completions.Length) /// Tests whether we're correctly showing both type and module when they have the same name - [] + [] member public this.``ShowSetAsModuleAndType``() = let code = ["let s = Set"] let (_, _, file) = this.CreateSingleFileProject(code) @@ -4619,16 +4540,16 @@ let x = query { for bbbb in abbbbc(*D0*) do Assert.Fail("'Set' not found in the completion list") /// FEATURE: The user may type namespace followed by dot and see a completion list containing members of that namespace. - [] + [] member public this.``AtNamespaceDot``() = let code = ["let y=new System.String()"] let (_, _, file) = this.CreateSingleFileProject(code) MoveCursorToEndOfMarker(file,"System.") let completions = AutoCompleteAtCursor(file) - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) /// FEATURE: The user will see appropriate glyphs in the autocompletion list. - [] + [] member public this.``OfSeveralModuleMembers``() = let code = [ @@ -4670,7 +4591,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file," Module.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) for completion in completions do match completion with | CompletionItem("A",_,_,_,DeclarationType.EnumMember) -> () @@ -4700,7 +4621,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"AbbreviationModule.") let completions = time1 AutoCompleteAtCursor file "Time of second autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) for completion in completions do match completion with | CompletionItem("Int32",_,_,_,_) @@ -4722,7 +4643,7 @@ let x = query { for bbbb in abbbbc(*D0*) do | CompletionItem("TupleTypeAbbreviation",_,_,_,_) -> () | CompletionItem(name,_,_,_,x) -> failwith (sprintf "Unexpected union member %s seen with declaration type %A" name x) - [] + [] member public this.ListFunctions() = let code = [ @@ -4733,7 +4654,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"List.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) for completion in completions do match completion with | CompletionItem("Cons",_,_,_,DeclarationType.Method) -> () @@ -4743,7 +4664,7 @@ let x = query { for bbbb in abbbbc(*D0*) do | CompletionItem(_,_,_,_,DeclarationType.Method) -> () | CompletionItem(name,_,_,_,x) -> failwith (sprintf "Unexpected item %s seen with declaration type %A" name x) - [] + [] member public this.``SystemNamespace``() = let code = [ @@ -4753,7 +4674,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"System.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) let AssertIsDecl(name,decl,expected) = if decl<>expected then failwith (sprintf "Expected %A for %s but was %A" expected name decl) @@ -4765,7 +4686,7 @@ let x = query { for bbbb in abbbbc(*D0*) do | _ -> () // If there is a compile error that prevents a data tip from resolving then show that data tip. - [] + [] member public this.``MemberInfoCompileErrorsShowInDataTip``() = let code = [ @@ -4779,7 +4700,7 @@ let x = query { for bbbb in abbbbc(*D0*) do use scope = AutoCompleteMemberDataTipsThrowsScope(this.VS, "Simulated compiler error") let completions = time1 CtrlSpaceCompleteAtCursor file "Time of first autocomplete." - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) for completion in completions do let (CompletionItem(_,_,_,descfunc,_)) = completion let desc = descfunc() @@ -4787,7 +4708,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertContains(desc,"Simulated compiler error") // Bunch of crud in empty list. This test asserts that unwanted things don't exist at the top level. - [] + [] member public this.``Editor.WithoutContext.Bug986``() = let code = ["(*mark*)"] let (_,_, file) = this.CreateSingleFileProject(code) @@ -4800,17 +4721,17 @@ let x = query { for bbbb in abbbbc(*D0*) do | CompletionItem("ICorRuntimeHost" as s,_,_,_,_) -> failwith (sprintf "Unexpected item %s at top level." s) | _ -> () - [] + [] member public this.``LetBind.TopLevel.Bug1650``() = let code =["let x = "] let (_,_, file) = this.CreateSingleFileProject(code) let gpatcc = GlobalParseAndTypeCheckCounter.StartNew(this.VS) MoveCursorToEndOfMarker(file,"let x = ") let completions = time1 CtrlSpaceCompleteAtCursor file "Time of first autocomplete." - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) gpatcc.AssertExactly(0,0) - [] + [] member public this.``Identifier.Invalid.Bug876b``() = let code = [ @@ -4822,9 +4743,9 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"x.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." ShowErrors(project) - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) - [] + [] member public this.``Identifier.Invalid.Bug876c``() = let code = [ @@ -4834,9 +4755,9 @@ let x = query { for bbbb in abbbbc(*D0*) do let (_,_, file) = this.CreateSingleFileProject(code, references = ["System"; "System.Drawing"; "System.Windows.Forms"]) MoveCursorToEndOfMarker(file,"x.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) - [] + [] member public this.``EnumValue.Bug2449``() = let code = [ @@ -4849,7 +4770,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." AssertCompListDoesNotContain(completions, "value__") - [] + [] member public this.``EnumValue.Bug4044``() = let code = [ @@ -4866,7 +4787,7 @@ let x = query { for bbbb in abbbbc(*D0*) do /// There was a bug (2584) that IntelliSense should treat 'int' as a type instead of treating it as a function /// However, this is now deprecated behavior. We want the user to use 'System.Int32' and /// we generally prefer information from name resolution (also see 4405) - [] + [] member public this.``PrimTypeAndFunc``() = let code = [ @@ -4883,7 +4804,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListDoesNotContain(completions,"MinValue") /// This is related to Bug1605--since the file couldn't parse there was no information to provide the autocompletion list. - [] + [] member public this.``MatchStatement.Clause.AfterLetBinds.Bug1603``() = let code = [ @@ -4898,7 +4819,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"xs -> f xs.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) let mutable count = 0 @@ -4915,10 +4836,10 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertIsDecl(name,decl,DeclarationType.Property) | CompletionItem(name,_,_,_,x) -> () - Assert.AreEqual(2,count) + Assert.Equal(2,count) // This was a bug in which the third level of dotting was ignored. - [] + [] member public this.``ThirdLevelOfDotting``() = let code = [ @@ -4928,7 +4849,7 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"Console.Wr") let completions = time1 CtrlSpaceCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) let AssertIsDecl(name,decl,expected) = if decl<>expected then failwith (sprintf "Expected %A for %s but was %A" expected name decl) @@ -4940,7 +4861,7 @@ let x = query { for bbbb in abbbbc(*D0*) do | CompletionItem(name,_,_,_,x) -> () // Test completions in an incomplete computation expression (case 1: for "let") - [] + [] member public this.``ComputationExpressionLet``() = let code = [ @@ -4953,7 +4874,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." AssertCompListContainsAll(completions, ["Next"]) - [] + [] member public this.``BestMatch.Bug4320a``() = let code = [ " let x = System." ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -4975,7 +4896,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertEqual(Some ("GCCollectionMode", true, true), Match "GCC" (Some "GC")) AssertEqual(Some ("GCCollectionMode", false, false), Match "GCCZ" (Some "GC")) - [] + [] member public this.``BestMatch.Bug4320b``() = let code = [ " let x = List." ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -4987,7 +4908,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertEqual(Some ("empty", false, true), Match "e") AssertEqual(Some ("empty", true, true), Match "em") - [] + [] member public this.``BestMatch.Bug5131``() = let code = [ "System.Environment." ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -4998,7 +4919,7 @@ let x = query { for bbbb in abbbbc(*D0*) do // isPrefix=true means it will be selected, instead of just outlined AssertEqual(Some ("OSVersion", true, true), Match "o") - [] + [] member public this.``COMPILED.DefineNotPropagatedToIncrementalBuilder``() = use _guard = this.UsingNewVS() @@ -5026,10 +4947,10 @@ let x = query { for bbbb in abbbbc(*D0*) do let completionItems = AutoCompleteAtCursor(file) |> Array.map (fun (CompletionItem(name, _, _, _, _)) -> name) - Assert.AreEqual(1, completionItems.Length, "Expected 1 item in the list") - Assert.AreEqual("x", completionItems.[0], "Expected 'x' in the list") + Assert.Equal(1, completionItems.Length) + Assert.Equal("x", completionItems.[0]) - [] + [] member public this.``VisualStudio.CloseAndReopenSolution``() = use _guard = this.UsingNewVS() // This test exposes what was once a bug, where closing a solution and then re-opening @@ -5048,17 +4969,16 @@ let x = query { for bbbb in abbbbc(*D0*) do MoveCursorToEndOfMarker(file,"x.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) this.CloseSolution(solution) let project,solution = OpenExistingProject(this.VS, dir, projName) let file = List.item 0 (GetOpenFiles(project)) MoveCursorToEndOfMarker(file,"x.") let completions = time1 AutoCompleteAtCursor file "Time of first autocomplete." // printf "Completions=%A\n" completions - Assert.IsTrue(completions.Length>0) + Assert.True(completions.Length>0) - [] - [] + [] member this.``BadCompletionAfterQuicklyTyping.Bug72561``() = let code = [ " " ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -5079,8 +4999,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListDoesNotContainAny(completions, ["AbstractClassAttribute"]) gpatcc.AssertExactly(0,0) - [] - [] + [] member this.``BadCompletionAfterQuicklyTyping.Bug72561.Noteworthy.NowWorks``() = let code = [ "123 " ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -5102,8 +5021,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListDoesNotContainAny(completions, ["AbstractClassAttribute"]) gpatcc.AssertExactly(0,0) - [] - [] + [] member this.``BadCompletionAfterQuicklyTyping.Bug130733.NowWorks``() = let code = [ "let someCall(x) = null" "let xe = someCall(System.IO.StringReader() "] @@ -5167,7 +5085,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = CtrlSpaceCompleteAtCursor(file) AssertEqual(0,completions.Length) - [] + [] member this.``Expression.WithoutPreDefinedMethods``() = this.VerifyCtrlSpaceListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5175,7 +5093,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*HERE*)", list = ["FSharpDelegateEvent"; "PrivateMethod"; "PrivateType"]) - [] + [] member this.``Expression.WithPreDefinedMethods``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -5193,7 +5111,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["PrivateField"; "PrivateMethod"; "PrivateType"]) // Regression for bug 2116 -- Consider making selected item in completion list case-insensitive - [] + [] member this.``CaseInsensitive``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -5210,7 +5128,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*Marker1*)", list = ["Xyzzy"; "xYzzy"; "xyZzy"; "xyzZy"; "xyzzY"]) - [] + [] member this.``Attributes.CanSeeOpenNamespaces.Bug268290.Case1``() = AssertCtrlSpaceCompleteContains [""" @@ -5222,7 +5140,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["AttributeUsage"] [] - [] + [] member this.``Selection``() = AssertCtrlSpaceCompleteContains [""" @@ -5234,7 +5152,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] // Regression test for 1653 -- Both the F# exception and the .NET exception representing it are shown in completion lists - [] + [] member this.``NoDupException.Postive``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -5242,7 +5160,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*MarkerException*)", list = ["MatchFailureException"]) - [] + [] member this.``DotNetException.Negative``() = this.VerifyCtrlSpaceListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5251,7 +5169,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["MatchFailure"]) // Regression for bug 921 -- intellisense case-insensitive? - [] + [] member this.``CaseInsensitive.MapMethod``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -5261,8 +5179,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["map"]) //Regression for bug 69644 69654 Fsharp: no completion for an identifier when 'use'd inside an 'async' block - [] - [] + [] member this.``InAsyncAndUseBlock``() = this.VerifyCompListContainAllAtStartOfMarker( fileContents = """ @@ -5281,7 +5198,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*Marker1*)", list = ["reader"]) - [] + [] member this.``WithoutOpenNamespace``() = AssertCtrlSpaceCompleteContains [""" @@ -5293,7 +5210,7 @@ let x = query { for bbbb in abbbbc(*D0*) do [] // should ["Single"] // should not - [] + [] member this.``PrivateVisible``() = AssertCtrlSpaceCompleteContains [""" @@ -5315,7 +5232,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["fieldPrivate";"MethodPrivate";"TypePrivate"] [] - [] + [] member this.``InternalVisible``() = AssertCtrlSpaceCompleteContains [""" @@ -5336,8 +5253,7 @@ let x = query { for bbbb in abbbbc(*D0*) do ["fieldInternal";"MethodInternal";"TypeInternal"] // should [] // should not - [] - [] + [] // Verify that we display the correct list of Unit of Measure (Names) in the autocomplete window. // This also ensures that no UoM are accidentally added or removed. member public this.``UnitMeasure.UnitNames``() = @@ -5349,8 +5265,7 @@ let x = query { for bbbb in abbbbc(*D0*) do "ohm"; "pascal"; "second"; "siemens"; "sievert"; "tesla"; "volt"; "watt"; "weber";] // should contain; exact match [ ] // should not contain - [] - [] + [] // Verify that we display the correct list of Unit of Measure (Symbols) in the autocomplete window. // This also ensures that no UoM are accidentally added or removed. member public this.``UnitMeasure.UnitSymbols``() = @@ -5371,9 +5286,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertCompListContainsAll(completions, contained) gpatcc.AssertExactly(0,0) - [] - [] - [] + [] // Custom operators appear in Intellisense list after entering a valid query operator // on the previous line and invoking Intellisense manually // Including in a nested query @@ -5391,9 +5304,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "do ma", contained = [ "maxBy"; "maxByNullable"; ]) - [] - [] - [] + [] // Custom operators appear in Intellisense list after entering a valid query operator // on the previous line and invoking Intellisense manually // Including in a nested query @@ -5409,7 +5320,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "gro", contained = [ "groupBy"; "groupJoin"; "groupValBy";]) - [] + [] member this.``Namespace.System``() = this.VerifyDotCompListContainAllAtEndOfMarker( fileContents = """ @@ -5422,7 +5333,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "open System", list = [ "IO"; "Collections" ]) - [] + [] member this.``Identifier.String.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5434,7 +5345,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*usage*)", list = ["Chars"; "ToString"; "Length"; "GetHashCode"]) - [] + [] member this.``Identifier.String.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5448,7 +5359,7 @@ let x = query { for bbbb in abbbbc(*D0*) do // Verify add_* methods show up for non-standard events. These are events // where the associated delegate type does not return "void" - [] + [] member this.``Event.NonStandard.PrefixMethods``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """System.AppDomain.CurrentDomain(*usage*)""", @@ -5457,28 +5368,28 @@ let x = query { for bbbb in abbbbc(*D0*) do // Verify the events do show up. An error is generated when they are used asking the user to use add_* and remove_* instead. // That is, they are legitimate name resolutions but do not pass type checking. - [] + [] member this.``Event.NonStandard.VerifyLegitimateNameShowUp``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "System.AppDomain.CurrentDomain(*usage*)", marker = "(*usage*)", list = ["AssemblyResolve"; "ReflectionOnlyAssemblyResolve"; "ResourceResolve"; "TypeResolve" ]) - [] + [] member this.``Array``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "let arr = [| for i in 1..10 -> i |](*Mexparray*)", marker = "(*Mexparray*)", list = ["Clone"; "IsFixedSize"]) - [] + [] member this.``List``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "let lst = [ for i in 1..10 -> i](*Mexplist*)", marker = "(*Mexplist*)", list = ["Head"; "Tail"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5490,7 +5401,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["Clone"]) // should contain method on array (result of M call) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test2``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5505,7 +5416,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["Clone"]) // should contain method on array (result of M call) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test3``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5520,7 +5431,7 @@ let x = query { for bbbb in abbbbc(*D0*) do - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test4``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5533,7 +5444,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["InterfaceMethods"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test5``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5545,7 +5456,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["GetEnumerator"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test6``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5557,7 +5468,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["AddHandler"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test7``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5569,7 +5480,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["Assembly"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test8``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5582,7 +5493,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["CompareTo"]) - [] + [] member public this.``ExpressionDotting.Regression.Bug187799.Test9``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5594,11 +5505,8 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*marker*)", list = ["CompareTo"]) - [] - [] - [] // This test case checks that autocomplete on the provided Type DOES NOT show System.Object members - [] + [] member this.``TypeProvider.EditorHideMethodsAttribute.Type.DoesnotContain``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5608,10 +5516,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["Equals";"GetHashCode"], addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] - [] - [] - [] + [] // This test case checks if autocomplete on the provided Type shows only the Event1 elements member this.``TypeProvider.EditorHideMethodsAttribute.Type.Contains``() = this.VerifyDotCompListContainAllAtStartOfMarker( @@ -5622,10 +5527,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["Event1"], addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] - [] - [] - [] + [] // This test case checks if autocomplete on the provided Type shows the instance method IM1 member this.``TypeProvider.EditorHideMethodsAttribute.InstanceMethod.Contains``() = this.VerifyDotCompListContainAllAtStartOfMarker( @@ -5636,9 +5538,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["IM1"], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] // This test case checks that nested types show up only statically and not on instances member this.``TypeProvider.TypeContainsNestedType``() = // should have it here @@ -5657,10 +5557,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["SomeNestedType"], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] // This test case checks if autocomplete on the provided Event shows only the AddHandler/RemoveHandler elements member this.``TypeProvider.EditorHideMethodsAttribute.Event.Contain``() = this.VerifyDotCompListContainAllAtStartOfMarker( @@ -5671,9 +5568,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["AddHandler";"RemoveHandler"], addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] - [] - [] + [] // This test case checks if autocomplete on the provided Method shows no elements // You can see this as a "negative case" (to check that the usage of the attribute on a method is harmless) member this.``TypeProvider.EditorHideMethodsAttribute.Method.Contain``() = @@ -5683,10 +5578,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*Marker*)", addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] - [] - [] - [] + [] // This test case checks if autocomplete on the provided Property (the type of which is not synthetic) shows the usual elements... like GetType() // 1. I think it does not make sense to use this attribute on a synthetic property unless it's type is also synthetic (already covered) // 2. You can see this as a "negative case" (to check that the usage of the attribute is harmless) @@ -5698,7 +5590,7 @@ let x = query { for bbbb in abbbbc(*D0*) do list = ["GetType"; "Equals"], // just a couple of System.Object methods: we expect them to be there! addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) - [] + [] member this.CompListInDiffFileTypes() = let fileContents = """ val x:int = 1 @@ -5718,7 +5610,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = DotCompletionAtStartOfMarker file "(*MarkerInsideSourceFile*)" AssertCompListContainsAll(completions, ["CompareTo"; "Equals"]) - [] + [] member this.ConstrainedTypes() = let fileContents = """ type Pet() = @@ -5748,35 +5640,35 @@ let x = query { for bbbb in abbbbc(*D0*) do let completions = DotCompletionAtStartOfMarker file "(*Mconstrainedtoint*)" AssertCompListContainsAll(completions, ["ToString"]) - [] + [] member this.``Literal.Float``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "let myfloat = (42.0)(*Mconstantfloat*)", marker = "(*Mconstantfloat*)", list = ["GetType"; "ToString"]) - [] + [] member this.``Literal.String``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """let name = "foo"(*Mconstantstring*)""", marker = "(*Mconstantstring*)", list = ["Chars"; "Clone"]) - [] + [] member this.``Literal.Int``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "let typeint = (10)(*Mint*)", marker = "(*Mint*)", list = ["GetType";"ToString"]) - [] + [] member this.``Identifier.InLambdaExpression``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "let funcLambdaExp = fun (x:int)-> x(*MarkerinLambdaExp*)", marker = "(*MarkerinLambdaExp*)", list = ["ToString"; "Equals"]) - [] + [] member this.``Identifier.InClass``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5785,7 +5677,7 @@ let x = query { for bbbb in abbbbc(*D0*) do marker = "(*MarkerLetBindinClass*)", list = ["ToString"; "Equals"]) - [] + [] member this.``Identifier.InNestedLetBind``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = " @@ -5796,7 +5688,7 @@ let funcNestedLetBinding (x:int) = marker = "(*MarkerNestedLetBind*)", list = ["ToString"; "Equals"]) - [] + [] member this.``Identifier.InModule``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = " @@ -5806,7 +5698,7 @@ module ModuleLetBindIn = marker = "(*MarkerLetBindinModule*)", list = ["ToString"; "Equals"]) - [] + [] member this.``Identifier.InMatchStatement``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = " @@ -5819,7 +5711,7 @@ match x(*MarkerMatchStatement*) with marker = "(*MarkerMatchStatement*)", list = ["ToString"; "Equals"]) - [] + [] member this.``Identifier.InMatchClause``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = " @@ -5834,7 +5726,7 @@ let rec f l = marker = "(*MarkerMatchClause*)", list = ["Add";"Date"]) - [] + [] member this.``Expression.ListItem``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5844,7 +5736,7 @@ let rec f l = marker = "(*MarkerListItem*)", list = ["CompareTo"; "ToString"]) - [] + [] member this.``Expression.FunctionParameter``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5854,7 +5746,7 @@ let rec f l = marker = "(*MarkerParameter*)", list = ["CompareTo"; "ToString"]) - [] + [] member this.``Expression.Function``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5864,7 +5756,7 @@ let rec f l = marker = "(*MarkerFunction*)", list = ["CompareTo"; "ToString"]) - [] + [] member this.``Expression.RecordPattern``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5876,7 +5768,7 @@ let rec f l = marker = "(*MarkerRecordPattern*)", list = ["Value"; "ToString"]) - [] + [] member this.``Expression.2DArray``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5886,7 +5778,7 @@ let rec f l = marker = "(*Marker2DArray*)", list = ["ToString"]) - [] + [] member this.``Expression.LetBind``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5897,7 +5789,7 @@ let rec f l = marker = "(*MarkerContext1*)", list = ["CompareTo";"ToString"]) - [] + [] member this.``Expression.WhileLoop``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5908,14 +5800,14 @@ let rec f l = marker = "(*MarkerContext3*)", list = ["CompareTo";"ToString"]) - [] + [] member this.``Expression.List``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """[1;2](*MarkerList*) """, marker = "(*MarkerList*)", list = ["Head"; "Item"]) - [] + [] member this.``Expression.Nested.InLetBind``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5926,7 +5818,7 @@ let rec f l = marker = "(*MarkerNested1*)", list = ["Chars";"Length"]) - [] + [] member this.``Expression.Nested.InWhileLoop``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5937,7 +5829,7 @@ let rec f l = marker = "(*MarkerNested2*)", list = ["Chars";"Length"]) - [] + [] member this.``Expression.ArrayItem.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5947,7 +5839,7 @@ let rec f l = marker = "(*MarkerArrayIndexer*)", list = ["Chars";"Split"]) - [] + [] member this.``Expression.ArrayItem.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5957,7 +5849,7 @@ let rec f l = marker = "(*MarkerArrayIndexer*)", list = ["IsReadOnly";"Rank"]) - [] + [] member this.``ObjInstance.InheritedClass.MethodsDefInBase``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5972,7 +5864,7 @@ let rec f l = marker = "(*Mderived*)", list = ["Name"; "dog"]) - [] + [] member this.``ObjInstance.AnonymousClass.MethodsDefInInterface``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -5993,7 +5885,7 @@ let rec f l = marker = "(*Mexpnewtype*)", list = ["DoStuff"; "DoStuff2"]) - [] + [] member this.``SimpleTypes.SystemTime``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6002,7 +5894,7 @@ let rec f l = marker = "(*Mstruct*)", list = ["AddDays"; "Date"]) - [] + [] member this.``SimpleTypes.Record``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6012,7 +5904,7 @@ let rec f l = marker = "(*Mrecord*)", list = ["DateOfBirth"; "Name"]) - [] + [] member this.``SimpleTypes.Enum``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6027,7 +5919,7 @@ let rec f l = marker = "(*Menum*)", list = ["GetType"; "ToString"]) - [] + [] member this.``SimpleTypes.DisUnion``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6043,7 +5935,7 @@ let rec f l = marker = "(*Mdiscriminatedunion*)", list = ["GetType"; "ToString"]) - [] + [] member this.``InheritedClass.BaseClassPrivateMethod.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6069,7 +5961,7 @@ let rec f l = marker = "(*MUnShowPrivate*)", list = ["MethodPrivate";"fieldPrivate"]) - [] + [] member this.``InheritedClass.BaseClassPublicMethodAndProperty``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6095,14 +5987,14 @@ let rec f l = marker = "(*MShowPublic*)", list = ["MethodPublic";"fieldPublic"]) - [] + [] member this.``Visibility.InternalNestedClass.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """System.Console(*Marker1*)""", marker = "(*Marker1*)", list = ["ControlCDelegateData"]) - [] + [] member this.``Visibility.PrivateIdentifierInDiffModule.Negative``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6116,7 +6008,7 @@ let rec f l = Module1(*Marker1*) """, marker = "(*Marker1*)") - [] + [] member this.``Visibility.PrivateIdentifierInDiffClass.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6133,7 +6025,7 @@ let rec f l = marker = "(*MarkerOutType*)", list = ["fieldPrivate";"MethodPrivate"]) - [] + [] member this.``Visibility.PrivateFieldInSameClass``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6150,7 +6042,7 @@ let rec f l = marker = "(*MarkerFieldInType*)", list = ["PrivateField"]) - [] + [] member this.``Visibility.PrivateMethodInSameClass``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6167,7 +6059,7 @@ let rec f l = marker = "(*MarkerMethodInType*)", list = ["PrivateMethod"]) -// [] +// [] member this.``VariableIdentifier.AsParameter``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6178,7 +6070,7 @@ let rec f l = marker = "(*Maftervariable1*)", list = ["Tag"]) - [] + [] member this.``VariableIdentifier.InMeasure.DefineInDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6202,7 +6094,7 @@ let rec f l = marker = "(*Maftervariable2*)", list = []) - [] + [] member this.``VariableIdentifier.MethodsInheritFromBase``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6221,7 +6113,7 @@ let rec f l = marker = "(*Maftervariable3*)", list = ["Name";"Speak"]) - [] + [] member this.``VariableIdentifier.AsParameter.DefineInDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6245,7 +6137,7 @@ let rec f l = marker = "(*Maftervariable4*)", list = ["DuType"]) - [] + [] member this.``VariableIdentifier.SystemNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6269,7 +6161,7 @@ let rec f l = marker = "(*Maftervariable5*)", list = ["BinaryReader";"Stream";"Directory"]) - [] + [] member this.``LongIdent.AsAttribute``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6279,7 +6171,7 @@ let rec f l = marker = "(*Mattribute*)", list = ["Obsolete"]) - [] + [] member this.``ImportStatement.System.ImportDirectly``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6288,7 +6180,7 @@ let rec f l = marker = "(*Mimportstatement1*)", list = ["Collections"]) - [] + [] member this.``ImportStatement.System.ImportAsIdentifier``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6297,7 +6189,7 @@ let rec f l = marker = "(*Mimportstatement2*)", list = ["IO"]) - [] + [] member this.``LongIdent.PatternMatch.AsVariable.DefFromDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6317,7 +6209,7 @@ let rec f l = marker = "(*Mpatternmatch1*)", list = ["Direction";"ToString"]) - [] + [] member this.``LongIdent.PatternMatch.AsConstantValue.DefFromDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6337,7 +6229,7 @@ let rec f l = marker = "(*Mpatternmatch2*)", list = ["longident"]) - [] + [] member this.``LongIdent.PInvoke.AsReturnType``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6358,7 +6250,7 @@ let rec f l = marker = "(*Mpinvokereturntype*)", list = ["Boolean";"Int32"]) - [] + [] member this.``LongIdent.PInvoke.AsAttribute``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6379,7 +6271,7 @@ let rec f l = marker = "(*Mpinvokeattribute*)", list = ["SomeAttrib"]) - [] + [] member this.``LongIdent.PInvoke.AsParameterType``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6392,7 +6284,7 @@ let rec f l = marker = "(*Mpinvokeparametertype*)", list = ["Boolean";"Int32"]) - [] + [] member this.``LongIdent.Record.AsField``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6405,7 +6297,7 @@ let rec f l = marker = "(*Mrecord*)", list = ["person"]) - [] + [] member this.``LongIdent.DiscUnion.AsTypeParameter.DefInDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6426,7 +6318,7 @@ let rec f l = marker = "(*Mtypeparameter1*)", list = ["Dog";"DuType"]) - [] + [] member this.``LongIdent.AnonymousFunction.AsTypeParameter.DefFromDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6447,7 +6339,7 @@ let rec f l = marker = "(*Mtypeparameter2*)", list = ["Tag"]) - [] + [] member this.``LongIdent.UnitMeasure.AsTypeParameter.DefFromDiffNamespace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6468,7 +6360,7 @@ let rec f l = marker = "(*Mtypeparameter3*)", list = []) - [] + [] member this.``RedefinedIdentifier.DiffScope.InScope.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6480,7 +6372,7 @@ let rec f l = marker = "(*MarkerShowLastOneWhenInScope*)", list = ["DayOfWeek"]) - [] + [] member this.``RedefinedIdentifier.DiffScope.InScope.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6492,7 +6384,7 @@ let rec f l = marker = "(*MarkerShowLastOneWhenInScope*)", list = ["Chars"]) - [] + [] member this.``RedefinedIdentifier.DiffScope.OutScope.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6504,7 +6396,7 @@ let rec f l = marker = "(*MarkerShowLastOneWhenOutscoped*)", list = ["Chars"]) - [] + [] member this.``ObjInstance.ExtensionMethods.WithoutDef.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6514,7 +6406,7 @@ let rec f l = marker = "(*MWithoutReference*)", list = ["NextDice";"DiceValue"]) - [] + [] member this.``Class.DefInDiffNameSpace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6546,7 +6438,7 @@ let rec f l = marker = "(*MarkerType*)" , list = ["TestType"]) - [] + [] member this.``Class.DefInDiffNameSpace.WithAttributes.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6578,7 +6470,7 @@ let rec f l = marker = "(*MarkerType*)", list = ["ObsoleteType";"CompilerMessageType"]) - [] + [] member this.``Method.DefInDiffNameSpace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6611,7 +6503,7 @@ let rec f l = marker = "(*MarkerMethod*)", list = ["TestMethod"; "VisibleMethod";"VisibleMethod2"]) - [] + [] member this.``Method.DefInDiffNameSpace.WithAttributes.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -6642,7 +6534,7 @@ let rec f l = marker = "(*MarkerMethod*)", list = ["ObsoleteMethod";"CompilerMessageMethod";"HiddenMethod"]) - [] + [] member this.``ObjInstance.ExtensionMethods.WithDef.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6657,7 +6549,7 @@ let rec f l = marker = "(*MWithReference*)", list = ["NextDice";"DiceValue"]) - [] + [] member this.``Keywords.If``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6665,13 +6557,13 @@ let rec f l = () """, marker ="(*MarkerKeywordIf*)") - [] + [] member this.``Keywords.Let``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """let(*MarkerKeywordLet*) a = 1""", marker = "(*MarkerKeywordLet*)") - [] + [] member this.``Keywords.Match``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6679,31 +6571,31 @@ let rec f l = | pattern -> exp""", marker = "(*MarkerKeywordMatch*)") - [] + [] member this.``MacroDirectives.nowarn``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """#nowarn(*MarkerPreProcessNowarn*)""", marker = "(*MarkerPreProcessNowarn*)") - [] + [] member this.``MacroDirectives.light``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """#light(*MarkerPreProcessLight*)""", marker = "(*MarkerPreProcessLight*)") - [] + [] member this.``MacroDirectives.define``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """#define(*MarkerPreProcessDefine*)""", marker = "(*MarkerPreProcessDefine*)") - [] + [] member this.``MacroDirectives.PreProcessDefine``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """#define Foo(*MarkerPreProcessDefineConst*)""", marker = "(*MarkerPreProcessDefineConst*)") - [] + [] member this.``Identifier.InClass.WithoutDef``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6711,7 +6603,7 @@ let rec f l = val mutable x(*MarkerValue*) : string""", marker = "(*MarkerValue*)") - [] + [] member this.``Identifier.InDiscUnion.WithoutDef``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6719,31 +6611,31 @@ let rec f l = |Tag(*MarkerDU*) of int""", marker = "(*MarkerDU*)") - [] + [] member this.``Identifier.InRecord.WithoutDef``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """type Rec = { X(*MarkerRec*) : int }""", marker = "(*MarkerRec*)") - [] + [] member this.``Identifier.AsNamespace``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """namespace Namespace1(*MarkerNamespace*)""", marker = "(*MarkerNamespace*)") - [] + [] member this.``Identifier.AsModule``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """module Module1(*MarkerModule*)""", marker = "(*MarkerModule*)") - [] + [] member this.``Identifier.WithoutDef``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ abcd(*MarkerUndefinedIdentifier*) """, marker = "(*MarkerUndefinedIdentifier*)") - [] + [] member this.``Identifier.InMatch.UnderScore``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6754,7 +6646,7 @@ let rec f l = |_(*MarkerIdentifierIsUnderScore*) -> 0 """, marker = "(*MarkerIdentifierIsUnderScore*)") - [] + [] member this.MemberSelf() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6762,7 +6654,7 @@ let rec f l = member this(*Mmemberself*)""", marker = "(*Mmemberself*)") - [] + [] member this.``Expression.InComment``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6770,14 +6662,14 @@ let rec f l = //open IO = System(*Mcomment*)""", marker = "(*Mcomment*)") - [] + [] member this.``Expression.InString``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """let x = "System.Console(*Minstring*)" """, marker = "(*Minstring*)") // Regression test for 1067 -- Completion lists don't work after generic arguments - for generic functions and for static members of generic types - [] + [] member this.``Regression1067.InstanceOfGenericType``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6800,7 +6692,7 @@ let rec f l = marker = "(*Marker2*)", list = ["P"; "Q"]) - [] + [] member this.``Regression1067.ClassUsingGenericTypeAsAttribute``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6823,7 +6715,7 @@ let rec f l = marker = "(*Marker4*)", list = ["Assembly"; "FullName"; "GUID"]) - [] + [] member this.NoInfiniteLoopInProperties() = let fileContents = """ open System.Windows.Forms @@ -6837,7 +6729,7 @@ let rec f l = AssertCompListDoesNotContainAny(completions, ["Nodes"]) // Regression for bug 3225 -- Invalid intellisense when inside of a quotation - [] + [] member this.``Regression3225.Identifier.InQuotation``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6847,7 +6739,7 @@ let rec f l = list = ["Chars"; "Length"]) // Regression for bug 1911 -- No completion list of expr in match statement - [] + [] member this.``Regression1911.Expression.InMatchStatement``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6860,8 +6752,7 @@ let rec f l = // Bug 3627 - Completion lists should be filtered in many contexts // This blocks six testcases and is slated for Dev11, so these will be disabled for some time. - [] - [] + [] member this.AfterTypeParameter() = let fileContents = """ type Type1 = Tag of string(*MarkerDUTypeParam*) @@ -6890,7 +6781,7 @@ let rec f l = let completions = DotCompletionAtStartOfMarker file "(*MarkerParamTypeof*)" AssertCompListIsEmpty(completions) - [] + [] member this.``Identifier.AsClassName.InInitial``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6898,33 +6789,32 @@ let rec f l = val field: int""", marker = "(*MarkerType*)") - [] + [] member this.``Identifier.AsFunctionName.InInitial``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """let f2(*MarkerFunctionIdentifier*) x = x+1 """, marker = "(*MarkerFunctionIdentifier*)") - [] + [] member this.``Identifier.AsParameter.InInitial``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ let f3 x(*MarkerParam*) = x+1""", marker = "(*MarkerParam*)") - [] + [] member this.``Identifier.AsFunctionName.UsingFunKeyword``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """fun f4(*MarkerFunctionDeclaration*) x -> x+1""", marker = "(*MarkerFunctionDeclaration*)") - [] + [] member public this.``Identifier.EqualityConstraint.Bug65730``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """let g3<'a when 'a : equality> (x:'a) = x(*Marker*)""", marker = "(*Marker*)", list = ["Equals"; "GetHashCode"]) // equality constraint should make these show up - [] - [] + [] member this.``Identifier.InFunctionMatch``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6933,7 +6823,7 @@ let rec f l = | 2 -> printfn "2" """, marker = "(*MarkerFunctionMatch*)") - [] + [] member this.``Identifier.This``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6941,7 +6831,7 @@ let rec f l = member this(*MarkerMemberThis*).Foo () = 3""", marker = "(*MarkerMemberThis*)") - [] + [] member this.``Identifier.AsProperty``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -6949,7 +6839,7 @@ let rec f l = member this.Foo(*MarkerMemberThisProperty*) = 1""", marker = "(*MarkerMemberThisProperty*)") - [] + [] member this.``ExpressionPropertyAssignment.Bug217051``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6960,7 +6850,7 @@ let rec f l = marker = "(*Marker*)", list = ["Prop"]) - [] + [] member this.``ExpressionProperty.Bug234687``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -6971,8 +6861,7 @@ let rec f l = marker = "(*Marker*)", list = ["CodeBase"]) // expect instance properties of Assembly, not static Assembly methods - [] - [] + [] member this.NotShowAttribute() = let fileContents = """ open System @@ -6995,8 +6884,7 @@ let rec f l = let completions = DotCompletionAtStartOfMarker file "(*Mattribute2*)" AssertCompListIsEmpty(completions) - [] - [] + [] member this.NotShowPInvokeSignature() = let fileContents = """ //open System @@ -7035,7 +6923,7 @@ let rec f l = let completions = DotCompletionAtStartOfMarker file "(*Mparameterlist*)" AssertCompListIsEmpty(completions) - [] + [] member this.``Basic.Completion.UnfinishedLet``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7046,8 +6934,7 @@ let rec f l = marker = "(*Marker*)", list = ["CompareTo"]) - [] - [] + [] member this.``ShortFormSeqExpr.Bug229610``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7061,7 +6948,7 @@ let rec f l = list = ["Value"]) //Regression test for bug 69159 Fsharp: dot completion is mission for an array - [] + [] member this.``Array.InitialUsing..``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """let x1 = [| 0.0 .. 0.1 .. 10.0 |](*Marker*)""", @@ -7069,8 +6956,7 @@ let rec f l = list = ["Length";"Clone";"ToString"]) //Regression test for bug 65740 Fsharp: dot completion is mission after a '#' statement - [] - [] + [] member this.``Identifier.In#Statement``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7086,7 +6972,7 @@ let rec f l = //This test is about CompletionList which should be moved to completionList, it's too special to refactor. //Regression test for bug 72595 typing quickly yields wrong intellisense - [] + [] member this.``BadCompletionAfterQuicklyTyping``() = let code = [ " " ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -7105,7 +6991,7 @@ let rec f l = AssertCompListContainsAll(completions, ["Length"]) AssertCompListDoesNotContainAny(completions, ["AbstractClassAttribute"]) - [] + [] member this.``SelfParameter.InDoKeywordScope``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7115,7 +7001,7 @@ let rec f l = marker = "(*Marker*)", list = ["ToString"]) - [] + [] member this.``SelfParameter.InDoKeywordScope.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7125,7 +7011,7 @@ let rec f l = marker = "(*Marker*)", list = ["Value";"Contents"]) - [] + [] member this.``ReOpenNameSpace.StaticProperties``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7141,7 +7027,7 @@ let rec f l = marker = "(*Marker1*)", list = ["Prop";"Event"]) - [] + [] member this.``ReOpenNameSpace.EnumTypes``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7158,7 +7044,7 @@ let rec f l = marker = "(*Marker2*)", list = ["Foo"]) - [] + [] member this.``ReOpenNameSpace.SystemLibrary``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7171,7 +7057,7 @@ let rec f l = marker = "(*Marker3*)", list = ["Open"]) - [] + [] member this.``ReOpenNameSpace.FsharpQuotation``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7183,7 +7069,7 @@ let rec f l = marker = "(*Marker4*)", list = ["Value"]) - [] + [] member this.``ReOpenNameSpace.MailboxProcessor``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7195,7 +7081,7 @@ let rec f l = marker = "(*Marker6*)", list = ["Start"]) - [] + [] member this.``ReopenNamespace.Module``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7209,7 +7095,7 @@ let rec f l = marker = "(*Marker7*)", list = ["foo"]) - [] + [] member this.``Expression.InLetScope``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7224,7 +7110,7 @@ let rec f l = marker = "(*Marker1*)", list = ["IsFixedSize";"Initialize"]) - [] + [] member this.``Expression.InFunScope.FirstParameter``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7238,7 +7124,7 @@ let rec f l = marker = "(*Marker2*)", list = ["CompareTo"]) - [] + [] member this.``Expression.InFunScope.SecParameter``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7253,7 +7139,7 @@ let rec f l = marker = "(*Marker3*)", list = ["GetType";"ToString"]) - [] + [] member this.``Expression.InMatchWhenClause``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7269,7 +7155,7 @@ let rec f l = list = ["CompareTo";"ToString"]) //Regression test for bug 3223 in PS: No intellisense at point - [] + [] member this.``Identifier.InActivePattern.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7288,7 +7174,7 @@ let rec f l = marker = "(*Marker*)", list = ["Attributes";"CallingConvention";"ContainsGenericParameters"]) - [] + [] member this.``Identifier.InActivePattern.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7308,7 +7194,7 @@ let rec f l = list = ["Head";"ToInt"]) //Regression test of bug 2296:No completion lists on the direct results of a method call - [] + [] member this.``Regression2296.DirectResultsOfMethodCall``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7327,7 +7213,7 @@ let rec f l = marker = "(*Marker1*)", list = ["Attributes";"CallingConvention";"IsFamily"]) - [] + [] member this.``Regression2296.DirectResultsOfMethodCall.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7346,7 +7232,7 @@ let rec f l = marker = "(*Marker1*)", list = ["value__"]) - [] + [] member this.``Regression2296.Identifier.String.Reflection01``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7369,7 +7255,7 @@ let rec f l = marker = "(*Marker2*)", list = ["CompareTo";"GetType";"ToString"]) - [] + [] member this.``Regression2296.Identifier.String.Reflection01.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7392,7 +7278,7 @@ let rec f l = marker = "(*Marker2*)", list = ["value__"]) - [] + [] member this.``Regression2296.Identifier.String.Reflection02``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7416,7 +7302,7 @@ let rec f l = marker = "(*Marker3*)", list = ["CompareTo";"GetType";"ToString"]) - [] + [] member this.``Regression2296.Identifier.String.Reflection02.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7437,7 +7323,7 @@ let rec f l = marker = "(*Marker3*)", list = ["value__"]) - [] + [] member this.``Regression2296.System.StaticMethod.Reflection``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7462,7 +7348,7 @@ let rec f l = marker = "(*Marker4*)", list = ["CompareTo";"GetType";"ToString"]) - [] + [] member this.``Regression2296.System.StaticMethod.Reflection.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7487,7 +7373,7 @@ let rec f l = marker = "(*Marker4*)", list = ["value__"]) - [] + [] member this.``Seq.NearTheEndOfFile``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7501,8 +7387,7 @@ let rec f l = list = ["cache";"find"]) //Regression test of bug 3879: intellisense glitch for computation expression - [] - [] + [] member this.``ComputationExpression.WithClosingBrace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7520,8 +7405,7 @@ let rec f l = marker = "(*Marker*)", list = ["AsyncGetResponse";"GetResponseAsync";"ToString"]) - [] - [] + [] member this.``ComputationExpression.WithoutClosingBrace``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7540,7 +7424,7 @@ let rec f l = list = ["AsyncGetResponse";"GetResponseAsync";"ToString"]) //Regression Test of 4405:intellisense has wrong type for identifier, using most recently bound of same name rather than the one in scope? - [] + [] member this.``Regression4405.Identifier.ReBound``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7552,14 +7436,14 @@ let rec f l = list = ["Chars";"StartsWith"]) //Regression test for FSharp1.0:4702 - [] + [] member this.``Regression4702.SystemWord``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = "System(*Marker*)", marker = "(*Marker*)", list = ["Console";"Byte";"ArgumentException"]) - [] + [] member this.``TypeAbbreviation.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7569,7 +7453,7 @@ let rec f l = marker = "(*Marker1*)", list = ["int16";"int32";"int64"]) - [] + [] member this.``TypeAbbreviation.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7580,7 +7464,7 @@ let rec f l = list = ["Int16";"Int32";"Int64"]) //Regression test of bug 3754:tupe forwarder bug? intellisense bug? - [] + [] member this.``Regression3754.TypeOfListForward.Positive``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7604,7 +7488,7 @@ let rec f l = marker = "(*Marker*)", list = ["append";"choose";"isEmpty"]) - [] + [] member this.``Regression3754.TypeOfListForward.Negative``() = this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -7628,8 +7512,7 @@ let rec f l = marker = "Marker", list = [""]) - [] - [] + [] member this.``NonApplicableExtensionMembersDoNotAppear.Bug40379``() = let code = [ "open System.Xml.Linq" @@ -7657,7 +7540,7 @@ let rec f l = let completions = AutoCompleteAtCursor file AssertCompListContainsAll(completions, ["Ancestors"; "AncestorsAndSelf"]) - [] + [] member this.``Visibility.InternalMethods.DefInSameAssembly``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7677,8 +7560,7 @@ let rec f l = marker = "(*MarkerSameAssemb*)", list = ["fieldInternal";"MethodInternal"]) - [] - [] + [] member this.``QueryExpression.DotCompletionSmokeTest1``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7689,8 +7571,7 @@ let rec f l = list = ["Chars";"Length"], addtlRefAssy=standard40AssemblyRefs) - [] - [] + [] member this.``QueryExpression.DotCompletionSmokeTest2``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7700,8 +7581,7 @@ let rec f l = list = ["Chars"; "Length"], addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member this.``QueryExpression.DotCompletionSmokeTest0``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7712,8 +7592,7 @@ let rec f l = addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member this.``QueryExpression.DotCompletionSmokeTest3``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7724,8 +7603,7 @@ let rec f l = addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member this.``QueryExpression.DotCompletionSystematic1``() = for customOperation in ["select";"sortBy";"where"] do let fileContentsList = @@ -7783,8 +7661,7 @@ let rec f l = list = ["Chars";"Length"], addtlRefAssy=standard40AssemblyRefs) - [] - [] + [] member public this.``QueryExpression.InsideJoin.Bug204147``() = this.VerifyDotCompListContainAllAtStartOfMarker( fileContents = """ @@ -7842,9 +7719,7 @@ let rec f l = let completions = DotCompletionAtStartOfMarker file2 marker AssertCompListContainsAll(completions, list) - [] - [] - [] + [] // Intellisense still appears on arguments when the operator is used in error member public this.``Query.HasErrors.Bug196230``() = this.AssertDotCompletionListInQuery( @@ -7862,10 +7737,8 @@ let rec f l = marker = "(*Marker*)", list = ["ProductID";"ProductName"] ) - [] - [] // Intellisense still appears on arguments when the operator is used in error - [] + [] member public this.``Query.HasErrors2``() = this.AssertDotCompletionListInQuery( fileContents = """ @@ -7879,9 +7752,7 @@ let rec f l = marker = "(*Marker*)", list = ["ProductID";"ProductName"] ) - [] - [] - [] + [] // Shadowed variables have correct Intellisense member public this.``Query.ShadowedVariables``() = this.AssertDotCompletionListInQuery( @@ -7897,9 +7768,7 @@ let rec f l = marker = "(*Marker*)", list = ["Category";"ProductName"] ) - [] - [] - [] + [] // Intellisense works correctly in a nested query member public this.``Query.InNestedQuery``() = let fileContents = """ @@ -7917,9 +7786,7 @@ let rec f l = this.VerifyDotCompListContainAllAtStartOfMarker(fileContents, "(*Marker2*)", ["Equals";"CompareTo"], queryAssemblyRefs ) - [] - [] - [] + [] // Intellisense works correctly in a nested expression within a lamda member public this.``Query.NestedExpressionWithinLamda``() = let fileContents = """ @@ -7935,7 +7802,7 @@ let rec f l = this.VerifyDotCompListContainAllAtStartOfMarker(fileContents, "(*Marker*)", ["Chars";"Length"], queryAssemblyRefs ) - [] + [] member this.``Verify no completion on dot after module definition``() = this.VerifyDotCompListIsEmptyAtStartOfMarker( fileContents = """ @@ -7945,7 +7812,7 @@ let rec f l = let bar = 1""", marker = "(*Marker*)") - [] + [] member this.``Verify no completion after module definition``() = this.VerifyCtrlSpaceCompListIsEmptyAtEndOfMarker( fileContents = """ @@ -7955,7 +7822,7 @@ let rec f l = let bar = 1""", marker = "module BasicTest ") - [] + [] member this.``Verify no completion in hash directives``() = this.VerifyCtrlSpaceCompListIsEmptyAtEndOfMarker( fileContents = """ @@ -7965,7 +7832,7 @@ let rec f l = let bar = 1""", marker = "(*Marker*)") - [] + [] member public this.``ExpressionDotting.Regression.Bug3709``() = this.VerifyCtrlSpaceListContainAllAtStartOfMarker( fileContents = """ @@ -7975,7 +7842,6 @@ let rec f l = list = ["EndsWith"]) // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs index 51a8e3f0856..b5cc13f4501 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs @@ -4,7 +4,7 @@ namespace Tests.LanguageService.ErrorList open System open System.IO -open NUnit.Framework +open Xunit open Microsoft.VisualStudio.FSharp open Salsa.Salsa open Salsa.VsOpsUtils @@ -13,14 +13,6 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -[] -type public AssemblyResolverTestFixture () = - - [] - member public _.Init () = AssemblyResolver.addResolver () - -[] -[] type UsingMSBuild() as this = inherit LanguageServiceBaseTests() @@ -55,7 +47,7 @@ type UsingMSBuild() as this = let assertContains (errors : list) text = let ok = errors |> List.exists (fun err -> err.Message = text) - Assert.IsTrue(ok, sprintf "Error list should contain '%s' message" text) + Assert.True(ok, sprintf "Error list should contain '%s' message" text) let assertExpectedErrorMessages expected (actual: list) = let normalizeCR input = System.Text.RegularExpressions.Regex.Replace(input, @"\r\n|\n\r|\n|\r", "\r\n") @@ -66,14 +58,7 @@ type UsingMSBuild() as this = |> normalizeCR let expected = expected |> String.concat Environment.NewLine |> normalizeCR - let message = - sprintf """ -=[ expected ]============ -%s -=[ actual ]============== -%s -=========================""" expected actual - Assert.AreEqual(expected, actual, message) + Assert.Equal(expected, actual) //verify the error list Count member private this.VerifyErrorListCountAtOpenProject(fileContents : string, num : int) = @@ -99,7 +84,7 @@ type UsingMSBuild() as this = TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let warnList = GetWarnings(project) - Assert.AreEqual(expectedNum,warnList.Length) + Assert.Equal(expectedNum,warnList.Length) //verify no the error list member private this.VerifyNoErrorListAtOpenProject(fileContents : string, ?addtlRefAssy : string list) = @@ -110,7 +95,7 @@ type UsingMSBuild() as this = for error in errorList do printfn "%A" error.Severity printf "%s\n" (error.ToString()) - Assert.IsTrue(errorList.IsEmpty) + Assert.True(errorList.IsEmpty) //Verify the error list contained the expected string member private this.VerifyErrorListContainedExpectedString(fileContents : string, expectedStr : string, ?addtlRefAssy : string list) = @@ -132,8 +117,7 @@ type UsingMSBuild() as this = else failwithf "The error list number is not the expected %d" num - [] - [] + [] member public this.``OverloadsAndExtensionMethodsForGenericTypes``() = let fileContent = """ @@ -153,13 +137,13 @@ let g (t : T) = t.Count() this.VerifyNoErrorListAtOpenProject(fileContent) - [] + [] member public this.``ErrorsInScriptFile``() = let (solution, project, file) = this.CreateSingleFileProject("", fileKind = SourceFileKind.FSX) let checkErrors expected = let l = List.length (GetErrors project) - Assert.AreEqual(expected, l, "Unexpected number of errors in error list") + Assert.Equal(expected, l) TakeCoffeeBreak(this.VS) checkErrors 0 @@ -179,8 +163,7 @@ let g (t : T) = t.Count() TakeCoffeeBreak(this.VS) checkErrors 0 - [] - [] + [] member public this.``LineDirective``() = use _guard = this.UsingNewVS() let fileContents = """ @@ -193,12 +176,12 @@ let g (t : T) = t.Count() let file = OpenFile(project, "File1.fs") let _ = OpenFile(project,"File2.fs") - Assert.IsFalse(Build(project).BuildSucceeded) + Assert.False(Build(project).BuildSucceeded) this.VerifyCountAtSpecifiedFile(project,1) VerifyErrorListContainedExpectedStr("The value or constructor 'y' is not defined",project) - [] + [] member public this.``InvalidConstructorOverload``() = let content = """ type X private() = @@ -213,8 +196,7 @@ let g (t : T) = t.Count() CheckErrorList content (assertExpectedErrorMessages expectedMessages) - [] - [] + [] member public this.``Query.InvalidJoinRelation.GroupJoin``() = let content = """ let x = query { @@ -226,12 +208,11 @@ let x = query { fun errors -> match errors with | [err] -> - Assert.AreEqual("Invalid join relation in 'groupJoin'. Expected 'expr expr', where is =, =?, ?= or ?=?.", err.Message) + Assert.Equal("Invalid join relation in 'groupJoin'. Expected 'expr expr', where is =, =?, ?= or ?=?.", err.Message) | errs -> Assert.Fail("Unexpected content of error list") - [] - [] + [] member public this.``Query.NonOpenedNullableModule.Join``() = let content = """ let t = @@ -244,12 +225,11 @@ let t = fun errors -> match errors with | [err] -> - Assert.AreEqual("The operator '?=?' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'.", err.Message) + Assert.Equal("The operator '?=?' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'.", err.Message) | errs -> Assert.Fail("Unexpected content of error list") - [] - [] + [] member public this.``Query.NonOpenedNullableModule.GroupJoin``() = let content = """ let t = @@ -262,13 +242,12 @@ let t = fun errors -> match errors with | [err] -> - Assert.AreEqual("The operator '?=?' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'.", err.Message) + Assert.Equal("The operator '?=?' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'.", err.Message) | errs -> Assert.Fail("Unexpected content of error list") - [] - [] + [] member public this.``Query.InvalidJoinRelation.Join``() = let content = """ let x = @@ -282,11 +261,11 @@ let x = fun errors -> match errors with | [err] -> - Assert.AreEqual("Invalid join relation in 'join'. Expected 'expr expr', where is =, =?, ?= or ?=?.", err.Message) + Assert.Equal("Invalid join relation in 'join'. Expected 'expr expr', where is =, =?, ?= or ?=?.", err.Message) | errs -> Assert.Fail("Unexpected content of error list") - [] + [] member public this.``InvalidMethodOverload``() = let content = """ System.Console.WriteLine(null) @@ -294,7 +273,7 @@ let x = let expectedMessages = [ "A unique overload for method 'WriteLine' could not be determined based on type information prior to this program point. A type annotation may be needed.\u001d\u001dKnown type of argument: 'a0 when 'a0: null\u001d\u001dCandidates:\u001d - System.Console.WriteLine(buffer: char array) : unit\u001d - System.Console.WriteLine(format: string, [] arg: obj array) : unit\u001d - System.Console.WriteLine(value: obj) : unit\u001d - System.Console.WriteLine(value: string) : unit" ] CheckErrorList content (assertExpectedErrorMessages expectedMessages) - [] + [] member public this.``InvalidMethodOverload2``() = let content = """ type A<'T>() = @@ -309,7 +288,7 @@ b.Do(1, 1) let expectedMessages = [ "A unique overload for method 'Do' could not be determined based on type information prior to this program point. A type annotation may be needed.\u001d\u001dKnown types of arguments: int * int\u001d\u001dCandidates:\u001d - member A.Do: a: int * b: 'T -> unit\u001d - member A.Do: a: int * b: int -> unit" ] CheckErrorList content (assertExpectedErrorMessages expectedMessages) - [] + [] member public this.``NoErrorInErrList``() = use _guard = this.UsingNewVS() let fileContents1 = """ @@ -343,7 +322,7 @@ b.Do(1, 1) TakeCoffeeBreak(this.VS) this.VerifyCountAtSpecifiedFile(project,0) - [] + [] member public this.``NoLevel4Warning``() = use _guard = this.UsingNewVS() let fileContents = """ @@ -361,14 +340,14 @@ b.Do(1, 1) this.VerifyCountAtSpecifiedFile(project,0) - [] + [] //This is an verify action test & example member public this.``TestErrorMessage``() = let fileContent = """Console.WriteLine("test")""" let expectedStr = "The value, namespace, type or module 'Console' is not defined" this.VerifyErrorListContainedExpectedString(fileContent,expectedStr) - [] + [] member public this.``TestWrongKeywordInInterfaceImplementation``() = let fileContent = """ @@ -382,14 +361,11 @@ type staticInInterface = CheckErrorList fileContent (function | err1 :: _ -> - Assert.IsTrue(err1.Message.Contains("No static abstract member was found that corresponds to this override")) + Assert.True(err1.Message.Contains("No static abstract member was found that corresponds to this override")) | x -> Assert.Fail(sprintf "Unexpected errors: %A" x)) - [] - [] - [] - [] + [] member public this.``TypeProvider.MultipleErrors`` () = let tpRef = PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") let checkList n = @@ -402,57 +378,51 @@ type staticInInterface = for err in errorList do printfn "Severity: %A, Message: %s" err.Severity err.Message - Assert.IsTrue(List.length errorList = n, "Unexpected size of error list") + Assert.True(List.length errorList = n, "Unexpected size of error list") let uniqueErrors = errorList |> Seq.map (fun m -> m.Message, m.Severity) |> set - Assert.IsTrue(uniqueErrors.Count = n, "List should not contain duplicate errors") + Assert.True(uniqueErrors.Count = n, "List should not contain duplicate errors") for x = 0 to (n - 1) do let expectedName = sprintf "The type provider 'DummyProviderForLanguageServiceTesting.TypeProviderThatThrowsErrors' reported an error: Error %d" x - Assert.IsTrue(Set.contains (expectedName, Microsoft.VisualStudio.FSharp.LanguageService.Severity.Error) uniqueErrors) + Assert.True(Set.contains (expectedName, Microsoft.VisualStudio.FSharp.LanguageService.Severity.Error) uniqueErrors) for i = 1 to 10 do checkList i - [] - [] + [] member public this.``Records.ErrorList.IncorrectBindings1``() = for code in [ "{_}"; "{_ = }"] do printfn "checking %s" code CheckErrorList code <| fun errs -> printfn "%A" errs - Assert.IsTrue((List.length errs) = 2) + Assert.True((List.length errs) = 2) assertContains errs "Field bindings must have the form 'id = expr;'" assertContains errs "'_' cannot be used as field name" - [] - [] + [] member public this.``Records.ErrorList.IncorrectBindings2``() = CheckErrorList "{_ = 1}" <| function - | [err] -> Assert.AreEqual("'_' cannot be used as field name", err.Message) + | [err] -> Assert.Equal("'_' cannot be used as field name", err.Message) | x -> printfn "%A" x; Assert.Fail("unexpected content of error list") - [] - [] + [] member public this.``Records.ErrorList.IncorrectBindings3``() = CheckErrorList "{a = 1; _; _ = 1}" <| fun errs -> - Assert.IsTrue((List.length errs) = 3) + Assert.True((List.length errs) = 3) let groupedErrs = errs |> Seq.groupBy (fun e -> e.Message) |> Seq.toList - Assert.IsTrue((List.length groupedErrs) = 2) + Assert.True((List.length groupedErrs) = 2) for (msg, e) in groupedErrs do - if msg = "'_' cannot be used as field name" then Assert.AreEqual(2, Seq.length e) - elif msg = "Field bindings must have the form 'id = expr;'" then Assert.AreEqual(1, Seq.length e) + if msg = "'_' cannot be used as field name" then Assert.Equal(2, Seq.length e) + elif msg = "Field bindings must have the form 'id = expr;'" then Assert.Equal(1, Seq.length e) else Assert.Fail (sprintf "Unexpected message %s" msg) - [] - [] - [] - [] + [] //This test case Verify the Error List shows the correct error message when the static parameter type is invalid //Intent: We want to make sure that both errors coming from the TP and the compilation of things specific to type provider are properly flagged in the error list. member public this.``TypeProvider.StaticParameters.IncorrectType `` () = @@ -463,10 +433,7 @@ type staticInInterface = this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test case Verify the Error List shows the correct error message when applying invalid static parameter to the provided type member public this.``TypeProvider.StaticParameters.Incorrect `` () = @@ -477,10 +444,7 @@ type staticInInterface = this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test case Verify that Error List shows the correct error message when Type Provider that takes two static parameter is given only one static parameter. member public this.``TypeProvider.StaticParameters.IncorrectNumberOfParameter `` () = @@ -491,9 +455,7 @@ type staticInInterface = this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] member public this.``TypeProvider.ProhibitedMethods`` () = let cases = [ @@ -509,9 +471,7 @@ type staticInInterface = addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) - [] - [] - [] + [] //This test case verify that the Error list count is one in the Error list item when given invalid static parameter that raises an error. member public this.``TypeProvider.StaticParameters.ErrorListItem `` () = @@ -520,10 +480,7 @@ type staticInInterface = type foo = N1.T< const "Hello World",2>""", num = 1) - [] - [] - [] - [] + [] //This test case Verify that there is No Error list count in the Error list item when the file content is correct. member public this.``TypeProvider.StaticParameters.NoErrorListCount `` () = @@ -533,7 +490,7 @@ type staticInInterface = addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] + [] member public this.``NoError.FlagsAndSettings.TargetOptionsRespected``() = let fileContent = """ [] @@ -544,10 +501,9 @@ type staticInInterface = TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let errorList = GetErrors(project) - Assert.IsTrue(errorList.IsEmpty) + Assert.True(errorList.IsEmpty) - [] - [] + [] member public this.``UnicodeCharacters``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -558,12 +514,12 @@ type staticInInterface = let file = OpenFile(project,"新規baProgram.fsi") let file = OpenFile(project,"新規bcrogram.fs") - Assert.IsFalse(Build(project).BuildSucceeded) - Assert.IsTrue(GetErrors(project) + Assert.False(Build(project).BuildSucceeded) + Assert.True(GetErrors(project) |> List.exists(fun error -> (error.ToString().Contains("新規baProgram")))) // In this bug, particular warns were still present after nowarn - [] + [] member public this.``NoWarn.Bug5424``() = let fileContent = """ #nowarn "67" // this type test or downcast will always hold @@ -576,7 +532,7 @@ type staticInInterface = this.VerifyNoErrorListAtOpenProject(fileContent) /// FEATURE: Errors in flags are sent in Error list. - [] + [] member public this.``FlagsAndSettings.ErrorsInFlagsDisplayed``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -587,7 +543,7 @@ type staticInInterface = TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. VerifyErrorListContainedExpectedStr("nonexistent",project) - [] + [] member public this.``BackgroundComplier``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -614,7 +570,7 @@ type staticInInterface = """, num = 2) - [] + [] member public this.``CompilerErrorsInErrList1``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -624,7 +580,7 @@ type staticInInterface = let a = NoVal""", num = 1 ) - // [] disabled for F#8, legacy service, covered in FCS tests instead + // [] disabled for F#8, legacy service, covered in FCS tests instead member public this.``CompilerErrorsInErrList4``() = this.VerifyNoErrorListAtOpenProject( fileContents = """ @@ -644,7 +600,7 @@ type staticInInterface = let _fsyacc_gotos = [| 0us; 1us; 2us|] """ ) - [] + [] member public this.``CompilerErrorsInErrList5``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -653,7 +609,7 @@ type staticInInterface = let x = 0 """, num = 1) - [] + [] member public this.``CompilerErrorsInErrList6``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -666,7 +622,7 @@ type staticInInterface = | B = 0N """, num = 2) - [] + [] member public this.``CompilerErrorsInErrList7``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -697,14 +653,14 @@ type staticInInterface = let foo = 1 """, num = 5) - [] + [] member public this.``CompilerErrorsInErrList8``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ type EnumInt8s = | A1 = - 10y """ , num = 1 ) - [] + [] member public this.``CompilerErrorsInErrList9``() = use _guard = this.UsingNewVS() let fileContents1 = """ @@ -732,7 +688,7 @@ type staticInInterface = Build(project) |> ignore this.VerifyCountAtSpecifiedFile(project,1) - [] + [] member public this.``CompilerErrorsInErrList10``() = let fileContents = """ namespace Errorlist @@ -744,26 +700,26 @@ type staticInInterface = this.VerifyCountAtSpecifiedFile(project,1) - [] + [] member public this.``DoubleClickErrorListItem``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ let x = x """, num = 1) - [] + [] member public this.``FixingCodeAfterBuildRemovesErrors01``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ let x = 4 + "x" """, num = 2) - [] + [] member public this.``FixingCodeAfterBuildRemovesErrors02``() = this.VerifyNoErrorListAtOpenProject( fileContents = "let x = 4" ) - [] + [] member public this.``IncompleteExpression``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -775,7 +731,7 @@ type staticInInterface = List.map (fun x -> x + 1) """ , num = 2) - [] + [] member public this.``IntellisenseRequest``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -783,7 +739,7 @@ type staticInInterface = member a.B(*Marker*) : int = "1" """, num = 1) - [] + [] member public this.``TypeChecking1``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -800,7 +756,7 @@ type staticInInterface = x.Next <- Some x """, num = 1) - [] + [] member public this.``TypeChecking2``() = this.VerifyErrorListContainedExpectedString( fileContents = """ @@ -817,7 +773,7 @@ type staticInInterface = x.Next <- Some x """, expectedStr = "Foo.Thread option") - [] + [] member public this.``TypeChecking3``() = this.VerifyErrorListCountAtOpenProject( fileContents = """ @@ -833,7 +789,7 @@ type staticInInterface = x.Next <- Some 1 """, num = 1) - [] + [] member public this.``TypeChecking4``() = this.VerifyErrorListContainedExpectedString( fileContents = """ @@ -883,7 +839,7 @@ type staticInInterface = AssertContains(tooltip,"string") *) - [] + [] member public this.``Warning.ConsistentWithLanguageService``() = let fileContent = """ open System @@ -892,9 +848,9 @@ type staticInInterface = let (_, project, file) = this.CreateSingleFileProject(fileContent, fileKind = SourceFileKind.FSX) TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let warnList = GetWarnings(project) - Assert.AreEqual(20,warnList.Length) + Assert.Equal(20,warnList.Length) - [] + [] member public this.``Warning.ConsistentWithLanguageService.Comment``() = let fileContent = """ open System @@ -903,10 +859,9 @@ type staticInInterface = let (_, project, file) = this.CreateSingleFileProject(fileContent, fileKind = SourceFileKind.FSX) TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let warnList = GetWarnings(project) - Assert.AreEqual(0,warnList.Length) + Assert.Equal(0,warnList.Length) - [] - [] + [] member public this.``Errorlist.WorkwithoutNowarning``() = let fileContent = """ type Fruit (shelfLife : int) as x = @@ -915,12 +870,11 @@ type staticInInterface = """ let (_, project, file) = this.CreateSingleFileProject(fileContent) - Assert.IsTrue(Build(project).BuildSucceeded) + Assert.True(Build(project).BuildSucceeded) TakeCoffeeBreak(this.VS) let warnList = GetErrors(project) - Assert.AreEqual(1,warnList.Length) + Assert.Equal(1,warnList.Length) // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorRecovery.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorRecovery.fs index 9b3b00bfa3c..e38c503c17d 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorRecovery.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorRecovery.fs @@ -4,7 +4,7 @@ namespace Tests.LanguageService.ErrorRecovery open System open System.IO -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -12,8 +12,6 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -25,14 +23,13 @@ type UsingMSBuild() = [ for i = 0 to errorList.Length - 1 do yield errorList.[i].Message] - Assert.IsTrue(errorList + Assert.True(errorList |> GetErrorMessages |> Seq.exists (fun errorMessage -> errorMessage.Contains(expectedStr))) // Not a recovery case, but make sure we get a squiggle at the unfinished Main() - [] - [] + [] member public this.``ErrorRecovery.Bug4538_3``() = let fileContent = """ type MyType() = @@ -43,8 +40,7 @@ type UsingMSBuild() = this.VerifyErrorListContainedExpectedString(fileContent,expectedStr) // Not a recovery case, but make sure we get a squiggle at the unfinished Main() - [] - [] + [] member public this.``ErrorRecovery.Bug4538_4``() = let fileContent = """ type MyType() = @@ -54,8 +50,7 @@ type UsingMSBuild() = let expectedStr = "The block following this 'use' is unfinished. Every code block is an expression and must have a result. 'use' cannot be the final code element in a block. Consider giving this block an explicit result." this.VerifyErrorListContainedExpectedString(fileContent,expectedStr) - [] - [] + [] member public this.``ErrorRecovery.Bug4881_1``() = let code = ["let s = \"\"" @@ -70,8 +65,7 @@ type UsingMSBuild() = let completions = AutoCompleteAtCursor file AssertCompListContains(completions,"Split") - [] - [] + [] member public this.``ErrorRecovery.Bug4881_2``() = let code = ["let s = \"\"" @@ -87,8 +81,7 @@ type UsingMSBuild() = let completions = AutoCompleteAtCursor file AssertCompListContains(completions,"Split") - [] - [] + [] member public this.``ErrorRecovery.Bug4881_3``() = let code = ["let s = \"\"" @@ -105,8 +98,7 @@ type UsingMSBuild() = AssertCompListContains(completions,"Split") - [] - [] + [] member public this.``ErrorRecovery.Bug4881_4``() = let code = ["let s = \"\"" @@ -122,8 +114,7 @@ type UsingMSBuild() = // This case was fixed while investigating 4538. - [] - [] + [] member public this.``ErrorRecovery.NotFixing4538_1``() = let code = ["type MyType() = " @@ -139,8 +130,7 @@ type UsingMSBuild() = AssertCompListContains(completions,"MyType") // This case was fixed while investigating 4538. - [] - [] + [] member public this.``ErrorRecovery.NotFixing4538_2``() = let code = ["type MyType() = " @@ -156,8 +146,7 @@ type UsingMSBuild() = AssertCompListContains(completions,"MyType") // This case was fixed while investigating 4538. - [] - [] + [] member public this.``ErrorRecovery.NotFixing4538_3``() = let code = ["type MyType() = " @@ -171,8 +160,7 @@ type UsingMSBuild() = let completions = CtrlSpaceCompleteAtCursor file AssertCompListContains(completions,"MyType") - [] - [] + [] member public this.``ErrorRecovery.Bug4538_1``() = let code = ["type MyType() = " @@ -187,8 +175,7 @@ type UsingMSBuild() = let completions = CtrlSpaceCompleteAtCursor file AssertCompListContains(completions,"MyType") - [] - [] + [] member public this.``ErrorRecovery.Bug4538_2``() = let code = ["type MyType() = " @@ -207,8 +194,7 @@ type UsingMSBuild() = - [] - [] + [] member public this.``ErrorRecovery.Bug4538_5``() = let code = ["type MyType() = " @@ -224,8 +210,7 @@ type UsingMSBuild() = AssertCompListContains(completions,"MyType") - [] - [] + [] member public this.``ErrorRecovery.Bug4594_1``() = let code = ["let Bar(xyz) =" @@ -241,7 +226,7 @@ type UsingMSBuild() = /// In this bug, the Module. at the very end of the file was treated as if it were in the scope /// of Module rather than right after it. This check just makes sure we can see a data tip because /// Module is available. - [] + [] member public this.``ErrorRecovery.5878_1``() = Helper.AssertMemberDataTipContainsInOrder ( @@ -268,6 +253,5 @@ type UsingMSBuild() = // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) \ No newline at end of file diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.General.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.General.fs index 96911faaa3b..a86a6ad5126 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.General.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.General.fs @@ -2,7 +2,7 @@ namespace Tests.LanguageService.General -open NUnit.Framework +open Xunit open System open System.IO open System.Reflection @@ -21,10 +21,9 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -[][] module IFSharpSource_DEPRECATED = - [] + [] let MultipleSourceIsDirtyCallsChangeTimestamps() = let recolorizeWholeFile() = () let recolorizeLine (_line:int) = () @@ -42,8 +41,8 @@ module IFSharpSource_DEPRECATED = let secondDirtyTime = source.DirtyTime let lastTickCount = System.Environment.TickCount - Assert.AreEqual(originalChangeCount + 1, secondChangeCount) - Assert.AreNotEqual(secondDirtyTime, originalDirtyTime) + Assert.Equal(originalChangeCount + 1, secondChangeCount) + Assert.NotEqual(secondDirtyTime, originalDirtyTime) // Here's the test. NeedsVisualRefresh is true now, we call RecordChangeToView() and it should cause a new changeCount and dirty time. while System.Environment.TickCount = lastTickCount do @@ -52,13 +51,12 @@ module IFSharpSource_DEPRECATED = let thirdChangeCount = source.ChangeCount let thirdDirtyTime = source.DirtyTime - Assert.AreEqual(secondChangeCount + 1, thirdChangeCount) - Assert.AreNotEqual(thirdDirtyTime, secondDirtyTime) + Assert.Equal(secondChangeCount + 1, thirdChangeCount) + Assert.NotEqual(thirdDirtyTime, secondDirtyTime) -[][] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -104,7 +102,7 @@ type UsingMSBuild() = n ) 0 - [] + [] member public this.``ReconcileErrors.Test1``() = let (_solution, project, file) = this.CreateSingleFileProject(["erroneous"]) Build project |> ignore @@ -112,7 +110,7 @@ type UsingMSBuild() = () /// FEATURE: (Project System only) Adding a file outside the project directory creates a link - [] + [] member public this.``ProjectSystem.FilesOutsideProjectDirectoryBecomeLinkedFiles``() = use _guard = this.UsingNewVS() if OutOfConeFilesAreAddedAsLinks(this.VS) then @@ -127,7 +125,7 @@ type UsingMSBuild() = let projFileText = System.IO.File.ReadAllText(ProjectFile(project)) AssertMatchesRegex '<' @"\s*\s*link.fs" projFileText - [] + [] member public this.``Lexer.CommentsLexing.Bug1548``() = let scan = new FSharpScanner_DEPRECATED(fun source -> let fileName = "test.fs" @@ -195,7 +193,7 @@ type UsingMSBuild() = // This was a bug in ReplaceAllText (subsequent calls to SetMarker would fail) - [] + [] member public this.``Salsa.ReplaceAllText``() = let code = ["#light"; @@ -225,7 +223,7 @@ type UsingMSBuild() = // Make sure that possible overloads (and other related errors) are shown in the error list - [] + [] member public this.``ErrorLogging.Bug5144``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -242,13 +240,13 @@ type UsingMSBuild() = "p.Plot(sin, 0., 0.)"]) let build = time1 Build project "Time to build project" - Assert.IsTrue(not build.BuildSucceeded, "Expected build to fail") + Assert.True(not build.BuildSucceeded, "Expected build to fail") if SupportsOutputWindowPane(this.VS) then Helper.AssertListContainsInOrder(GetOutputWindowPaneLines(this.VS), ["error FS0041: A unique overload for method 'Plot' could not be determined based on type information prior to this program point. A type annotation may be needed. Candidates: member N.M.LineChart.Plot : f:(float -> float) * xmin:float * xmax:float -> unit, member N.M.LineChart.Plot : f:System.Func * xmin:float * xmax:float -> unit"]) - [] + [] member public this.``ExhaustivelyScrutinize.ThisOnceAsserted``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -258,7 +256,7 @@ type UsingMSBuild() = """ else [],"" """ ] ) - [] + [] member public this.``ExhaustivelyScrutinize.ThisOnceAssertedToo``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -268,7 +266,7 @@ type UsingMSBuild() = " member _.CompareTo(v:obj) = 1" ] ) - [] + [] member public this.``ExhaustivelyScrutinize.ThisOnceAssertedThree``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -278,7 +276,7 @@ type UsingMSBuild() = " with get() = x.Data" " and set(v) = x.Data <- v" ] ) - [] + [] member public this.``ExhaustivelyScrutinize.ThisOnceAssertedFour``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -286,12 +284,11 @@ type UsingMSBuild() = "let z=4" ] ) - [] + [] member public this.``ExhaustivelyScrutinize.ThisOnceAssertedFive``() = Helper.ExhaustivelyScrutinize(this.TestRunner, [ """CSV.File<@"File1.txt">.[0].""" ]) // <@ is one token, wanted < @"... - [] - [] + [] member public this.``ExhaustivelyScrutinize.Bug2277``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -305,8 +302,7 @@ type UsingMSBuild() = "let pp= plot(Area(xs,ys))" ] ) - [] - [] + [] member public this.``ExhaustivelyScrutinize.Bug2283``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -322,7 +318,7 @@ type UsingMSBuild() = /// Verifies that token info returns correct trigger classes /// - this is used in MPF for triggering various intellisense features - [] + [] member public this.``TokenInfo.TriggerClasses``() = let important = [ // Member select for dot completions @@ -340,7 +336,7 @@ type UsingMSBuild() = let info = TestExpose.TokenInfo tok AssertEqual(expected, info) - [] + [] member public this.``MatchingBraces.VerifyMatches``() = let content = [| @@ -383,15 +379,15 @@ type UsingMSBuild() = let (endRow, endCol) = getPos endMarker let checkTextSpan (actual : TextSpan) expectedRow expectedCol = - Assert.IsTrue(actual.iStartLine = actual.iEndLine, "Start and end of the span should be on the same line") - Assert.AreEqual(expectedRow, actual.iStartLine, "Unexpected row") - Assert.AreEqual(expectedCol, actual.iStartIndex, "Unexpected column") - Assert.IsTrue(actual.iEndIndex = (actual.iStartIndex + expectedSpanLen), sprintf "Span should have length == %d" expectedSpanLen) + Assert.True(actual.iStartLine = actual.iEndLine, "Start and end of the span should be on the same line") + Assert.Equal(expectedRow, actual.iStartLine) + Assert.Equal(expectedCol, actual.iStartIndex) + Assert.True(actual.iEndIndex = (actual.iStartIndex + expectedSpanLen), sprintf "Span should have length == %d" expectedSpanLen) let checkBracesForPosition row col = setPos row col let braces = GetMatchingBracesForPositionAtCursor(file) - Assert.AreEqual(1, braces.Length, "One result expected") + Assert.Equal(1, braces.Length) let (lbrace, rbrace) = braces.[0] checkTextSpan lbrace startRow startCol @@ -412,7 +408,6 @@ type UsingMSBuild() = // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs index 5b3a685b1ea..8c2d8613c7c 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs @@ -4,7 +4,7 @@ namespace Tests.LanguageService.GotoDefinition open System open System.IO -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -15,9 +15,8 @@ open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.EditorServices +open Xunit -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -37,11 +36,11 @@ type UsingMSBuild() = let (_, _, file) = this.CreateSingleFileProject(fileContents, ?references = extraRefs) MoveCursorToStartOfMarker (file, marker) let result = GotoDefinitionAtCursor file - Assert.IsTrue(result.Success, "result.Success") + Assert.True(result.Success, "result.Success") let actualPos = (result.Span.iStartLine, result.Span.iStartIndex) let line = GetLineNumber file (result.Span.iStartLine + 1) printfn "Actual line:%s, actual pos:%A" line actualPos - Assert.AreEqual(pos, actualPos, "pos") + Assert.Equal(pos, actualPos) //GoToDefinitionFail Helper Function member private this.VerifyGoToDefnFailAtStartOfMarker(fileContents : string, marker :string,?addtlRefAssy : string list) = @@ -84,7 +83,7 @@ type UsingMSBuild() = file result - [] + [] member this.``Operators.TopLevel``() = this.VerifyGotoDefnSuccessForNonIdentifierAtStartOfMarker( fileContents = """ @@ -95,7 +94,7 @@ type UsingMSBuild() = pos=(1,21) ) - [] + [] member this.``Operators.Member``() = this.VerifyGotoDefnSuccessForNonIdentifierAtStartOfMarker( fileContents = """ @@ -108,7 +107,7 @@ type UsingMSBuild() = pos=(3,35) ) - [] + [] member public this.``Value``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -123,7 +122,7 @@ type UsingMSBuild() = marker = "valueX (*GotoValDef*)", definitionCode = "let valueX = Beta(1.0M, ())(*GotoTypeDef*)") - [] + [] member public this.``DisUnionMember``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -138,7 +137,7 @@ type UsingMSBuild() = marker = "Beta(1.0M, ())(*GotoTypeDef*)", definitionCode = "| Beta of decimal * unit") - [] + [] member public this.``PrimitiveType``() = this.VerifyGoToDefnFailAtStartOfMarker( fileContents = """ @@ -146,7 +145,7 @@ type UsingMSBuild() = let bi = 123456I""", marker = "123456I") - [] + [] member public this.``OnTypeDefinition``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -157,7 +156,7 @@ type UsingMSBuild() = marker = "One (*Marker1*)", definitionCode = "type One (*Marker1*) = One") - [] + [] member public this.``Parameter``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -168,13 +167,10 @@ type UsingMSBuild() = marker = "One (*Marker2*)", definitionCode = "type One (*Marker1*) = One") - [] - [] - [] // This test case check the GotoDefinition (i.e. the TypeProviderDefinitionLocation Attribute) - [] // We expect the correct FilePath, Line and Column on provided: Type, Event, Method, and Property // TODO: add a case for a provided Field + [] member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute``() = use _guard = this.UsingNewVS() // Note that the verification helped method is custom because we *do* care about the column as well, @@ -207,8 +203,8 @@ type UsingMSBuild() = let column' = column - 2 match result.ToOption() with - | Some(span,_) -> Assert.AreEqual(column',span.iStartIndex, "The cursor landed on the incorrect column!") - | None -> Assert.Fail <| sprintf "Expected to find the definition at column '%d' but GotoDefn failed." column' + | Some(span,_) -> Assert.Equal(column',span.iStartIndex) + | None -> failwithf "Expected to find the definition at column '%d' but GotoDefn failed." column' // Basic scenario on a provided Type let ``Type.BasicScenario``() = @@ -293,19 +289,19 @@ type UsingMSBuild() = ``Event.BasicScenario``() - [] + [] member public this.``GotoDefinition.NoSourceCodeAvailable``() = this.VerifyGoToDefnFailAtStartOfMarker ( fileContents = "System.String.Format(\"\")", marker = "ormat", f = (fun (_, result) -> - Assert.IsFalse(result.Success) - Assert.IsTrue(result.ErrorDescription.Contains("Source code is not available")) + Assert.False(result.Success) + Assert.True(result.ErrorDescription.Contains("Source code is not available")) ) ) - [] + [] member public this.``GotoDefinition.NoIdentifierAtLocation``() = let useCases = [ @@ -319,12 +315,12 @@ type UsingMSBuild() = fileContents = source, marker = marker, f = (fun (_, result) -> - Assert.IsFalse(result.Success) - Assert.IsTrue(result.ErrorDescription.Contains("Cursor is not on identifier")) + Assert.False(result.Success) + Assert.True(result.ErrorDescription.Contains("Cursor is not on identifier")) ) ) - [] + [] member public this.``GotoDefinition.ProvidedTypeNoDefinitionLocationAttribute``() = this.VerifyGoToDefnFailAtStartOfMarker @@ -333,12 +329,11 @@ type UsingMSBuild() = type T = N1.T<"", 1> """, marker = "T<", - f = (fun (_, result) -> Assert.IsFalse(result.Success) ), + f = (fun (_, result) -> Assert.False(result.Success) ), addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) - [] - [] + [] member public this.``GotoDefinition.ProvidedMemberNoDefinitionLocationAttribute``() = let useCases = [ @@ -359,15 +354,13 @@ type UsingMSBuild() = fileContents = source, marker = marker, f = (fun (_, result) -> - Assert.IsFalse(result.Success) + Assert.False(result.Success) let expectedText = sprintf "provided member '%s'" name - Assert.IsTrue(result.ErrorDescription.Contains(expectedText)) + Assert.True(result.ErrorDescription.Contains(expectedText)) ), addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) - [] - [] - [] + [] // This test case is when the TypeProviderDefinitionLocationAttribute filepath doesn't exist for TypeProvider Type member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Type.FileDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -379,10 +372,7 @@ type UsingMSBuild() = marker = "T(*GotoValDef*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) - [] - [] - [] - [] + [] //This test case is when the TypeProviderDefinitionLocationAttribute Line doesn't exist for TypeProvider Type member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Type.LineDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -394,9 +384,7 @@ type UsingMSBuild() = marker = "T(*GotoValDef*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeLineDoesnotExist.dll")]) - [] - [] - [] + [] // This test case is when the TypeProviderDefinitionLocationAttribute filepath doesn't exist for TypeProvider Constructor member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Constructor.FileDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -410,9 +398,7 @@ type UsingMSBuild() = - [] - [] - [] + [] //This test case is when the TypeProviderDefinitionLocationAttribute filepath doesn't exist for TypeProvider Method member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Method.FileDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -424,9 +410,7 @@ type UsingMSBuild() = marker = "M(*GotoValDef*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) - [] - [] - [] + [] // This test case is when the TypeProviderDefinitionLocationAttribute filepath doesn't exist for TypeProvider Property member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Property.FileDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -438,9 +422,7 @@ type UsingMSBuild() = marker = "StaticProp(*GotoValDef*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) - [] - [] - [] + [] //This test case is when the TypeProviderDefinitionLocationAttribute filepath doesn't exist for TypeProvider Event member public this.``GotoDefinition.TypeProvider.DefinitionLocationAttribute.Event.FileDoesnotExist``() = this.VerifyGoToDefnFailAtStartOfMarker( @@ -453,7 +435,7 @@ type UsingMSBuild() = marker = "Event1(*GotoValDef*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) - [] + [] member public this.``ModuleDefinition``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -464,7 +446,7 @@ type UsingMSBuild() = marker = "Foo (*MarkerModuleDefinition*)", definitionCode = "module Foo (*MarkerModuleDefinition*) =") - [] + [] member public this.``Record.Field.Definition``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -481,7 +463,7 @@ type UsingMSBuild() = marker = "myX (*MarkerXFieldDefinition*)", definitionCode = "{ myX (*MarkerXFieldDefinition*) : int") - [] + [] member public this.``Record.Field.Usage``() = this.VerifyGoToDefnSuccessAtStartOfMarker( fileContents = """ @@ -508,14 +490,14 @@ type UsingMSBuild() = member internal this.GotoDefinitionCheckResultAgainst (exp : (string * string * string) option)(file : OpenFile)(act : GotoDefnResult) : unit = match (exp, act.ToOption()) with | (Some (toFind, expLine, expFile), Some (span, actFile)) -> printfn "%s" "Result received, as expected; checking." - Assert.AreEqual (expFile, actFile) + Assert.Equal (expFile, actFile) printfn "%s" "Filename matches expected." MoveCursorTo(file, span.iStartLine + 1, span.iStartIndex + 1) // adjust & move to the identifier match GetIdentifierAtCursor file with // REVIEW: actually check that we're on the leftmost character of the identifier | None -> Assert.Fail("No identifier at cursor!") - | Some (id, _) -> Assert.AreEqual (toFind, id) // are we on the identifier we expect? + | Some (id, _) -> Assert.Equal (toFind, id) // are we on the identifier we expect? printfn "%s" "Identifier at cursor matches expected." - Assert.AreEqual (expLine.Trim (), (span.iStartLine |> (+) 1 |> GetLineNumber file).Trim ()) // ignore initial- / final-whitespace-introduced noise; adjust for difference in index numbers + Assert.Equal (expLine.Trim (), (span.iStartLine |> (+) 1 |> GetLineNumber file).Trim ()) // ignore initial- / final-whitespace-introduced noise; adjust for difference in index numbers printfn "%s" "Line at cursor matches expected." | (None, None) -> printfn "%s" "No result received, as expected." // sometimes we may expect GotoDefinition to fail, e.g., when the cursor isn't placed on a valid position (i.e., over an identifier, and, maybe, a constant if we decide to support that) | (Some _, None) -> Assert.Fail("No result received, but one was expected!") // distinguish this and the following case to give insight in case of failure @@ -528,11 +510,11 @@ type UsingMSBuild() = member internal this.GotoDefinitionCheckResultAgainstAnotherFile (proj : OpenProject)(exp : (string * string) option)(act : GotoDefnResult) : unit = match (exp, act.ToOption()) with | (Some (toFind, expFile), Some (span, actFile)) -> printfn "%s" "Result received, as expected; checking." - Assert.AreEqual (expFile, Path.GetFileName actFile) + Assert.Equal (expFile, Path.GetFileName actFile) printfn "%s" "Filename matches expected." let file = OpenFile (proj, actFile) let line = span.iStartLine |> ((+) 1) |> GetLineNumber file // need to adjust line number here - Assert.AreEqual (toFind, line.Substring (span.iStartIndex, toFind.Length)) + Assert.Equal (toFind, line.Substring (span.iStartIndex, toFind.Length)) printfn "%s" "Identifier at cursor matches expected." | (None, None) -> printfn "%s" "No result received, as expected." // sometimes we may expect GotoDefinition to fail, e.g., when the cursor isn't placed on a valid position (i.e., over an identifier, and, maybe, a constant if we decide to support that) | (Some _, None) -> Assert.Fail("No result received, but one was expected!") // distinguish this and the following case to give insight in case of failure @@ -542,7 +524,7 @@ type UsingMSBuild() = member this.GotoDefinitionTestWithSimpleFile (startLoc : string)(exp : (string * string) option) : unit = this.SolutionGotoDefinitionTestWithSimpleFile startLoc exp - [] + [] member this.``GotoDefinition.OverloadResolution``() = let lines = [ "type D() =" @@ -559,7 +541,7 @@ type UsingMSBuild() = "d.ToString$4$(\"aaa\") " ] this.GotoDefinitionTestWithMarkup lines - [] + [] member this.``GotoDefinition.OverloadResolutionForProperties``() = let lines = [ "type D() =" " member this.#1##2#Foo" @@ -577,7 +559,7 @@ type UsingMSBuild() = ] this.GotoDefinitionTestWithMarkup lines - [] + [] member this.``GotoDefinition.OverloadResolutionWithOverrides``() = let lines = [ "[]" @@ -596,7 +578,7 @@ type UsingMSBuild() = ] this.GotoDefinitionTestWithMarkup lines - [] + [] member this.``GotoDefinition.OverloadResolutionStatics``() = let lines = [ "type T =" @@ -608,7 +590,7 @@ type UsingMSBuild() = ] this.GotoDefinitionTestWithMarkup lines - [] + [] member this.``GotoDefinition.Constructors``() = let lines = [ "type #1a##1b##1c##1d#B() =" @@ -677,12 +659,12 @@ type UsingMSBuild() = MoveCursorTo(file, line, col) let res = GotoDefinitionAtCursor file match res.ToOption() with - | None -> Assert.IsFalse(targets.ContainsKey(marker), sprintf "%s: definition not found " marker) + | None -> Assert.False(targets.ContainsKey(marker), sprintf "%s: definition not found " marker) | Some (span,text) -> match targets.TryGetValue(marker) with | false, _ -> Assert.Fail(sprintf "%s: unexpected definition found" marker) | true, (line1, col1) -> - Assert.IsTrue(span.iStartIndex = col1 && span.iStartLine = line1, + Assert.True(span.iStartIndex = col1 && span.iStartLine = line1, sprintf "%s: wrong definition found expected %d %d but found %d %d %s" marker line1 col1 span.iStartLine span.iStartIndex text ) @@ -890,7 +872,7 @@ type UsingMSBuild() = // ensure that we've found the correct position (i.e., these must be unique // in any given test source file) - [] + [] member this.``GotoDefinition.InheritedMembers``() = let lines = [ "[]" @@ -910,299 +892,298 @@ type UsingMSBuild() = /// let #x = () in $x - [] + [] member public this.``GotoDefinition.InsideClass.Bug3176`` () = this.GotoDefinitionTestWithSimpleFile "id77 (*loc-77*)" (Some("val id77 (*loc-77*) : int", "id77")) /// let #x = () in $x - [] + [] member public this.``GotoDefinition.Simple.Binding.TrivialLetRHS`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-1*)" (Some("let x = () (*loc-2*)", "x")) /// let #x = () in x$ - [] + [] member public this.``GotoDefinition.Simple.Binding.TrivialLetRHSToRight`` () = this.GotoDefinitionTestWithSimpleFile " (*loc-1*)" (Some("let x = () (*loc-2*)", "x")) /// let $x = () in x - [] + [] member public this.``GotoDefinition.Simple.Binding.TrivialLetLHS`` () = this.GotoDefinitionTestWithSimpleFile "x = () (*loc-2*)" (Some("let x = () (*loc-2*)", "x")) /// let x = () in let #x = () in $x - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithSameNameRHS`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-4*)" (Some("let x = () (*loc-3*)", "x")) /// let x = () in let $x = () in x - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithSameNameLHSInner`` () = this.GotoDefinitionTestWithSimpleFile "x = () (*loc-3*)" (Some("let x = () (*loc-3*)", "x")) /// let $x = () in let x = () in x - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithSameNameLHSOuter`` () = this.GotoDefinitionTestWithSimpleFile "x = () (*loc-5*)" (Some("let x = () (*loc-5*)", "x")) /// let #x = () in let x = $x in () - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithXIsX`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-6*)" (Some("let x = () (*loc-7*)", "x")) /// let x = () in let rec #x = fun y -> $x y in () - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithXRec`` () = this.GotoDefinitionTestWithSimpleFile "x y (*loc-8*)" (Some("let rec x = (*loc-9*)", "x")) /// let x = () in let rec x = fun #y -> x $y in () - [] + [] member public this.``GotoDefinition.Simple.Binding.NestedLetWithXRecParam`` () = this.GotoDefinitionTestWithSimpleFile "y (*loc-8*)" (Some("fun y -> (*loc-10*)", "y")) /// let #(+) x _ = x in 2 $+ 3 - [] - [] + [] member public this.``GotoDefinition.Simple.Binding.Operator`` () = this.GotoDefinitionTestWithSimpleFile "+ 3 (*loc-11*)" (Some("let (+) x _ = x (*loc-2*)", "+")) /// type #Zero = /// let f (_ : $Zero) = 0 - [] + [] member public this.``GotoDefinition.Simple.Datatype.NullType`` () = this.GotoDefinitionTestWithSimpleFile "Zero) : 'a = failwith \"hi\" (*loc-14*)" (Some("type Zero = (*loc-13*)", "Zero")) /// type One = $One - [] + [] member public this.``GotoDefinition.Simple.Datatype.UnitTypeConsDef`` () = this.GotoDefinitionTestWithSimpleFile "One (*loc-15*)" (Some("One (*loc-15*)", "One")) /// type $One = One - [] + [] member public this.``GotoDefinition.Simple.Datatype.UnitTypeTypenameDef`` () = this.GotoDefinitionTestWithSimpleFile "One = (*loc-16*)" (Some("type One = (*loc-16*)", "One")) /// type One = #One /// let f (_ : One) = $One - [] + [] member public this.``GotoDefinition.Simple.Datatype.UnitTypeCons`` () = this.GotoDefinitionTestWithSimpleFile "One (*loc-18*)" (Some("One (*loc-15*)", "One")) /// type #One = One /// let f (_ : $One) = One - [] + [] member public this.``GotoDefinition.Simple.Datatype.UnitTypeTypename`` () = this.GotoDefinitionTestWithSimpleFile "One) = (*loc-17*)" (Some("type One = (*loc-16*)", "One")) /// type $Nat = Suc of Nat | Zro - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatTypeTypenameDef`` () = this.GotoDefinitionTestWithSimpleFile "Nat = (*loc-19*)" (Some("type Nat = (*loc-19*)", "Nat")) /// type #Nat = Suc of $Nat | Zro - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatTypeConsArg`` () = this.GotoDefinitionTestWithSimpleFile "Nat (*loc-20*)" (Some("type Nat = (*loc-19*)", "Nat")) /// type Nat = Suc of Nat | #Zro /// fun m -> match m with | $Zro -> () | _ -> () - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatPatZro`` () = this.GotoDefinitionTestWithSimpleFile "Zro -> (*loc-24*)" (Some("| Zro (*loc-21*)", "Zro")) /// type Nat = $Suc of Nat | Zro /// fun m -> match m with | Zro -> () | $Suc _ -> () - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatPatSuc`` () = this.GotoDefinitionTestWithSimpleFile "Suc m -> (*loc-25*)" (Some("| Suc of Nat (*loc-20*)", "Suc")) /// let rec plus m n = match m with | Zro -> n | Suc #m -> Suc (plus $m n) - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatPatSucVarUse`` () = this.GotoDefinitionTestWithSimpleFile "m n) (*loc-26*)" (Some("| Suc m -> (*loc-25*)", "m")) /// let rec plus m n = match m with | Zro -> n | Suc #m -> Suc (plus $m n) - [] + [] member public this.``GotoDefinition.Simple.Datatype.NatPatSucOuterVarUse`` () = this.GotoDefinitionTestWithSimpleFile "n) (*loc-26*)" (Some("let rec plus m n = (*loc-23*)", "n")) /// type $MyRec = { myX : int ; myY : int } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordTypenameDef`` () = this.GotoDefinitionTestWithSimpleFile "MyRec = (*loc-27*)" (Some("type MyRec = (*loc-27*)", "MyRec")) /// type MyRec = { $myX : int ; myY : int } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordField1Def`` () = this.GotoDefinitionTestWithSimpleFile "myX : int (*loc-28*)" (Some("{ myX : int (*loc-28*)", "myX")) /// type MyRec = { myX : int ; $myY : int } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordField2Def`` () = this.GotoDefinitionTestWithSimpleFile "myY : int (*loc-29*)" (Some("myY : int (*loc-29*)", "myY")) /// type MyRec = { #myX : int ; myY : int } /// let rDefault = { $myX = 2 ; myY = 3 } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordField1Use`` () = this.GotoDefinitionTestWithSimpleFile "myX = 2 (*loc-30*)" (Some("{ myX : int (*loc-28*)", "myX")) /// type MyRec = { myX : int ; #myY : int } /// let rDefault = { myX = 2 ; $myY = 3 } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordField2Use`` () = this.GotoDefinitionTestWithSimpleFile "myY = 3 (*loc-31*)" (Some("myY : int (*loc-29*)", "myY")) /// type MyRec = { #myX : int ; myY : int } /// let rDefault = { myX = 2 ; myY = 3 } /// let _ = { rDefault with $myX = 7 } - [] + [] member public this.``GotoDefinition.Simple.Datatype.RecordField1UseInWith`` () = this.GotoDefinitionTestWithSimpleFile "myX = 7 } (*loc-32*)" (Some("{ myX : int (*loc-28*)", "myX")) /// let a = () in let id (x : '$a) : 'a = x - [] + [] member public this.``GotoDefinition.Simple.Polymorph.Leftmost`` () = this.GotoDefinitionTestWithSimpleFile "a) (*loc-33*)" (Some("let id (x : 'a) (*loc-33*)", "'a")) /// let a = () in let id (x : 'a) : '$a = x - [] + [] member public this.``GotoDefinition.Simple.Polymorph.NotLeftmost`` () = this.GotoDefinitionTestWithSimpleFile "a = x (*loc-34*)" (Some("let id (x : 'a) (*loc-33*)", "'a")) /// let foo = () in let f (_ as $foo) = foo in () - [] + [] member public this.``GotoDefinition.Simple.Tricky.AsPatLHS`` () = this.GotoDefinitionTestWithSimpleFile "foo) = (*loc-35*)" (Some("let f (_ as foo) = (*loc-35*)", "foo")) /// let foo = () in let f (_ as #foo) = $foo in () - [] + [] member public this.``GotoDefinition.Simple.Tricky.AsPatRHS`` () = this.GotoDefinitionTestWithSimpleFile "foo (*loc-36*)" (Some("let f (_ as foo) = (*loc-35*)", "foo")) /// fun $x x -> x - [] + [] member public this.``GotoDefinition.Simple.Tricky.LambdaMultBind1`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-37*)" (Some("fun x (*loc-37*)", "x")) /// fun x $x -> x - [] + [] member public this.``GotoDefinition.Simple.Tricky.LambdaMultBind2`` () = this.GotoDefinitionTestWithSimpleFile "x -> (*loc-38*)" (Some("x -> (*loc-38*)", "x")) /// fun x $x -> x - [] + [] member public this.``GotoDefinition.Simple.Tricky.LambdaMultBindBody`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-39*)" (Some("x -> (*loc-38*)", "x")) /// let f = () in let $f = function f -> f in () - [] + [] member public this.``GotoDefinition.Simple.Tricky.LotsOfFsFunc`` () = this.GotoDefinitionTestWithSimpleFile "f = (*loc-41*)" (Some("let f = (*loc-41*)", "f")) /// let f = () in let f = function $f -> f in () - [] + [] member public this.``GotoDefinition.Simple.Tricky.LotsOfFsPat`` () = this.GotoDefinitionTestWithSimpleFile "f -> (*loc-42*)" (Some("function f -> (*loc-42*)", "f")) /// let f = () in let f = function #f -> $f in () - [] + [] member public this.``GotoDefinition.Simple.Tricky.LotsOfFsUse`` () = this.GotoDefinitionTestWithSimpleFile "f (*loc-43*)" (Some("function f -> (*loc-42*)", "f")) /// let f x = match x with | Suc $x | x -> x - [] + [] member public this.``GotoDefinition.Simple.Tricky.OrPatLeft`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-44*)" (Some("| Suc x (*loc-44*)", "x")) /// let f x = match x with | Suc x | $x -> x - [] + [] member public this.``GotoDefinition.Simple.Tricky.OrPatRight`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-45*)" (Some("| Suc x (*loc-44*)", "x")) // NOTE: or-patterns bind at first occurrence of the variable /// let f x = match x with | Suc #y & z -> $y - [] + [] member public this.``GotoDefinition.Simple.Tricky.AndPat`` () = this.GotoDefinitionTestWithSimpleFile "y (*loc-46*)" (Some("| Suc y & z -> (*loc-47*)", "y")) /// let f xs = match xs with | #x :: xs -> $x - [] + [] member public this.``GotoDefinition.Simple.Tricky.ConsPat`` () = this.GotoDefinitionTestWithSimpleFile "x (*loc-48*)" (Some("| x :: xs -> (*loc-49*)", "x")) /// let f p = match p with (#y, z) -> $y - [] + [] member public this.``GotoDefinition.Simple.Tricky.PairPat`` () = this.GotoDefinitionTestWithSimpleFile "y (*loc-50*)" (Some("| (y : int, z) -> (*loc-51*)", "y")) /// fun xs -> match xs with x :: #xs when $xs <> [] -> x :: xs - [] + [] member public this.``GotoDefinition.Simple.Tricky.ConsPatWhenClauseInWhen`` () = this.GotoDefinitionTestWithSimpleFile "xs <> [] -> (*loc-52*)" (Some("| x :: xs (*loc-54*)", "xs")) /// fun xs -> match xs with #x :: xs when xs <> [] -> $x :: xs - [] + [] member public this.``GotoDefinition.Simple.Tricky.ConsPatWhenClauseInWhenRhsX`` () = this.GotoDefinitionTestWithSimpleFile "x :: xs (*loc-53*)" (Some("| x :: xs (*loc-54*)", "x")) /// fun xs -> match xs with x :: #xs when xs <> [] -> x :: $xs - [] + [] member public this.``GotoDefinition.Simple.Tricky.ConsPatWhenClauseInWhenRhsXs`` () = this.GotoDefinitionTestWithSimpleFile "xs (*loc-53*)" (Some("| x :: xs (*loc-54*)", "xs")) /// let x = "$x" - [] + [] member public this.``GotoDefinition.Simple.Tricky.InStringFails`` () = this.GotoDefinitionTestWithSimpleFile "x(*loc-72*)" None /// let x = "hello /// $x /// " - [] + [] member public this.``GotoDefinition.Simple.Tricky.InMultiLineStringFails`` () = this.GotoDefinitionTestWithSimpleFile "x(*loc-73*)" None - [] + [] member public this.``GotoDefinition.Simple.Tricky.QuotedKeyword`` () = this.GotoDefinitionTestWithSimpleFile "let`` = (*loc-74*)" (Some("let rec ``let`` = (*loc-74*)", "``let``")) /// module $Too = let foo = () - [] + [] member public this.``GotoDefinition.Simple.Module.DefModname`` () = this.GotoDefinitionTestWithSimpleFile "Too = (*loc-55*)" (Some("module Too = (*loc-55*)", "Too")) /// module Too = $foo = () - [] + [] member public this.``GotoDefinition.Simple.Module.DefMember`` () = this.GotoDefinitionTestWithSimpleFile "foo = 0 (*loc-56*)" (Some("let foo = 0 (*loc-56*)", "foo")) /// module #Too = foo = () /// module Bar = open $Too - [] + [] member public this.``GotoDefinition.Simple.Module.Open`` () = this.GotoDefinitionTestWithSimpleFile "Too (*loc-57*)" (Some("module Too = (*loc-55*)", "Too")) /// module #Too = foo = () /// $Too.foo - [] + [] member public this.``GotoDefinition.Simple.Module.QualifiedModule`` () = this.GotoDefinitionTestWithSimpleFile "Too.foo (*loc-58*)" (Some("module Too = (*loc-55*)", "Too")) /// module Too = #foo = () /// Too.$foo - [] + [] member public this.``GotoDefinition.Simple.Module.QualifiedMember`` () = this.GotoDefinitionTestWithSimpleFile "foo (*loc-58*)" (Some("let foo = 0 (*loc-56*)", "foo")) /// type Parity = Even | Odd /// let (|$Even|Odd|) x = if x % 0 = 0 then Even else Odd - [] + [] member public this.``GotoDefinition.Simple.ActivePat.ConsDefLHS`` () = this.GotoDefinitionTestWithSimpleFile "Even|Odd|) x = (*loc-59*)" (Some("let (|Even|Odd|) x = (*loc-59*)", "|Even|Odd|")) /// type Parity = Even | Odd /// let (|#Even|Odd|) x = if x % 0 = 0 then $Even else Odd - [] + [] member public this.``GotoDefinition.Simple.ActivePat.ConsDefRhs`` () = this.GotoDefinitionTestWithSimpleFile "Even (*loc-60*)" (Some("let (|Even|Odd|) x = (*loc-59*)", "|Even|Odd|")) @@ -1212,17 +1193,16 @@ type UsingMSBuild() = /// match x with /// | $Even -> 1 /// | Odd -> 0 - [] + [] member public this.``GotoDefinition.Simple.ActivePat.PatUse`` () = this.GotoDefinitionTestWithSimpleFile "Even -> 1 (*loc-61*)" (Some("let (|Even|Odd|) x = (*loc-59*)", "|Even|Odd|")) /// let patval = (|Even|Odd|) (*loc-61b*) - [] + [] member public this.``GotoDefinition.Simple.ActivePat.PatUseValue`` () = this.GotoDefinitionTestWithSimpleFile "en|Odd|) (*loc-61b*)" (Some("let (|Even|Odd|) x = (*loc-59*)", "|Even|Odd|")) - [] - [] + [] member public this.``GotoDefinition.Library.InitialTest`` () = this.GotoDefinitionTestWithLib "map (*loc-1*)" (Some("map", "lis.fs")) @@ -1230,32 +1210,32 @@ type UsingMSBuild() = /// type #Class$ () = /// member c.Method () = () - [] + [] member public this.``GotoDefinition.ObjectOriented.ClassNameDef`` () = this.GotoDefinitionTestWithSimpleFile " () = (*loc-62*)" (Some("type Class () = (*loc-62*)", "Class")) /// type Class () = /// member c.#Method$ () = () - [] + [] member public this.``GotoDefinition.ObjectOriented.ILMethodDef`` () = this.GotoDefinitionTestWithSimpleFile " () = () (*loc-63*)" (Some("member c.Method () = () (*loc-63*)", "c.Method")) /// type Class () = /// member #c$.Method () = () - [] + [] member public this.``GotoDefinition.ObjectOriented.ThisDef`` () = this.GotoDefinitionTestWithSimpleFile ".Method () = () (*loc-63*)" (Some("member c.Method () = () (*loc-63*)", "c")) /// type Class () = /// static member #Foo$ () = () - [] + [] member public this.``GotoDefinition.ObjectOriented.StaticMethodDef`` () = this.GotoDefinitionTestWithSimpleFile " () = () (*loc-64*)" (Some("static member Foo () = () (*loc-64*)", "Foo")) /// type #Class () = /// member Method () = () /// let c = Class$ () - [] + [] member public this.``GotoDefinition.ObjectOriented.ConstructorUse`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-65*)" (Some("type Class () = (*loc-62*)", "Class")) @@ -1263,27 +1243,27 @@ type UsingMSBuild() = /// member #Method () = () /// let c = Class () /// c.Method$ () - [] + [] member public this.``GotoDefinition.ObjectOriented.MethodInvocation`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-66*)" (Some("member c.Method () = () (*loc-63*)", "c.Method")) /// type Class () = /// static member #Foo () = () /// Class.Foo$ () - [] + [] member public this.``GotoDefinition.ObjectOriented.StaticMethodInvocation`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-67*)" (Some("static member Foo () = () (*loc-64*)", "Foo")) /// type Class () = /// member c.Method# () = c.Method$ () - [] + [] member public this.``GotoDefinition.ObjectOriented.MethodSelfInvocation`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-68*)" (Some("member c.Method () = c.Method () (*loc-68*)", "c.Method")) /// type Class () = /// member c.Method1 () = c.Method2$ () /// member #c.Method2 () = c.Method1 () - [] + [] member public this.``GotoDefinition.ObjectOriented.MethodToMethodForward`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-69*)" (Some("member c.Method2 () = c.Method1 () (*loc-70*)", "c.Method2")) @@ -1293,7 +1273,7 @@ type UsingMSBuild() = /// member c.Method () = /// let #c = Class () /// c$.Method () - [] + [] member public this.``GotoDefinition.ObjectOriented.ShadowThis`` () = this.GotoDefinitionTestWithSimpleFile ".Method () (*loc-71*)" (Some("let c = Class ()", "c")) @@ -1303,11 +1283,11 @@ type UsingMSBuild() = /// member c.Method () = /// let c = Class () /// c.Method$ () - [] + [] member public this.``GotoDefinition.ObjectOriented.ShadowThisMethodInvocation`` () = this.GotoDefinitionTestWithSimpleFile " () (*loc-71*)" (Some("member c.Method () = () (*loc-63*)", "c.Method")) - [] + [] member this.``GotoDefinition.ObjectOriented.StructConstructor`` () = let lines = [ "#light" @@ -1350,7 +1330,7 @@ type UsingMSBuild() = match (QuickParse.GetCompleteIdentifierIsland tolerate s n, exp) with | (Some (s1, _, _), Some s2) -> printfn "%s" "Received result, as expected." - Assert.AreEqual (s1, s2) + Assert.Equal (s1, s2) | (None, None) -> printfn "%s" "Received no result, as expected." | (Some _, None) -> @@ -1358,53 +1338,53 @@ type UsingMSBuild() = | (None, Some _) -> Assert.Fail("Expected result, but didn't receive one!") - [] + [] member public this.``GetCompleteIdTest.TrivialBefore`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let $ThisIsAnIdentifier = ()" (Some "ThisIsAnIdentifier") - [] + [] member public this.``GetCompleteIdTest.TrivialMiddle`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let This$IsAnIdentifier = ()" (Some "ThisIsAnIdentifier") - [] + [] member public this.``GetCompleteIdTest.TrivialEnd`` () = this.GetCompleteIdTest true "let ThisIsAnIdentifier$ = ()" (Some "ThisIsAnIdentifier") this.GetCompleteIdTest false "let ThisIsAnIdentifier$ = ()" None - [] + [] member public this.``GetCompleteIdTest.GetsUpToDot1`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let ThisIsAnIdentifier = Te$st.Moo.Foo.bar" (Some "Test") - [] + [] member public this.``GetCompleteIdTest.GetsUpToDot2`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let ThisIsAnIdentifier = Test.Mo$o.Foo.bar" (Some "Test.Moo") - [] + [] member public this.``GetCompleteIdTest.GetsUpToDot3`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let ThisIsAnIdentifier = Test.Moo.Fo$o.bar" (Some "Test.Moo.Foo") - [] + [] member public this.``GetCompleteIdTest.GetsUpToDot4`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let ThisIsAnIdentifier = Test.Moo.Foo.ba$r" (Some "Test.Moo.Foo.bar") - [] + [] member public this.``GetCompleteIdTest.GetsUpToDot5`` () = this.GetCompleteIdTest true "let ThisIsAnIdentifier = Test.Moo.Foo.bar$" (Some "Test.Moo.Foo.bar") this.GetCompleteIdTest false "let ThisIsAnIdentifier = Test.Moo.Foo.bar$" None - [] + [] member public this.``GetCompleteIdTest.GetOperator`` () = for tolerate in [true;false] do this.GetCompleteIdTest tolerate "let ThisIsAnIdentifier = 3 +$ 4" None - [] + [] member public this.``Identifier.IsConstructor.Bug2516``() = let fileContents = """ module GotoDefinition @@ -1413,7 +1393,7 @@ type UsingMSBuild() = let definitionCode = "type One(*Mark1*) = One" this.VerifyGoToDefnSuccessAtStartOfMarker(fileContents,"(*Mark1*)",definitionCode) - [] + [] member public this.``Identifier.IsTypeName.Bug2516``() = let fileContents = """ module GotoDefinition @@ -1422,7 +1402,7 @@ type UsingMSBuild() = let definitionCode = "type One(*Mark1*) = One" this.VerifyGoToDefnSuccessAtStartOfMarker(fileContents,"(*Mark2*)",definitionCode) - [] + [] member public this.``ModuleName.OnDefinitionSite.Bug2517``() = let fileContents = """ namespace GotoDefinition @@ -1432,7 +1412,7 @@ type UsingMSBuild() = this.VerifyGoToDefnSuccessAtStartOfMarker(fileContents,"(*Mark*)",definitionCode) /// GotoDef on abbreviation - [] + [] member public this.``GotoDefinition.Abbreviation.Bug193064``() = let fileContents = """ type X = int @@ -1442,7 +1422,7 @@ type UsingMSBuild() = /// Verify the GotoDefinition on UoM yield does NOT jump out error dialog, /// will do nothing in automation lab machine or GTD SI.fs on dev machine with enlistment. - [] + [] member public this.``GotoDefinition.UnitOfMeasure.Bug193064``() = let fileContents = """ open Microsoft.FSharp.Data.UnitSystems.SI @@ -1451,6 +1431,5 @@ type UsingMSBuild() = // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.NavigationBar.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.NavigationBar.fs index 06c9bc76a62..99422f89e91 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.NavigationBar.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.NavigationBar.fs @@ -3,7 +3,7 @@ namespace Tests.LanguageService.NavigationBar open System -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -11,9 +11,6 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -[] -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -100,6 +97,5 @@ type UsingMSBuild() = // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) \ No newline at end of file diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs index 4ccfee95276..de36960f819 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs @@ -3,7 +3,7 @@ namespace Tests.LanguageService.ParameterInfo open System -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -16,8 +16,6 @@ module ParamInfoStandardSettings = let standard40AssemblyRefs = [| "System"; "System.Core"; "System.Numerics" |] let queryAssemblyRefs = [ "System.Xml.Linq"; "System.Core" ] -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -28,7 +26,7 @@ type UsingMSBuild() = yield display ] ] let AssertEmptyMethodGroup(resultMethodGroup:Microsoft.VisualStudio.FSharp.LanguageService.MethodListForAMethodTip_DEPRECATED option) = - Assert.IsTrue(resultMethodGroup.IsNone, "Expected an empty method group") + Assert.True(resultMethodGroup.IsNone, "Expected an empty method group") let AssertMethodGroupDescriptionsDoNotContain(methods:Microsoft.VisualStudio.FSharp.LanguageService.MethodListForAMethodTip_DEPRECATED, expectNotToBeThere) = for i = 0 to methods.GetCount() - 1 do @@ -38,10 +36,10 @@ type UsingMSBuild() = AssertNotContains(description,expectNotToBeThere) let AssertMethodGroup(resultMethodGroup:Microsoft.VisualStudio.FSharp.LanguageService.MethodListForAMethodTip_DEPRECATED option, expectedParamNamesSet:string list list) = - Assert.IsTrue(resultMethodGroup.IsSome, "Expected a method group") + Assert.True(resultMethodGroup.IsSome, "Expected a method group") let resultMethodGroup = resultMethodGroup.Value - Assert.AreEqual(expectedParamNamesSet.Length, resultMethodGroup.GetCount()) - Assert.IsTrue(resultMethodGroup + Assert.Equal(expectedParamNamesSet.Length, resultMethodGroup.GetCount()) + Assert.True(resultMethodGroup |> GetParamDisplays |> Seq.forall (fun paramDisplays -> expectedParamNamesSet |> List.exists (fun expectedParamNames -> @@ -50,9 +48,9 @@ type UsingMSBuild() = paramDisplay.Contains(expectedParamName))))) let AssertMethodGroupContain(resultMethodGroup:Microsoft.VisualStudio.FSharp.LanguageService.MethodListForAMethodTip_DEPRECATED option, expectedParamNames:string list) = - Assert.IsTrue(resultMethodGroup.IsSome, "Expected a method group") + Assert.True(resultMethodGroup.IsSome, "Expected a method group") let resultMethodGroup = resultMethodGroup.Value - Assert.IsTrue(resultMethodGroup + Assert.True(resultMethodGroup |> GetParamDisplays |> Seq.exists (fun paramDisplays -> expectedParamNames.Length = paramDisplays.Length && @@ -84,48 +82,48 @@ type UsingMSBuild() = //Verify the parameterInfo of one of the list order member private this.VerifyParameterInfoOverloadMethodIndex(fileContents : string, marker : string, index : int, expectedParams:string list, ?addtlRefAssy : string list) = let methodstr = this.GetMethodListForAMethodTip(fileContents,marker,?addtlRefAssy=addtlRefAssy) - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value let paramDisplays = [ for i = 0 to methodstr.GetParameterCount(index) - 1 do let (name,display,description) = methodstr.GetParameterInfo(index,i) yield display] - Assert.IsTrue((expectedParams, paramDisplays) ||> List.forall2 (fun expectedParam paramDisplay -> paramDisplay.Contains(expectedParam))) + Assert.True((expectedParams, paramDisplays) ||> List.forall2 (fun expectedParam paramDisplay -> paramDisplay.Contains(expectedParam))) //Verify there is at least one parameterInfo member private this.VerifyHasParameterInfo(fileContents : string, marker : string) = let methodstr = this.GetMethodListForAMethodTip(fileContents,marker) - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value - Assert.IsTrue (methodstr.GetCount() > 0) + Assert.True (methodstr.GetCount() > 0) //Verify return content after the colon member private this.VerifyFirstParameterInfoColonContent(fileContents : string, marker : string, expectedStr : string, ?addtlRefAssy : string list) = let methodstr = this.GetMethodListForAMethodTip(fileContents,marker,?addtlRefAssy=addtlRefAssy) - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value - Assert.AreEqual(expectedStr, methodstr.GetReturnTypeText(0)) // Expecting a method info like X(a:int,b:int) : int [used to be X(a:int,b:int) -> int] + Assert.Equal(expectedStr, methodstr.GetReturnTypeText(0)) // Expecting a method info like X(a:int,b:int) : int [used to be X(a:int,b:int) -> int] member private this.VerifyParameterCount(fileContents : string, marker : string, expectedCount: int) = let methodstr = this.GetMethodListForAMethodTip(fileContents,marker) - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value - Assert.AreEqual(0, methodstr.GetParameterCount(expectedCount)) + Assert.Equal(0, methodstr.GetParameterCount(expectedCount)) - [] + [] member public this.``Regression.OnConstructor.881644``() = let fileContent = """new System.IO.StreamReader((*Mark*)""" let methodstr = this.GetMethodListForAMethodTip(fileContent,"(*Mark*)") - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value if not (methodstr.GetDescription(0).Contains("#ctor")) then failwith "Expected parameter info to contain #ctor" - [] + [] member public this.``Regression.InsideWorkflow.6437``() = let fileContent = """ open System.IO @@ -134,13 +132,13 @@ type UsingMSBuild() = let! buffer = file.AsyncRead((*Mark*)0) return 0 }""" let methodstr = this.GetMethodListForAMethodTip(fileContent,"(*Mark*)") - Assert.IsTrue(methodstr.IsSome, "Expected a method group") + Assert.True(methodstr.IsSome, "Expected a method group") let methodstr = methodstr.Value if not (methodstr.GetDescription(0).Contains("AsyncRead")) then failwith "Expected parameter info to contain AsyncRead" - [] + [] member public this.``Regression.MethodInfo.WithColon.Bug4518_1``() = let fileContent = """ type T() = @@ -149,7 +147,7 @@ type UsingMSBuild() = ((new T()).X((*Mark*)""" this.VerifyFirstParameterInfoColonContent(fileContent,"(*Mark*)",": int") - [] + [] member public this.``Regression.MethodInfo.WithColon.Bug4518_2``() = let fileContent = """ type IFoo = interface @@ -159,7 +157,7 @@ type UsingMSBuild() = i.f((*Mark*)""" this.VerifyFirstParameterInfoColonContent(fileContent,"(*Mark*)",": int") - [] + [] member public this.``Regression.MethodInfo.WithColon.Bug4518_3``() = let fileContent = """ type M() = @@ -168,7 +166,7 @@ type UsingMSBuild() = m.f((*Mark*)""" this.VerifyFirstParameterInfoColonContent(fileContent,"(*Mark*)",": unit") - [] + [] member public this.``Regression.MethodInfo.WithColon.Bug4518_4``() = let fileContent = """ type T() = @@ -177,14 +175,14 @@ type UsingMSBuild() = t.Foo((*Mark*)""" this.VerifyFirstParameterInfoColonContent(fileContent,"(*Mark*)",": string") - [] + [] member public this.``Regression.MethodInfo.WithColon.Bug4518_5``() = let fileContent = """ let f x y = x + y f((*Mark*)""" this.VerifyFirstParameterInfoColonContent(fileContent,"(*Mark*)",": (int -> int) ") - [] + [] member public this.``Regression.StaticVsInstance.Bug3626.Case1``() = let fileContent = """ type Foo() = @@ -193,7 +191,7 @@ type UsingMSBuild() = let z = Foo.Bar((*Mark*))""" this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)",[["staticReturnsInt"]]) - [] + [] member public this.``Regression.StaticVsInstance.Bug3626.Case2``() = let fileContent = """ type Foo() = @@ -203,21 +201,21 @@ type UsingMSBuild() = let y = Hoo.Bar((*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)",[["instanceReturnsString"]]) - [] + [] member public this.``Regression.MethodInfo.Bug808310``() = let fileContent = """System.Console.WriteLine((*Mark*)""" let methodGroup = this.GetMethodListForAMethodTip(fileContent,"(*Mark*)") - Assert.IsTrue(methodGroup.IsSome, "Expected a method group") + Assert.True(methodGroup.IsSome, "Expected a method group") let methodGroup = methodGroup.Value let description = methodGroup.GetDescription(0) // Make sure that System.Console.WriteLine is not mentioned anywhere exception in the XML comment signature let xmlCommentIndex = description.IndexOf("System.Console.WriteLine]") let noBracket = description.IndexOf("System.Console.WriteLine") - Assert.IsTrue(noBracket>=0) - Assert.AreEqual(noBracket, xmlCommentIndex) + Assert.True(noBracket>=0) + Assert.Equal(noBracket, xmlCommentIndex) - [] + [] member public this.``NoArguments``() = // we want to see e.g. // g() : int @@ -240,20 +238,19 @@ type UsingMSBuild() = this.VerifyParameterCount(fileContents,"(*3*)", 0) this.VerifyParameterCount(fileContents,"(*4*)", 0) - [] + [] member public this.``Single.Constructor1``() = let fileContent = """new System.DateTime((*Mark*)""" this.VerifyHasParameterInfo(fileContent, "(*Mark*)") - [] + [] member public this.``Single.Constructor2``() = let fileContent = """ open System new DateTime((*Mark*)""" this.VerifyHasParameterInfo(fileContent, "(*Mark*)") - [] - [] + [] member public this.``Single.DotNet.StaticMethod``() = let code = ["#light" @@ -266,26 +263,26 @@ type UsingMSBuild() = AssertMethodGroup(methodGroup, [["objA"; "objB"]]) gpatcc.AssertExactly(0,0) - [] + [] member public this.``Regression.NoParameterInfo.100I.Bug5038``() = let fileContent = """100I((*Mark*)""" this.VerifyNoParameterInfoAtStartOfMarker(fileContent,"(*Mark*)") - [] + [] member public this.``Single.DotNet.InstanceMethod``() = let fileContent = """ let s = "Hello" s.Substring((*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)",[["startIndex"]; ["startIndex"; "length"]]) - [] + [] member public this.``Single.BasicFSharpFunction``() = let fileContent = """ let foo(x) = 1 foo((*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)",[["'a"]]) - // [] disabled for F#8, legacy service, covered in FCS tests instead + // [] disabled for F#8, legacy service, covered in FCS tests instead member public this.``Single.DiscriminatedUnion.Construction``() = let fileContent = """ type MyDU = @@ -305,7 +302,7 @@ type UsingMSBuild() = this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark3*)",[["``Long Name`` : int"; "string"]]) this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark4*)",[["int"]]) - // [] disabled for F#8, legacy service, covered in FCS tests instead + // [] disabled for F#8, legacy service, covered in FCS tests instead member public this.``Single.Exception.Construction``() = let fileContent = """ exception E1 of int * string @@ -321,10 +318,7 @@ type UsingMSBuild() = this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark2*)",[["V1: int"; "string"; "V3: bool" ]]) this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark3*)",[["``Long Name`` : int"; "string" ]]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes one (static) method that takes one argument works normally. member public this.``TypeProvider.StaticMethodWithOneParam`` () = let fileContent = """ @@ -333,10 +327,7 @@ type UsingMSBuild() = this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["arg1"]], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes a (static) method that takes >1 arguments works normally. member public this.``TypeProvider.StaticMethodWithMoreParam`` () = let fileContent = """ @@ -345,12 +336,9 @@ type UsingMSBuild() = this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["arg1";"arg2"]], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] //This test case verify the TypeProvider static method return type or colon content of the method //This test verifies that ParamInfo on a provided type that exposes one (static) method that takes one argument - [] //and returns something works correctly (more precisely, it checks that the return type is 'int') member public this.``TypeProvider.StaticMethodColonContent`` () = let fileContent = """ @@ -360,10 +348,7 @@ type UsingMSBuild() = addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes a Constructor that takes no argument works normally. member public this.``TypeProvider.ConstructorWithNoParam`` () = let fileContent = """ @@ -372,10 +357,7 @@ type UsingMSBuild() = this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",0,[], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes a Constructor that takes one argument works normally. member public this.``TypeProvider.ConstructorWithOneParam`` () = let fileContent = """ @@ -384,10 +366,7 @@ type UsingMSBuild() = this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",1,["arg1"], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes a Constructor that takes >1 argument works normally. member public this.``TypeProvider.ConstructorWithMoreParam`` () = let fileContent = """ @@ -396,10 +375,7 @@ type UsingMSBuild() = this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",2,["arg1";"arg2"], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo on a provided type that exposes a static parameter that takes >1 argument works normally. member public this.``TypeProvider.Type.WhenOpeningBracket`` () = let fileContent = """ @@ -408,10 +384,7 @@ type UsingMSBuild() = this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["Param1";"ParamIgnored"]], addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that after closing bracket ">" the ParamInfo isn't showing on a provided type that exposes a static parameter that takes >1 argument works normally. //This is a regression test for Bug DevDiv:181000 member public this.``TypeProvider.Type.AfterCloseBracket`` () = @@ -421,10 +394,7 @@ type UsingMSBuild() = this.VerifyNoParameterInfoAtStartOfMarker(fileContent,"(*Marker*)", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo is showing after delimiter "," on a provided type that exposes a static parameter that takes >1 argument works normally. member public this.``TypeProvider.Type.AfterDelimiter`` () = let fileContent = """ @@ -434,8 +404,7 @@ type UsingMSBuild() = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``Single.InMatchClause``() = let v461 = Version(4,6,1) let fileContent = """ @@ -534,23 +503,22 @@ type UsingMSBuild() = let methodGroup = GetParameterInfoAtCursor file if (methReq = []) then - Assert.IsTrue(methodGroup.IsNone, "Expected no method group") + Assert.True(methodGroup.IsNone, "Expected no method group") else AssertMethodGroup(methodGroup, methReq) // Test on .NET functions with no parameter - [] + [] member public this.``Single.DotNet.NoParameters`` () = this.TestSystematicParameterInfo("x.ToUpperInvariant(", [ [] ]) // Test on .NET function with one parameter - [] + [] member public this.``Single.DotNet.OneParameter`` () = this.TestSystematicParameterInfo("System.DateTime.Today.AddYears(", [ ["value: int"] ] ) // Test appearance of PI on second parameter of .NET function - [] - [] + [] member public this.``Single.DotNet.OnSecondParameter`` () = this.TestSystematicParameterInfo("loc-1*),", [ ["format"; "args"]; ["format"; "arg0"]; @@ -558,8 +526,7 @@ type UsingMSBuild() = ["format"; "arg0"; "arg1"]; ["format"; "arg0"; "arg1"; "arg2"] ] ) // Test on .NET functions with parameter array - [] - [] + [] member public this.``Single.DotNet.ParameterArray`` () = this.TestSystematicParameterInfo("loc-2*),", [ ["format"; "args"]; ["format"; "arg0"]; @@ -567,69 +534,63 @@ type UsingMSBuild() = ["format"; "arg0"; "arg1"]; ["format"; "arg0"; "arg1"; "arg2"] ] ) // Test on .NET indexers - [] - [] + [] member public this.``Single.DotNet.IndexerParameter`` () = this.TestSystematicParameterInfo("alist.[", [ ["index: int"] ] ) // Test on .NET parameters passed with 'out' keyword (byref) - [] - [] + [] member public this.``Single.DotNet.ParameterByReference`` () = this.TestSystematicParameterInfo("Int32.TryParse(s,", [ ["s: string"; "result: int byref"]; ["s"; "style"; "provider"; "result"] ] ) // Test on reference type and value type parameters (e.g. string & DateTime) - [] + [] member public this.``Single.DotNet.RefTypeValueType`` () = this.TestSystematicParameterInfo("loc-3*)Emp(", [ []; ["name: string"; "dob: System.DateTime"]; ["name: string"; "salary: float"; "dob: System.DateTime"] ] ) // Test PI does not pop up at point of definition/declaration - [] - [] + [] member public this.``Single.Locations.PointOfDefinition`` () = this.TestSystematicParameterInfo("loc-4*)new(", [ ] ) this.TestSystematicParameterInfo("member ConvertToInt32 (", [ ] ) this.TestSystematicParameterInfo("member this.IncreaseBy(", [ ] ) // Test PI does not pop up on whitespace after type annotation - [] - [] + [] member public this.``Single.Locations.AfterTypeAnnotation`` () = this.TestSystematicParameterInfo("(*loc-5*)", [], true) // Test PI does not pop up after non-parameterized properties - [] + [] member public this.``Single.Locations.AfterProperties`` () = this.TestSystematicParameterInfo("System.DateTime.Today", []) //this.TestSystematicParameterInfo("(*loc-8*)", [], true) // Test PI does not pop up after non-function values - [] + [] member public this.``Single.Locations.AfterValues`` () = this.TestSystematicParameterInfo("(*loc-8*)", [], true) // Test PI does not pop up after non-parameterized properties and after values - [] - [] + [] member public this.``Single.Locations.EndOfFile`` () = this.TestSystematicParameterInfo("System.Console.ReadLine(", [ [] ]) // Test PI pop up on parameter list for attributes - [] - [] + [] member public this.``Single.OnAttributes`` () = this.TestSystematicParameterInfo("(*loc-6*)", [ []; [ "check: bool" ] ], true) // Test PI when quoted identifiers are used as parameter - [] + [] member public this.``Single.QuotedIdentifier`` () = this.TestSystematicParameterInfo("(*loc-7*)", [ []; [ "maxValue" ]; [ "minValue"; "maxValue" ] ], true) // Test PI with parameters of custom type - [] + [] member public this.``Single.RecordAndUnionType`` () = this.TestSystematicParameterInfo("(*loc-9*)", [ [ "Fruit"; "KeyValuePair" ] ], true) @@ -643,65 +604,55 @@ type UsingMSBuild() = MoveCursorToEndOfMarker(file, testLine) let methodGroup = GetParameterInfoAtCursor file if (methReq = []) then - Assert.IsTrue(methodGroup.IsNone, "expected no method group") + Assert.True(methodGroup.IsNone, "expected no method group") else AssertMethodGroup(methodGroup, methReq) - [] + [] member public this.``Single.Generics.Typeof``() = this.TestGenericParameterInfo("typeof(", []) - [] - [] + [] member public this.``Single.Generics.MathAbs``() = let sevenTimes l = [ l; l; l; l; l; l; l ] this.TestGenericParameterInfo("Math.Abs(", sevenTimes ["value"]) - [] - [] + [] member public this.``Single.Generics.ExchangeInt``() = let sevenTimes l = [ l; l; l; l; l; l; l ] this.TestGenericParameterInfo("Interlocked.Exchange(", sevenTimes ["location1"; "value"]) - [] - [] + [] member public this.``Single.Generics.Exchange``() = let sevenTimes l = [ l; l; l; l; l; l; l ] this.TestGenericParameterInfo("Interlocked.Exchange(", sevenTimes ["location1"; "value"]) - [] - [] + [] member public this.``Single.Generics.ExchangeUnder``() = let sevenTimes l = [ l; l; l; l; l; l; l ] this.TestGenericParameterInfo("Interlocked.Exchange<_> (", sevenTimes ["location1"; "value"]) - [] - [] + [] member public this.``Single.Generics.Dictionary``() = this.TestGenericParameterInfo("System.Collections.Generic.Dictionary<_, option>(", [ []; ["capacity"]; ["comparer"]; ["capacity"; "comparer"]; ["dictionary"]; ["dictionary"; "comparer"] ]) - [] - [] + [] member public this.``Single.Generics.List``() = this.TestGenericParameterInfo("new System.Collections.Generic.List< _ > ( ", [ []; ["capacity"]; ["collection"] ]) - [] - [] + [] member public this.``Single.Generics.ListInt``() = this.TestGenericParameterInfo("System.Collections.Generic.List(", [ []; ["capacity"]; ["collection"] ]) - [] - [] + [] member public this.``Single.Generics.EventHandler``() = this.TestGenericParameterInfo("new System.EventHandler( ", [ [""] ]) // function arg doesn't have a name - [] - [] + [] member public this.``Single.Generics.EventHandlerEventArgs``() = this.TestGenericParameterInfo("System.EventHandler(", [ [""] ]) // function arg doesn't have a name - [] - [] + [] member public this.``Single.Generics.EventHandlerEventArgsNew``() = this.TestGenericParameterInfo("new System.EventHandler ( ", [ [""] ]) // function arg doesn't have a name @@ -727,7 +678,7 @@ type UsingMSBuild() = let gpatcc = GlobalParseAndTypeCheckCounter.StartNew(this.VS) MoveCursorToEndOfMarker(file, cursorPrefix) let info = GetParameterInfoAtCursor file - Assert.IsTrue(info.IsNone, "expected no parameter info") + Assert.True(info.IsNone, "expected no parameter info") gpatcc.AssertExactly(0,0) member public this.TestParameterInfoLocation (testLine, expectedPos, ?addtlRefAssy : string list) = @@ -740,7 +691,7 @@ type UsingMSBuild() = let (_, _, file) = this.CreateSingleFileProject(code, ?references = addtlRefAssy) MoveCursorToEndOfMarker(file, cursorPrefix) let info = GetParameterInfoAtCursor file - Assert.IsTrue(info.IsSome, "expected parameter info") + Assert.True(info.IsSome, "expected parameter info") let info = info.Value AssertEqual(expectedPos, info.GetColumnOfStartOfLongId()) @@ -748,83 +699,72 @@ type UsingMSBuild() = // There are more comments below that explain particular tricky cases - [] + [] member public this.``Single.Locations.Simple``() = this.TestParameterInfoLocation("let a = System.Math.Sin($", 8) - [] + [] member public this.``Single.Locations.LineWithSpaces``() = this.TestParameterInfoLocation("let r =\n"+ " System.Math.Abs($0)", 3) // on the beginning of "System", not line! - [] + [] member public this.``Single.Locations.FullCall``() = this.TestParameterInfoLocation("System.Math.Abs($0)", 0) - [] + [] member public this.``Single.Locations.SpacesAfterParen``() = this.TestParameterInfoLocation("let a = Math.Sign( $-10 )", 8) - [] + [] member public this.``Single.Locations.WithNamespace``() = this.TestParameterInfoLocation("let a = System.Threading.Interlocked.Exchange($", 8) - [] + [] member public this.``ParameterInfo.Locations.WithoutNamespace``() = this.TestParameterInfoLocation("let a = Interlocked.Exchange($", 8) - [] - [] + [] member public this.``Single.Locations.WithGenericArgs``() = this.TestParameterInfoLocation("Interlocked.Exchange($", 0) - [] + [] member public this.``Single.Locations.FunctionWithSpace``() = this.TestParameterInfoLocation("let a = sin 0$.0", 8) - [] + [] member public this.``Single.Locations.MethodCallWithoutParens``() = this.TestParameterInfoLocation("let n = Math.Sin 1$0.0", 8) - [] + [] member public this.``Single.Locations.GenericCtorWithNamespace``() = this.TestParameterInfoLocation("let _ = new System.Collections.Generic.Dictionary<_, _>($)", 12) // on the beginning of "System" (not on "new") - [] + [] member public this.``Single.Locations.GenericCtor``() = this.TestParameterInfoLocation("let _ = new Dictionary<_, _>($)", 12) // on the beginning of "System" (not on "new") - [] - [] - [] - [] + [] //This test verifies that ParamInfo location on a provided type with namespace that exposes static parameter that takes >1 argument works normally. member public this.``TypeProvider.Type.ParameterInfoLocation.WithNamespace`` () = this.TestParameterInfoLocation("type boo = N1.T<$",11, addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] //This test verifies that ParamInfo location on a provided type without the namespace that exposes static parameter that takes >1 argument works normally. member public this.``TypeProvider.Type.ParameterInfoLocation.WithOutNamespace`` () = this.TestParameterInfoLocation("open N1 \n"+"type boo = T<$", expectedPos = 11, addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] //This test verifies that no ParamInfo in a string for a provided type that exposes static parameter that takes >1 argument works normally. //The intent here to make sure the ParamInfo is not shown when inside a string member public this.``TypeProvider.Type.Negative.InString`` () = this.TestParameterInfoNegative("type boo = \"N1.T<$\"", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] //This test verifies that no ParamInfo in a Comment for a provided type that exposes static parameter that takes >1 argument works normally. //The intent here to make sure the ParamInfo is not shown when inside a comment member public this.``TypeProvider.Type.Negative.InComment`` () = @@ -837,35 +777,35 @@ type UsingMSBuild() = // we *must* look at the previous line to find the location where NameRes info ends // so in these cases we can find the identifier and location of tooltip is beginning of it // (but in general, we don't search for it) - [] + [] member public this.``Single.Locations.Multiline.IdentOnPrevLineWithGenerics``() = this.TestParameterInfoLocation("let d = Dictionary<_, option< int >> \n" + " ( $ )", 8) // on the "D" (line untestable) - [] + [] member public this.``Single.Locations.Multiline.IdentOnPrevLine``() = this.TestParameterInfoLocation("do Console.WriteLine\n" + " ($\"Multiline\")", 3) - [] + [] member public this.``Single.Locations.Multiline.IdentOnPrevPrevLine``() = this.TestParameterInfoLocation("do Console.WriteLine\n" + " ( \n" + " $ \"Multiline\")", 3) - [] + [] member public this.``Single.Locations.GenericCtorWithoutNew``() = this.TestParameterInfoLocation("let d = System.Collections.Generic.Dictionary<_, option< int >> ( $ )", 8) // on "S" - standard - [] + [] member public this.``Single.Locations.Multiline.GenericTyargsOnTheSameLine``() = this.TestParameterInfoLocation("let dict3 = System.Collections.Generic.Dictionary<_, \n" + " option< int>>( $ )", 12) // on "S" (beginning of "System") - [] + [] member public this.``Single.Locations.Multiline.LongIdentSplit``() = this.TestParameterInfoLocation("let ll = new System.Collections.\n" + " Generic.List< _ > ($)", 13) // on "S" (beginning of "System") - [] + [] member public this.``Single.Locations.OperatorTrick3``() = this.TestParameterInfoLocation ("let mutable n = null\n" + @@ -874,32 +814,31 @@ type UsingMSBuild() = // A several cases that are tricky and we don't want to show anything // in the following cases, we may return a location of an operator (its ambiguous), but we don't want to show info about it! - [] + [] member public this.``Single.Negative.OperatorTrick1``() = this.TestParameterInfoNegative ("let fooo = 0\n" + " >($ 1 )") // this may be end of a generic args specification - [] + [] member public this.``Single.Negative.OperatorTrick2``() = this.TestParameterInfoNegative ("let fooo = 0\n" + " <($ 1 )") /// No intellisense in comments/strings! - [] + [] member public this.``Single.InString``() = this.TestParameterInfoNegative ("let s = \"System.Console.WriteLine($)\"") /// No intellisense in comments/strings! - [] + [] member public this.``Single.InComment``() = this.TestParameterInfoNegative ("// System.Console.WriteLine($)") - [] - [] + [] member this.``Regression.LocationOfParams.AfterQuicklyTyping.Bug91373``() = let code = [ "let f x = x " "let f1 y = y " @@ -917,14 +856,13 @@ type UsingMSBuild() = "let z = f(f1( " ] ) MoveCursorToEndOfMarker(file, "f1(") let info = GetParameterInfoAtCursor file // this will fall back to using the name environment, which is stale, but sufficient to look up the call to 'f1' - Assert.IsTrue(info.IsSome, "expected parameter info") + Assert.True(info.IsSome, "expected parameter info") let info = info.Value AssertEqual("f1", info.GetName(0)) // note about (5,0): service.fs adds three lines of empty text to the end of every file, so it reports the location of 'end of file' as first the char, 3 lines past the last line of the file AssertEqual([|(2,10);(2,12);(2,13);(3,0)|], info.GetParameterLocations()) - [] - [] + [] member this.``LocationOfParams.AfterQuicklyTyping.CallConstructor``() = let code = [ "type Foo() = class end" ] let (_, _, file) = this.CreateSingleFileProject(code) @@ -940,7 +878,7 @@ type UsingMSBuild() = MoveCursorToEndOfMarker(file, "new Foo(") // Note: no TakeCoffeeBreak(this.VS) let info = GetParameterInfoAtCursor file // this will fall back to using the name environment, which is stale, but sufficient to look up the call to 'f1' - Assert.IsTrue(info.IsSome, "expected parameter info") + Assert.True(info.IsSome, "expected parameter info") let info = info.Value AssertEqual("Foo", info.GetName(0)) // note about (4,0): service.fs adds three lines of empty text to the end of every file, so it reports the location of 'end of file' as first the char, 3 lines past the last line of the file @@ -950,7 +888,7 @@ type UsingMSBuild() = (* This does not currently work, because the 'fallback to name environment' does weird QuickParse-ing and mangled the long id "Bar.Foo". We really need to rewrite some code paths here to use the real parse tree rather than QuickParse-ing. - [] + [] member this.``ParameterInfo.LocationOfParams.AfterQuicklyTyping.CallConstructorViaLongId.Bug94333``() = let solution = CreateSolution(this.VS) let project = CreateProject(solution,"testproject") @@ -974,7 +912,7 @@ We really need to rewrite some code paths here to use the real parse tree rather AssertEqual([|(1,14);(1,21);(1,21);(4,0)|], info.GetParameterLocations()) *) - [] + [] member public this.``ParameterInfo.NamesOfParams``() = let testLines = [ "type Foo =" @@ -985,7 +923,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let (_, _, file) = this.CreateSingleFileProject(testLines) MoveCursorToStartOfMarker(file, "0") let info = GetParameterInfoAtCursor file - Assert.IsTrue(info.IsSome, "expected parameter info") + Assert.True(info.IsSome, "expected parameter info") let info = info.Value let names = info.GetParameterNames() AssertEqual([| null; null; "d"; "e"; "c" |], names) @@ -1019,7 +957,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let (_, _, file) = this.CreateSingleFileProject(testLines, references = references) MoveCursorToEndOfMarker(file, cursorPrefix) let info = GetParameterInfoAtCursor file - Assert.IsTrue(info.IsSome, "expected parameter info") + Assert.True(info.IsSome, "expected parameter info") let info = info.Value AssertEqual(expectedLocs, info.GetParameterLocations()) @@ -1040,17 +978,17 @@ We really need to rewrite some code paths here to use the real parse tree rather let (_, _, file) = this.CreateSingleFileProject(testLines, references = references) MoveCursorToEndOfMarker(file, cursorPrefix) let info = GetParameterInfoAtCursor file - Assert.IsTrue(info.IsNone, "expected no parameter info for this particular test, though it would be nice if this has started to work") + Assert.True(info.IsNone, "expected no parameter info for this particular test, though it would be nice if this has started to work") - [] + [] member public this.``LocationOfParams.Case1``() = this.TestParameterInfoLocationOfParams("""^System.Console.WriteLine^(^"hel$lo"^)""") - [] + [] member public this.``LocationOfParams.Case2``() = this.TestParameterInfoLocationOfParams("""^System.Console.WriteLine^ (^ "hel$lo {0}" ,^ "Brian" ^)""") - [] + [] member public this.``LocationOfParams.Case3``() = this.TestParameterInfoLocationOfParams( """^System.Console.WriteLine^ @@ -1058,11 +996,11 @@ We really need to rewrite some code paths here to use the real parse tree rather "hel$lo {0}" ,^ "Brian" ^) """) - [] + [] member public this.``LocationOfParams.Case4``() = this.TestParameterInfoLocationOfParams("""^System.Console.WriteLine^ (^ "hello {0}" ,^ ("tuples","don't $ confuse it") ^)""") - [] + [] member public this.``ParameterInfo.LocationOfParams.Bug112688``() = let testLines = [ "let f x y = ()" @@ -1078,7 +1016,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let info = GetParameterInfoAtCursor file () - [] + [] member public this.``ParameterInfo.LocationOfParams.Bug112340``() = let testLines = [ """let a = typeof] - [] + [] member public this.``Regression.LocationOfParams.Bug91479``() = this.TestParameterInfoLocationOfParams("""let z = fun x -> x + ^System.Int16.Parse^(^$ """, markAtEOF=true) - [] + [] member public this.``LocationOfParams.Attributes.Bug230393``() = this.TestParameterInfoLocationOfParams(""" let paramTest((strA : string),(strB : string)) = @@ -1105,30 +1042,30 @@ We really need to rewrite some code paths here to use the real parse tree rather type RMB """) - [] + [] member public this.``LocationOfParams.InfixOperators.Case1``() = // infix operators like '+' do not give their own param info this.TestParameterInfoLocationOfParams("""^System.Console.WriteLine^(^"" + "$"^)""") - [] + [] member public this.``LocationOfParams.InfixOperators.Case2``() = // infix operators like '+' do give param info when used as prefix ops this.TestParameterInfoLocationOfParams("""System.Console.WriteLine((^+^)(^$3^)(4))""") - [] + [] member public this.``LocationOfParams.GenericMethodExplicitTypeArgs()``() = this.TestParameterInfoLocationOfParams(""" type T<'a> = static member M(x:int, y:string) = x + y.Length let x = ^T.M^(^1,^ $"test"^) """) - [] + [] member public this.``LocationOfParams.InsideAMemberOfAType``() = this.TestParameterInfoLocationOfParams(""" type Widget(z) = member x.a = (1 <> ^System.Int32.Parse^(^"$"^)) """) - [] + [] member public this.``LocationOfParams.InsidePropertyGettersAndSetters.Case1``() = this.TestParameterInfoLocationOfParams(""" type Widget(z) = @@ -1138,7 +1075,7 @@ We really need to rewrite some code paths here to use the real parse tree rather member x.P2 with get() = System.Int32.Parse("") member x.P2 with set(z) = System.Int32.Parse("") |> ignore """) - [] + [] member public this.``LocationOfParams.InsidePropertyGettersAndSetters.Case2``() = this.TestParameterInfoLocationOfParams(""" type Widget(z) = @@ -1148,7 +1085,7 @@ We really need to rewrite some code paths here to use the real parse tree rather member x.P2 with get() = System.Int32.Parse("") member x.P2 with set(z) = System.Int32.Parse("") |> ignore """) - [] + [] member public this.``LocationOfParams.InsidePropertyGettersAndSetters.Case3``() = this.TestParameterInfoLocationOfParams(""" type Widget(z) = @@ -1158,7 +1095,7 @@ We really need to rewrite some code paths here to use the real parse tree rather member x.P2 with get() = ^System.Int32.Parse^(^"$"^) member x.P2 with set(z) = System.Int32.Parse("") |> ignore """) - [] + [] member public this.``LocationOfParams.InsidePropertyGettersAndSetters.Case4``() = this.TestParameterInfoLocationOfParams(""" type Widget(z) = @@ -1168,48 +1105,46 @@ We really need to rewrite some code paths here to use the real parse tree rather member x.P2 with get() = System.Int32.Parse("") member x.P2 with set(z) = ^System.Int32.Parse^(^"$"^) |> ignore """) - [] + [] member public this.``LocationOfParams.InsideObjectExpression``() = this.TestParameterInfoLocationOfParams(""" let _ = { new ^System.Object^(^$^) with member _.GetHashCode() = 2}""") - [] + [] member public this.``LocationOfParams.Nested1``() = this.TestParameterInfoLocationOfParams("""System.Console.WriteLine("hello {0}" , ^sin^ (^4$2.0 ^) )""") - [] + [] member public this.``LocationOfParams.MatchGuard``() = this.TestParameterInfoLocationOfParams("""match [1] with | [x] when ^box^(^$x^) <> null -> ()""") - [] + [] member public this.``LocationOfParams.Nested2``() = this.TestParameterInfoLocationOfParams("""System.Console.WriteLine("hello {0}" , ^sin^ 4^$2.0^ )""") - [] + [] member public this.``LocationOfParams.Generics1``() = this.TestParameterInfoLocationOfParams(""" let f<'T,'U>(x:'T, y:'U) = (y,x) let r = ^f^(^4$2,^""^)""") - [] + [] member public this.``LocationOfParams.Generics2``() = this.TestParameterInfoLocationOfParams("""let x = ^System.Collections.Generic.Dictionary^(^42,^n$ull^)""") - [] + [] member public this.``LocationOfParams.Unions1``() = this.TestParameterInfoLocationOfParams(""" type MyDU = | FOO of int * string let r = ^FOO^(^42,^"$"^) """) - [] - [] + [] member public this.``LocationOfParams.EvenWhenOverloadResolutionFails.Case1``() = this.TestParameterInfoLocationOfParams("""let a = new ^System.IO.FileStream^(^$^)""") - [] - [] + [] member public this.``LocationOfParams.EvenWhenOverloadResolutionFails.Case2``() = this.TestParameterInfoLocationOfParams(""" open System.Collections.Generic @@ -1217,8 +1152,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let l = List([||]) ^l.Aggregate^(^$^) // was once a bug""") - [] - [] + [] member public this.``LocationOfParams.BY_DESIGN.WayThatMismatchedParensFailOver.Case1``() = // when only one 'statement' after the mismatched parens after a comma, the comma swallows it and it becomes a badly-indented // continuation of the expression from the previous line @@ -1229,8 +1163,7 @@ We really need to rewrite some code paths here to use the real parse tree rather ^c.M^(^1,^2,^3,^ $ c.M(1,2,3,4)""", markAtEOF=true) - [] - [] + [] member public this.``LocationOfParams.BY_DESIGN.WayThatMismatchedParensFailOver.Case2``() = // when multiple 'statements' after the mismatched parens after a comma, the parser sees a single argument to the method that // is a statement sequence, e.g. a bunch of discarded expressions. That is, @@ -1253,18 +1186,17 @@ We really need to rewrite some code paths here to use the real parse tree rather c.M(1,2,3,4) c.M(1,2,3,4)""", markAtEOF=true) - [] + [] member public this.``LocationOfParams.Tuples.Bug91360.Case1``() = this.TestParameterInfoLocationOfParams(""" ^System.Console.WriteLine^(^ (4$2,43) ^) // oops""") - [] + [] member public this.``LocationOfParams.Tuples.Bug91360.Case2``() = this.TestParameterInfoLocationOfParams(""" ^System.Console.WriteLine^(^ $(42,43) ^) // oops""") - [] - [] + [] member public this.``LocationOfParams.Tuples.Bug123219``() = this.TestParameterInfoLocationOfParams(""" type Expr = | Num of int @@ -1274,14 +1206,14 @@ We really need to rewrite some code paths here to use the real parse tree rather ^x.M1^(^(1,$ """, markAtEOF=true) - [] + [] member public this.``LocationOfParams.UnmatchedParens.Bug91609.OtherCases.Open``() = this.TestParameterInfoLocationOfParams(""" let arr = Array.create 4 1 arr.[1] <- ^System.Int32.Parse^(^$ open^ System""") - [] + [] member public this.``LocationOfParams.UnmatchedParens.Bug91609.OtherCases.Module``() = this.TestParameterInfoLocationOfParams(""" let arr = Array.create 4 1 @@ -1289,7 +1221,7 @@ We really need to rewrite some code paths here to use the real parse tree rather ^module Foo = let x = 42""") - [] + [] member public this.``LocationOfParams.UnmatchedParens.Bug91609.OtherCases.Namespace``() = this.TestParameterInfoLocationOfParams(""" namespace Foo @@ -1298,7 +1230,7 @@ We really need to rewrite some code paths here to use the real parse tree rather arr.[1] <- ^System.Int32.Parse^(^$ namespace^ Other""") - [] + [] member this.``LocationOfParams.InheritsClause.Bug192134``() = this.TestParameterInfoLocationOfParams(""" type B(x : int) = @@ -1306,7 +1238,7 @@ We really need to rewrite some code paths here to use the real parse tree rather type A() = inherit ^B^(^1$,^2^)""") - [] + [] member public this.``LocationOfParams.ThisOnceAsserted``() = this.TestNoParameterInfo(""" module CSVTypeProvider @@ -1325,7 +1257,7 @@ We really need to rewrite some code paths here to use the real parse tree rather match types |> Array.tryFind (fun ty -> ty.Name = typeName^) with _ -> ()""") - [] + [] member public this.``LocationOfParams.ThisOnceAssertedToo``() = this.TestNoParameterInfo(""" let readString() = @@ -1337,7 +1269,7 @@ We really need to rewrite some code paths here to use the real parse tree rather while true do ($) """) - [] + [] member public this.``LocationOfParams.UnmatchedParensBeforeModuleKeyword.Bug245850.Case2a``() = this.TestParameterInfoLocationOfParams(""" module Repro = @@ -1391,92 +1323,84 @@ We really need to rewrite some code paths here to use the real parse tree rather this.TestParameterInfoLocationOfParams (allText, markAtEOF=needMarkAtEnd, ?additionalReferenceAssemblies=additionalReferenceAssemblies) ) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Basic``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42 ^>""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.BasicNamed``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored=42 ^>""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix0``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ $ """, // missing all params, just have < markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42 """, // missing > markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix1Named``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored=42 """, // missing > markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ """, // missing last param markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix2Named1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored= """, // missing last param after name with equals markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Prefix2Named2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored """, // missing last param after name sans equals markAtEnd = true, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] + [] member public this.``LocationOfParams.TypeProviders.Negative1``() = this.TestNoParameterInfo(""" type D = ^System.Collections.Generic.Dictionary^<^ in$t, int ^>""") - [] + [] member public this.``LocationOfParams.TypeProviders.Negative2``() = this.TestNoParameterInfo(""" type D = ^System.Collections.Generic.List^<^ in$t ^>""") - [] + [] member public this.``LocationOfParams.TypeProviders.Negative3``() = this.TestNoParameterInfo(""" let i = 42 let b = ^i^<^ 4$2""") - [] + [] member public this.``LocationOfParams.TypeProviders.Negative4.Bug181000``() = this.TestNoParameterInfo(""" type U = ^N1.T^<^ "foo",^ 42 ^>$ """, // when the caret is right of the '>', we should not report any param info additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] + [] member public this.``LocationOfParams.TypeProviders.BasicWithinExpr``() = this.TestNoParameterInfo(""" let f() = @@ -1484,8 +1408,7 @@ We really need to rewrite some code paths here to use the real parse tree rather r """, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.BasicWithinExpr.DoesNotInterfereWithOuterFunction``() = this.TestParameterInfoLocationOfParams(""" let f() = @@ -1493,36 +1416,31 @@ We really need to rewrite some code paths here to use the real parse tree rather r """, additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42,^ ,^ ^>""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ,^ ^>""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case3``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ ,^$ ^>""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``LocationOfParams.TypeProviders.StaticParametersAtConstructorCallSite``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" let x = new ^N1.T^<^ "fo$o",^ 42 ^>()""", additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] + [] member public this.``TypeProvider.FormatOfNamesOfSystemTypes``() = let code = ["""type TTT = N1.T< "foo", ParamIgnored=42 > """] let references = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] @@ -1530,7 +1448,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let gpatcc = GlobalParseAndTypeCheckCounter.StartNew(this.VS) MoveCursorToEndOfMarker(file,"foo") let methodGroup = GetParameterInfoAtCursor file - Assert.IsTrue(methodGroup.IsSome, "expected parameter info") + Assert.True(methodGroup.IsSome, "expected parameter info") let methodGroup = methodGroup.Value let actualDisplays = [ for i = 0 to methodGroup.GetCount() - 1 do @@ -1541,7 +1459,7 @@ We really need to rewrite some code paths here to use the real parse tree rather AssertEqual(expected, actualDisplays) gpatcc.AssertExactly(0,0) - [] + [] member public this.``ParameterNamesInFunctionsDefinedByLetBindings``() = let useCases = [ @@ -1583,13 +1501,13 @@ We really need to rewrite some code paths here to use the real parse tree rather MoveCursorToEndOfMarker(file, marker) let methodGroup = GetParameterInfoAtCursor file - Assert.IsTrue(methodGroup.IsSome, "expected parameter info") + Assert.True(methodGroup.IsSome, "expected parameter info") let methodGroup = methodGroup.Value - Assert.AreEqual(1, methodGroup.GetCount(), "Only one function expected") + Assert.Equal(1, methodGroup.GetCount()) let expectedParamsCount = List.length expectedParams - Assert.AreEqual(expectedParamsCount, methodGroup.GetParameterCount(0), sprintf "%d parameters expected" expectedParamsCount) + Assert.Equal(expectedParamsCount, methodGroup.GetParameterCount(0)) let actualParams = [ for i = 0 to (expectedParamsCount - 1) do yield methodGroup.GetParameterInfo(0, i) ] let ok = @@ -1600,15 +1518,15 @@ We really need to rewrite some code paths here to use the real parse tree rather printfn "==Parameters don't match==" printfn "Expected parameters %A" expectedParams printfn "Actual parameters %A" actualParams - Assert.Fail() + failwith "Parameters don't match" (* Tests for multi-parameterinfos ------------------------------------------------------------------ *) - [] + [] member public this.``ParameterInfo.ArgumentsWithParamsArrayAttribute``() = let content = """let _ = System.String.Format("",(*MARK*))""" let methodTip = this.GetMethodListForAMethodTip(content, "(*MARK*)") - Assert.IsTrue(methodTip.IsSome, "expected parameter info") + Assert.True(methodTip.IsSome, "expected parameter info") let methodTip = methodTip.Value let overloadWithTwoParamsOpt = @@ -1627,16 +1545,16 @@ We really need to rewrite some code paths here to use the real parse tree rather ) |> Seq.tryFind(fun (i, _) -> i = 2) match overloadWithTwoParamsOpt with - | Some(_, [_;(_name, display, _description)]) -> Assert.IsTrue(display.Contains("[] args")) + | Some(_, [_;(_name, display, _description)]) -> Assert.True(display.Contains("[] args")) | x -> Assert.Fail(sprintf "Expected overload not found, current result %A" x) (* DotNet functions for multi-parameterinfo tests -------------------------------------------------- *) - [] + [] member public this.``Multi.DotNet.StaticMethod``() = let fileContents = """System.Console.WriteLine("Today is {0:dd MMM yyyy}",(*Mark*)System.DateTime.Today)""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string";"obj"]) - [] + [] member public this.``Multi.DotNet.StaticMethod.WithinClassMember``() = let fileContents = """ type Widget(z) = @@ -1646,18 +1564,17 @@ We really need to rewrite some code paths here to use the real parse tree rather 45""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string";"System.Globalization.NumberStyles"]) - [] - [] + [] member public this.``Multi.DotNet.StaticMethod.WithinLambda``() = let fileContents = """let z = fun x -> x + System.Int16.Parse("",(*Mark*)""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string";"System.Globalization.NumberStyles"]) - [] + [] member public this.``Multi.DotNet.StaticMethod.WithinLambda2``() = let fileContents = "let _ = fun file -> new System.IO.FileInfo((*Mark*)" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["string"]]) - [] + [] member public this.``Multi.DotNet.InstanceMethod``() = let fileContents = """ let s = "Hello" @@ -1665,18 +1582,17 @@ We really need to rewrite some code paths here to use the real parse tree rather this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["int";"int"]) (* Common functions for multi-parameterinfo tests -------------------------------------------------- *) - [] - [] + [] member public this.``Multi.DotNet.Constructor``() = let fileContents = "let _ = new System.DateTime(2010,12,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["int";"int";"int"]) - [] + [] member public this.``Multi.Constructor.WithinObjectExpression``() = let fileContents = "let _ = { new System.Object((*Mark*)) with member _.GetHashCode() = 2}" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",[]) - [] + [] member public this.``Multi.Function.InTheClassMember``() = let fileContents = """ type Foo() = @@ -1687,14 +1603,14 @@ We really need to rewrite some code paths here to use the real parse tree rather member this.A(a : string, b:int) = ()""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"int"]]) - [] + [] member public this.``Multi.ParamAsTupleType``() = let fileContents = """ let tuple((a : int, b : int), c : int) = a * b + c let result = tuple((1, 2)(*Mark*), 3)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int * int";"int"]]) - [] + [] member public this.``Multi.ParamAsCurryType``() = let fileContents = """ let multi (x : float) (y : float) = 0 @@ -1702,7 +1618,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let rtnValue = sum(multi (1.0(*Mark*)) 3.0, 5)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["float"]]) - [] + [] member public this.``Multi.MethodInMatchCause``() = let fileContents = """ let rec f l = @@ -1711,8 +1627,7 @@ We really need to rewrite some code paths here to use the real parse tree rather | x :: xs -> f xs""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string";"obj"]) - [] - [] + [] member public this.``Regression.Multi.IndexerProperty.Bug93945``() = let fileContents = """ type Year2(year : int) = @@ -1729,8 +1644,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let randomDay = O'seven.[12,(*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"int"]]) - [] - [] + [] member public this.``Regression.Multi.ExplicitAnnotate.Bug93188``() = let fileContents = """ type LiveAnimalAttribute(a : int, b: string) = @@ -1740,7 +1654,7 @@ We really need to rewrite some code paths here to use the real parse tree rather type Wombat() = class end""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"string"]]) - [] + [] member public this.``Multi.Function.WithRecordType``() = let fileContents = """ type Vector = @@ -1749,7 +1663,7 @@ We really need to rewrite some code paths here to use the real parse tree rather foo(12, { X = 10.0; Y = (*Mark*)20.0; Z = 30.0 })""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"Vector"]]) - [] + [] member public this.``Multi.Function.AsParameter``() = let fileContents = """ let isLessThanZero x = (x < 0) @@ -1761,15 +1675,14 @@ We really need to rewrite some code paths here to use the real parse tree rather let _ = Option.get(containsNegativeNumbers [6; 20; (*Mark*)8; 45; 5])""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int list"]]) - [] - [] + [] member public this.``Multi.Function.WithOptionType``() = let fileContents = """ let foo( a : int option, b : string ref) = 0 let _ = foo(Some(12),(*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int option";"string ref"]]) - [] + [] member public this.``Multi.Function.WithOptionType2``() = let fileContents = """ let multi (x : float) (y : float) = x * y @@ -1778,8 +1691,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let rtnOption = options(Some(sum(1, 3)), (*Mark*)Some(multi 3.1 5.0)) """ this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int option";"float option"]]) - [] - [] + [] member public this.``Multi.Function.WithRefType``() = let fileContents = """ let foo( a : int ref, b : string ref) = 0 @@ -1788,12 +1700,12 @@ We really need to rewrite some code paths here to use the real parse tree rather (* Overload list/Adjust method's param for multi-parameterinfo tests ------------------------------ *) - [] + [] member public this.``Multi.OverloadMethod.OrderedParameters``() = let fileContents = "new System.DateTime(2000,12,(*Mark*)" this.VerifyParameterInfoOverloadMethodIndex(fileContents,"(*Mark*)",3(*The fourth method*),["int";"int";"int"]) - [] + [] member public this.``Multi.Overload.WithSameParameterCount``() = let fileContents = """ type Foo() = @@ -1803,7 +1715,7 @@ We really need to rewrite some code paths here to use the real parse tree rather foo.A1(1,1,(*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"int";"string";"bool"];["int";"string";"int";"bool"]]) - [] + [] member public this.``ExtensionMethod.Overloads``() = let fileContents = """ module MyCode = @@ -1819,8 +1731,7 @@ We really need to rewrite some code paths here to use the real parse tree rather foo.Method((*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["string"];["int"]]) - [] - [] + [] member public this.``ExtensionProperty.Overloads``() = let fileContents = """ module MyCode = @@ -1838,68 +1749,66 @@ We really need to rewrite some code paths here to use the real parse tree rather (* Generic functions for multi-parameterinfo tests ------------------------------------------------ *) - [] + [] member public this.``Multi.Generic.ExchangeInt``() = let fileContents = "System.Threading.Interlocked.Exchange(123,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["byref";"int"]) - [] + [] member public this.``Multi.Generic.Exchange.``() = let fileContents = "System.Threading.Interlocked.Exchange(12.0,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["byref";"float"]) - [] + [] member public this.``Multi.Generic.ExchangeUnder``() = let fileContents = "System.Threading.Interlocked.Exchange<_> (obj,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["byref";"obj"]) - [] + [] member public this.``Multi.Generic.Dictionary``() = let fileContents = "System.Collections.Generic.Dictionary<_, option>(12,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["int";"System.Collections.Generic.IEqualityComparer"]) - [] - [] + [] member public this.``Multi.Generic.HashSet``() = let fileContents = "System.Collections.Generic.HashSet({ 1 ..12 },(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["Seq<'a>";"System.Collections.Generic.IEqualityComparer<'a>"]) - [] - [] + [] member public this.``Multi.Generic.SortedList``() = let fileContents = "System.Collections.Generic.SortedList<_,option> (12,(*Mark*)" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["int";"System.Collections.Generic.IComparer<'TKey>"]) (* No Param Info Shown for multi-parameterinfo tests ---------------------------------------------- *) - [] + [] member public this.``ParameterInfo.Multi.NoParameterInfo.InComments``() = let fileContents = "//let _ = System.Object((*Mark*))" this.VerifyNoParameterInfoAtStartOfMarker(fileContents,"(*Mark*)") - [] + [] member public this.``Multi.NoParameterInfo.InComments2``() = let fileContents = """(*System.Console.WriteLine((*Mark*)"Test on Fsharp style comments.")*)""" this.VerifyNoParameterInfoAtStartOfMarker(fileContents,"(*Mark*)") - [] + [] member public this.``Multi.NoParameterInfo.OnFunctionDeclaration``() = let fileContents = "let Foo(x : int, (*Mark*)b : string) = ()" this.VerifyNoParameterInfoAtStartOfMarker(fileContents,"(*Mark*)") - [] + [] member public this.``Multi.NoParameterInfo.WithinString``() = let fileContents = """let s = "new System.DateTime(2000,12(*Mark*)" """ this.VerifyNoParameterInfoAtStartOfMarker(fileContents,"(*Mark*)") - [] + [] member public this.``Multi.NoParameterInfo.OnProperty``() = let fileContents = """ let s = "Hello" let _ = s.Length(*Mark*)""" this.VerifyNoParameterInfoAtStartOfMarker(fileContents,"(*Mark*)") - [] + [] member public this.``Multi.NoParameterInfo.OnValues``() = let fileContents = """ type Foo = class @@ -1911,13 +1820,13 @@ We really need to rewrite some code paths here to use the real parse tree rather (* Regression tests/negative tests for multi-parameterinfos --------------------------------------- *) // To be added when the bugs are fixed... - [] + [] //[] member public this.``Regression.ParameterWithOperators.Bug90832``() = let fileContents = """System.Console.WriteLine("This(*Mark*) is a" + " bug.")""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string"]) - [] + [] member public this.``Regression.OptionalArguments.Bug4042``() = let fileContents = """ module ParameterInfo @@ -1932,7 +1841,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let tt = TT((*Mark*)""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["int";"int"]]) - [] + [] //[] member public this.``Regression.ParameterFirstTypeOpenParen.Bug90798``() = let fileContents = """ @@ -1942,7 +1851,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let p = 10""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["'Arg -> Async<'T>"]]) - [] + [] // regression test for bug 3878: no parameter info triggered by "(" member public this.``Regression.NoParameterInfoTriggeredByOpenBrace.Bug3878``() = let fileContents = """ @@ -1954,7 +1863,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let y = 1""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",[""]) - [] + [] // regression test for bug 4495 : Should alway sort method lists in order of argument count member public this.``Regression.MethodSortedByArgumentCount.Bug4495.Case1``() = let fileContents = """ @@ -1964,7 +1873,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let m = a1.GetType("System.Decimal").GetConstructor((*Mark*)null)""" this.VerifyParameterInfoOverloadMethodIndex(fileContents,"(*Mark*)",0,["System.Type array"]) - [] + [] member public this.``Regression.MethodSortedByArgumentCount.Bug4495.Case2``() = let fileContents = """ module ParameterInfo @@ -1976,8 +1885,7 @@ We really need to rewrite some code paths here to use the real parse tree rather "System.Type array"; "System.Reflection.ParameterModifier array"]) - [] - [] + [] member public this.``BasicBehavior.WithReference``() = let fileContents = """ open System.ServiceModel @@ -1991,22 +1899,20 @@ We really need to rewrite some code paths here to use the real parse tree rather let expected = ["System.Type";"System.Uri []"] AssertMethodGroupContain(methodstr,expected) - [] + [] member public this.``BasicBehavior.CommonFunction``() = let fileContents = """ let f(x) = 1 f((*Mark*))""" this.VerifyParameterInfoAtStartOfMarker(fileContents,"(*Mark*)",[["'a"]]) - [] + [] member public this.``BasicBehavior.DotNet.Static``() = let fileContents = """System.String.Format((*Mark*)""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Mark*)",["string";"obj array"]) (*------------------------------------------IDE Query automation start -------------------------------------------------*) - [] - [] - [] + [] // ParamInfo works normally for calls as query operator arguments // works fine In nested queries member public this.``Query.InNestedQuery``() = @@ -2025,11 +1931,9 @@ We really need to rewrite some code paths here to use the real parse tree rather this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker1*)",["obj"],queryAssemblyRefs) this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker2*)",["string";"obj array"],queryAssemblyRefs) - [] - [] + [] // ParamInfo works normally for calls as query operator arguments // ParamInfo Still works when an error exists - [] member public this.``Query.WithErrors``() = let fileContents = """ let tuples = [ (1, 8, 9); (56, 45, 3)] @@ -2041,10 +1945,8 @@ We really need to rewrite some code paths here to use the real parse tree rather }""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker*)",["obj"],queryAssemblyRefs) - [] - [] + [] // ParamInfo works normally for calls as query operator arguments - [] member public this.``Query.OperatorWithParentheses``() = let fileContents = """ type Product() = @@ -2070,8 +1972,7 @@ We really need to rewrite some code paths here to use the real parse tree rather this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker1*)",[],queryAssemblyRefs) this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker2*)",[],queryAssemblyRefs) - [] - [] + [] // ParamInfo works normally for calls as query operator arguments // ParamInfo Still works when there is an optional argument member public this.``Query.OptionalArgumentsInQuery``() = @@ -2094,11 +1995,9 @@ We really need to rewrite some code paths here to use the real parse tree rather }""" this.VerifyParameterInfoContainedAtStartOfMarker(fileContents,"(*Marker*)",["int";"int"],queryAssemblyRefs) - [] - [] + [] // ParamInfo works normally for calls as query operator arguments // ParamInfo Still works when there are overload methods with the same param count - [] member public this.``Query.OverloadMethod.InQuery``() = let fileContents = """ let numbers = [ 1;2; 8; 9; 15; 23; 3; 42; 4;0; 55;] @@ -2118,6 +2017,5 @@ We really need to rewrite some code paths here to use the real parse tree rather // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs index 1d62dd3c399..1df4a6a6413 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs @@ -3,21 +3,20 @@ namespace Tests.LanguageService.QuickInfo open System -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem +open Xunit [] module QuickInfoStandardSettings = let standard40AssemblyRefs = [ "System"; "System.Core"; "System.Numerics" ] let queryAssemblyRefs = [ "System.Xml.Linq"; "System.Core" ] -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -41,8 +40,8 @@ type UsingMSBuild() = let checkTooltip expected ((tooltip, span : TextSpan), (row, col)) = AssertContains(tooltip, expected) // cursor should be inside the span - Assert.IsTrue(row = (span.iStartLine + 1) && row = (span.iEndLine + 1), "Cursor should be one the same line with the tooltip span") - Assert.IsTrue(col >= span.iStartIndex && col <= span.iEndIndex, "Cursor should be located inside the span") + Assert.True(row = (span.iStartLine + 1) && row = (span.iEndLine + 1), "Cursor should be one the same line with the tooltip span") + Assert.True(col >= span.iStartIndex && col <= span.iEndIndex, "Cursor should be located inside the span") // (* Tests for QuickInfos ---------------------------------------------------------------- *) @@ -118,7 +117,7 @@ type UsingMSBuild() = let tooltip = time1 GetQuickInfoAtCursor file "Time of first tooltip" AssertContainsInOrder(tooltip, expectedExactOrder) - [] + [] member public this.``NestedTypesOrder``() = this.VerifyOrderOfNestedTypesInQuickInfo( source = "type t = System.Runtime.CompilerServices.RuntimeHelpers(*M*)", @@ -126,7 +125,7 @@ type UsingMSBuild() = expectedExactOrder = ["GetHashCode"; "GetObjectValue"] ) - [] + [] member public this.``Operators.TopLevel``() = let source = """ /// tooltip for operator @@ -137,10 +136,10 @@ type UsingMSBuild() = code = source, marker = "== \"\"", atStart = true, - f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.IsTrue(text.Contains "tooltip for operator")) + f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.True(text.Contains "tooltip for operator")) ) - [] + [] member public this.``Operators.Member``() = let source = """ type U = U @@ -153,10 +152,10 @@ type UsingMSBuild() = code = source, marker = "++ U", atStart = true, - f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.IsTrue(text.Contains "tooltip for operator")) + f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.True(text.Contains "tooltip for operator")) ) - [] + [] member public this.``QuickInfo.HiddenMember``() = // Tooltips showed hidden members - #50 let source = """ @@ -174,10 +173,10 @@ type UsingMSBuild() = code = source, marker = "ypeU =", atStart = true, - f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.IsFalse(text.Contains "member _Print")) + f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.False(text.Contains "member _Print")) ) - [] + [] member public this.``QuickInfo.ObsoleteMember``() = // Tooltips showed obsolete members - #50 let source = """ @@ -193,11 +192,10 @@ type UsingMSBuild() = code = source, marker = "ypeU =", atStart = true, - f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.IsFalse(text.Contains "member Print1")) + f = (fun ((text, _), _) -> printfn "actual %s" text; Assert.False(text.Contains "member Print1")) ) - [] - [] + [] member public this.``QuickInfo.HideBaseClassMembersTP``() = let fileContents = "type foo = HiddenMembersInBaseClass.HiddenBaseMembersTP(*Marker*)" @@ -207,7 +205,7 @@ type UsingMSBuild() = expected = "type HiddenBaseMembersTP =\n inherit TPBaseTy", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] + [] member public this.``QuickInfo.OverridenMethods``() = let source = """ type A() = @@ -231,10 +229,10 @@ type UsingMSBuild() = code = source, marker = marker, atStart = false, - f = (fun ((text : string, _), _) -> printfn "expected %s, actual %s" expected text; Assert.IsTrue (text.Contains(expected))) + f = (fun ((text : string, _), _) -> printfn "expected %s, actual %s" expected text; Assert.True (text.Contains(expected))) ) - [] + [] member public this.``QuickInfoForQuotedIdentifiers``() = let source = """ /// The fff function @@ -246,7 +244,7 @@ type UsingMSBuild() = for i = 1 to (identifier.Length - 1) do let marker = "+ " + (identifier.Substring(0, i)) this.CheckTooltip (source, marker, false, checkTooltip "gg gg") - [] + [] member public this.``QuickInfoSingleCharQuotedIdentifier``() = let source = """ let ``x`` = 10 @@ -254,7 +252,7 @@ type UsingMSBuild() = """ this.CheckTooltip(source, "x``|>", true, checkTooltip "x") - [] + [] member public this.QuickInfoForTypesWithHiddenRepresentation() = let source = """ let x = Async.AsBeginEnd @@ -277,9 +275,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.CheckTooltip(source, "Asyn", false, checkTooltip expectedTooltip) - [] - [] - [] + [] member public this.``TypeProviders.NestedTypesOrder``() = let code = "type t = N1.TypeWithNestedTypes(*M*)" let tpReference = PathRelativeToTestAssembly( @"DummyProviderForLanguageServiceTesting.dll") @@ -290,7 +286,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") extraRefs = [tpReference] ) - [] + [] member public this.``GetterSetterInsideInterfaceImpl.ThisOnceAsserted``() = let fileContent =""" type IFoo = @@ -304,7 +300,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker(fileContent, "id", "Operators.id") //regression test for bug 3184 -- intellisense should normalize to ¡°int[]¡± so that [] is not mistaken for list. - [] + [] member public this.IntArrayQuickInfo() = let fileContents = """ @@ -315,7 +311,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "y(*MInt[]*)", "int array") //Verify no quickinfo -- link name string have - [] + [] member public this.LinkNameStringQuickInfo() = let fileContents = """ @@ -326,11 +322,8 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "\"x\"(*Marker1*)", "") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "\"y\"(*Marker2*)", "") - [] - [] - [] + [] //This is to test the correct TypeProvider Type message is shown or not in the TypeProviderXmlDocAttribute - [] member public this.``TypeProvider.XmlDocAttribute.Type.Comment``() = let fileContents = """ @@ -339,10 +332,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic type created by me!", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) - [] - [] - [] - [] + [] //This is to test for long message in the TypeProviderXmlDocAttribute for TypeProvider Type member public this.``TypeProvider.XmlDocAttribute.Type.WithLongComment``() = @@ -353,10 +343,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic type created by me!. Which is used to test the tool tip of the typeprovider type to check if it shows the right message or not.", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) - [] - [] - [] - [] + [] //This is to test when the message is null in the TypeProviderXmlDocAttribute for TypeProvider Type member public this.``TypeProvider.XmlDocAttribute.Type.WithNullComment``() = @@ -367,10 +354,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "type T =\n new: unit -> T\n static member M: unit -> int []\n static member StaticProp: decimal\n member Event1: EventHandler", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) - [] - [] - [] - [] + [] //This is to test when there is empty message from the TypeProviderXmlDocAttribute for TypeProvider Type member public this.``TypeProvider.XmlDocAttribute.Type.WithEmptyComment``() = @@ -382,10 +366,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) - [] - [] - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Type member public this.``TypeProvider.XmlDocAttribute.Type.LocalizedComment``() = @@ -396,11 +377,8 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic type Localized! ኤፍ ሻርፕ", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) - [] - [] - [] + [] //This is to test the correct TypeProvider Constructor message is shown or not in the TypeProviderXmlDocAttribute - [] member public this.``TypeProvider.XmlDocAttribute.Constructor.Comment``() = let fileContents = """ @@ -409,10 +387,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic .ctor created by me for N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) - [] - [] - [] - [] + [] //This is to test for long message in the TypeProviderXmlDocAttribute for TypeProvider Constructor member public this.``TypeProvider.XmlDocAttribute.Constructor.WithLongComment``() = @@ -423,10 +398,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic .ctor created by me for N.T. Which is used to test the tool tip of the typeprovider Constructor to check if it shows the right message or not.", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) - [] - [] - [] - [] + [] //This is to test when the message is null in the TypeProviderXmlDocAttribute for TypeProvider Constructor member public this.``TypeProvider.XmlDocAttribute.Constructor.WithNullComment``() = @@ -437,10 +409,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "N.T() : N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) - [] - [] - [] - [] + [] //This is to test when there is empty message from the TypeProviderXmlDocAttribute for TypeProvider Constructor member public this.``TypeProvider.XmlDocAttribute.Constructor.WithEmptyComment``() = @@ -451,10 +420,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "N.T() : N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) - [] - [] - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Constructor member public this.``TypeProvider.XmlDocAttribute.Constructor.LocalizedComment``() = @@ -466,10 +432,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) - [] - [] - [] - [] + [] //This is to test the correct TypeProvider event message is shown or not in the TypeProviderXmlDocAttribute member public this.``TypeProvider.XmlDocAttribute.Event.Comment``() = @@ -481,10 +444,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *event* created by me for N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) - [] - [] - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Event member public this.``TypeProvider.XmlDocAttribute.Event.LocalizedComment``() = @@ -496,8 +456,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *event* Localized! ኤፍ ሻርፕ for N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Event member public this.``TypeProvider.ParamsAttributeTest``() = @@ -506,10 +465,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtEndOfMarker (fileContents, "Spl", "[] separator") - [] - [] - [] - [] + [] //This is to test for long message in the TypeProviderXmlDocAttribute for TypeProvider Event member public this.``TypeProvider.XmlDocAttribute.Event.WithLongComment``() = @@ -521,10 +477,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *event* created by me for N.T. Which is used to test the tool tip of the typeprovider Event to check if it shows the right message or not.!", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) - [] - [] - [] - [] + [] //This is to test when the message is null in the TypeProviderXmlDocAttribute for TypeProvider Event member public this.``TypeProvider.XmlDocAttribute.Event.WithNullComment``() = @@ -536,10 +489,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "member N.T.Event1: IEvent", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) - [] - [] - [] - [] + [] //This is to test when there is empty message from the TypeProviderXmlDocAttribute for TypeProvider Event member public this.``TypeProvider.XmlDocAttribute.Event.WithEmptyComment``() = @@ -552,10 +502,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) - [] - [] - [] - [] + [] //This is to test the correct TypeProvider Method message is shown or not in the TypeProviderXmlDocAttribute member public this.``TypeProvider.XmlDocAttribute.Method.Comment``() = @@ -566,10 +513,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *method* created by me!!", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) - [] - [] - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Method member public this.``TypeProvider.XmlDocAttribute.Method.LocalizedComment``() = @@ -580,10 +524,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *method* Localized! ኤፍ ሻርፕ", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) - [] - [] - [] - [] + [] //This is to test for long message in the TypeProviderXmlDocAttribute for TypeProvider Method member public this.``TypeProvider.XmlDocAttribute.Method.WithLongComment``() = @@ -594,10 +535,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *method* created by me!!. Which is used to test the tool tip of the typeprovider Method to check if it shows the right message or not.!", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) - [] - [] - [] - [] + [] //This is to test when the message is null in the TypeProviderXmlDocAttribute for TypeProvider Method member public this.``TypeProvider.XmlDocAttribute.Method.WithNullComment``() = @@ -608,10 +546,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "N.T.M() : int array", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) - [] - [] - [] - [] + [] //This is to test when there is empty message from the TypeProviderXmlDocAttribute for TypeProvider Method member public this.``TypeProvider.XmlDocAttribute.Method.WithEmptyComment``() = @@ -623,10 +558,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) - [] - [] - [] - [] + [] //This is to test the correct TypeProvider Property message is shown or not in the TypeProviderXmlDocAttribute member public this.``TypeProvider.XmlDocAttribute.Property.Comment``() = @@ -637,10 +569,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *property* created by me for N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) - [] - [] - [] - [] + [] //This is to test the multi-language in the TypeProviderXmlDocAttribute for TypeProvider Property member public this.``TypeProvider.XmlDocAttribute.Property.LocalizedComment``() = @@ -651,10 +580,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *property* Localized! ኤፍ ሻርፕ for N.T", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) - [] - [] - [] - [] + [] //This is to test for long message in the TypeProviderXmlDocAttribute for TypeProvider Property member public this.``TypeProvider.XmlDocAttribute.Property.WithLongComment``() = @@ -665,10 +591,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "This is a synthetic *property* created by me for N.T. Which is used to test the tool tip of the typeprovider Property to check if it shows the right message or not.!", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) - [] - [] - [] - [] + [] //This is to test when the message is null in the TypeProviderXmlDocAttribute for TypeProvider Property member public this.``TypeProvider.XmlDocAttribute.Property.WithNullComment``() = @@ -679,10 +602,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "property N.T.StaticProp: decimal", addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) - [] - [] - [] - [] + [] //This is to test when there is empty message from the TypeProviderXmlDocAttribute for TypeProvider Property member public this.``TypeProvider.XmlDocAttribute.Property.WithEmptyComment``() = @@ -694,10 +614,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) - [] - [] - [] - [] + [] //This test case Verify that when Hover over foo the correct quickinfo is displayed for TypeProvider static parameter //Dummy Type Provider exposes a parametric type (N1.T) that takes 2 static params (string * int) member public this.``TypeProvider.StaticParameters.Correct``() = @@ -711,9 +628,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") expected = "type foo = N1.T", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] //This test case Verify that when Hover over foo the correct quickinfo is displayed //Dummy Type Provider exposes a parametric type (N1.T) that takes 2 static params (string * int) //As you can see this is "Negative Case" to check that when given invalid static Parameter quickinfo shows "type foo = obj" @@ -728,9 +643,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") expected = "type foo", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] + [] //This test case Verify that when Hover over foo the XmlComment is shown in quickinfo //Dummy Type Provider exposes a parametric type (N1.T) that takes 2 static params (string * int) member public this.``TypeProvider.StaticParameters.XmlComment``() = @@ -745,10 +658,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") expected = "XMLComment", addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] member public this.``TypeProvider.StaticParameters.QuickInfo.OnTheErasedType``() = let fileContents = """type TTT = Samples.FSharp.RegexTypeProvider.RegexTyped< @"(?^\d{3})-(?\d{3}-\d{7}$)">""" this.AssertQuickInfoContainsAtStartOfMarker( @@ -757,10 +667,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") expected = "type TTT = Samples.FSharp.RegexTypeProvider.RegexTyped<...>\nFull name: File1.TTT", addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) - [] - [] - [] - [] + [] member public this.``TypeProvider.StaticParameters.QuickInfo.OnNestedErasedTypeProperty``() = let fileContents = """ type T = Samples.FSharp.RegexTypeProvider.RegexTyped< @"(?^\d{3})-(?\d{3}-\d{7}$)"> @@ -774,7 +681,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) // Regression for 2948 - [] + [] member public this.TypeRecordQuickInfo() = let fileContents = """namespace NS @@ -783,7 +690,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.InfoInDeclarationTestQuickInfoImplWithTrim fileContents "Re(*MarkerRecord*)" expectedQuickinfoTypeRecord - [] + [] member public this.``QuickInfo.LetBindingsInTypes``() = let code = """ @@ -793,7 +700,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtEndOfMarker(code, "let ff", "val fff: n: int -> int") // Regression for 2494 - [] + [] member public this.TypeConstructorQuickInfo() = let fileContents = """ @@ -827,7 +734,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.InfoInDeclarationTestQuickInfoImplWithTrim fileContents "pq(*MarkerVal*)" expectedquickinfoVal this.InfoInDeclarationTestQuickInfoImplWithTrim fileContents "singleton(*MarkerLastLine*)" expectedquickinfoLastLine - [] + [] member public this.NamedDUFieldQuickInfo() = let fileContents = """ @@ -851,60 +758,60 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.InfoInDeclarationTestQuickInfoImplWithTrim fileContents "Case3(*MarkerCase3*)" expectedquickinfoCase3 this.InfoInDeclarationTestQuickInfoImplWithTrim fileContents "NamedExn(*MarkerException*)" expectedquickinfoException - [] + [] member public this.``EnsureNoAssertFromBadParserRangeOnAttribute``() = let fileContents = """ [] Types foo = int""" this.AssertQuickInfoContainsAtEndOfMarker (fileContents, "ype", "") // just want to ensure there is no assertion fired by the parse tree walker - [] + [] member public this.``ShiftKeyDown``() = ShiftKeyDown(this.VS) this.AssertQuickInfoContainsAtEndOfMarker ("""#light""","#ligh","") - [] + [] member public this.``ActivePatterns.Declaration``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let ( |One|Two| ) x = One(x+1)""","ne|Tw","int -> Choice") - [] + [] member public this.``ActivePatterns.Result``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let ( |One|Two| ) x = One(x+1)""","= On","active pattern result One: int -> Choice") - [] + [] member public this.``ActivePatterns.Value``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let ( |One|Two| ) x = One(x+1) let patval = (|One|Two|) // use""","= (|On","int -> Choice") - [] + [] member public this.``Regression.InDeclaration.Bug3176a``() = this.AssertQuickInfoContainsAtEndOfMarker ("""type T<'a> = { aaaa : 'a; bbbb : int } ""","aa","aaaa") - [] + [] member public this.``Regression.InDeclaration.Bug3176c``() = this.AssertQuickInfoContainsAtEndOfMarker ("""type C = val aaaa: int""","aa","aaaa") - [] + [] member public this.``Regression.InDeclaration.Bug3176d``() = this.AssertQuickInfoContainsAtEndOfMarker ("""type DU<'a> = | DULabel of 'a""","DULab","DULabel") - [] + [] member public this.``Regression.Generic.3773a``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let rec M2<'a>(a:'a) = M2(a)""","let rec M","val M2: a: 'a -> obj") // Before this fix, if the user hovered over 'cccccc' they would see 'Yield' - [] + [] member public this.``Regression.ComputationExpressionMemberAppearingInQuickInfo``() = this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker """ @@ -921,7 +828,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") // they would see a quickinfo for any available function named get or set. // The tests below define a get function with 'let' and then test to make sure that // this isn't the get seen in the tool tip. - [] + [] member public this.``Regression.AccessorMutator.Bug4903a``() = this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker """namespace CountChocula @@ -932,7 +839,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" "with g" "string" - [] + [] member public this.``Regression.AccessorMutator.Bug4903d``() = this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker """namespace CountChocula @@ -943,7 +850,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" "AMetho" "string" - [] + [] member public this.``Regression.AccessorMutator.Bug4903b``() = this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker """namespace CountChocula @@ -954,7 +861,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" "and s" "seq" - [] + [] member public this.``Regression.AccessorMutator.Bug4903c``() = this.AssertQuickInfoContainsAtEndOfMarker ("""namespace CountChocula @@ -966,7 +873,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") "let g","string") - [] + [] member public this.``ParamsArrayArgument.OnType``() = this.AssertQuickInfoContainsAtEndOfMarker (""" @@ -975,7 +882,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") let r = A.Foo(42)""" , "type A","[] a:" ) - [] + [] member public this.``ParamsArrayArgument.OnMethod``() = this.AssertQuickInfoContainsAtEndOfMarker (""" @@ -984,7 +891,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") let r = A.Foo(42)""" , "A.Foo","[] a:" ) - [] + [] member public this.``Regression.AccessorMutator.Bug4903e``() = this.AssertQuickInfoContainsAtEndOfMarker ("""namespace CountChocula @@ -995,7 +902,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" , "member source.Pr","Prop" ) - [] + [] member public this.``Regression.AccessorMutator.Bug4903f``() = this.AssertQuickInfoContainsAtEndOfMarker ("""namespace CountChocula @@ -1006,7 +913,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" , "member source.Pr","int" ) - [] + [] member public this.``Regression.AccessorMutator.Bug4903g``() = this.AssertQuickInfoContainsAtEndOfMarker ("""namespace CountChocula @@ -1017,13 +924,13 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") and set(value:int) : unit = ()""" , "member sou","source" ) - [] + [] member public this.``Regression.RecursiveDefinition.Generic.3773b``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let rec M1<'a>(a:'a) = M1(0)""","let rec M","val M1: a: int -> 'a") //regression test for bug Dev11:138110 - "F# language service hover tip for ITypeProvider does now show Invalidate event" - [] + [] member public this.``Regression.ImportedEvent.138110``() = let fileContents = """ open Microsoft.FSharp.Core.CompilerServices @@ -1036,17 +943,17 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate - [] + [] member public this.``Declaration.CyclicalDeclarationDoesNotCrash``() = this.AssertQuickInfoContainsAtEndOfMarker ("""type (*1*)A = int * (*2*)A ""","(*2*)","type A") - [] + [] member public this.``JustAfterIdentifier``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let f x = x + 1 ""","let f","int") - [] + [] member public this.``FrameworkClass``() = let fileContent = """let l = new System.Collections.Generic.List()""" let marker = "Generic.List" @@ -1057,14 +964,14 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent marker "get_Count" this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent marker "set_Count" - [] + [] member public this.``FrameworkClassNoMethodImpl``() = this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker """let l = new System.Collections.Generic.LinkedList()""" "Generic.LinkedList" "System.Collections.ICollection.ISynchronized" // Bug 5092: A framework class contained a private method impl // Disabled due to issue #11752 --- https://github.com/dotnet/fsharp/issues/11752 - //[] + //[] member public this.``Regression.ModulesFromExternalLibrariesBug5785``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1084,7 +991,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate SetConfigurationAndPlatform(projectLib, "Debug|AnyCPU") // we must set config/platform when building with ProjectReferences AddProjectReference(project, projectLib) let br = BuildTarget(projectLib, "Build") // build the dependent library - Assert.IsTrue(br.BuildSucceeded, "build should succeed") + Assert.True(br.BuildSucceeded, "build should succeed") let file = OpenFile(project,"App.fs") TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. @@ -1109,13 +1016,13 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate /// Even though we don't show squiggles, some types will still be known. For example, System.String. - [] + [] member public this.``OrphanFs.BaselineIntellisenseStillWorks``() = this.AssertQuickInfoContainsAtEndOfMarker ("""let astring = "Hello" ""","let astr","string") /// FEATURE: User may hover over a type or identifier and get basic information about it in a tooltip. - [] + [] member public this.``Basic``() = let fileContent = """type (*bob*)Bob() = let x = 1""" @@ -1123,7 +1030,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,marker,"Bob =") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,marker,"Bob =") - [] + [] member public this.``ModuleDefinition.ModuleNoNewLines``() = let fileContent = """module XXX type t = C3 @@ -1137,7 +1044,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"YY","module YYY\n\nfrom XXX") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"ZZ","module ZZZ\n\nfrom XXX\n\nDoc") - [] + [] member public this.``IdentifierWithTick``() = let code = ["#light" @@ -1154,14 +1061,13 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate let tooltip = GetQuickInfoAtCursor file AssertContains(tooltip,"val x': string") - [] + [] member public this.``NegativeTest.CharLiteralNotConfusedWithIdentifierWithTick``() = let fileContent = """let x = 1" let y = 'x' """ this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"'x","") // no tooltips for char literals - [] - [] + [] member public this.``QueryExpression.QuickInfoSmokeTest1``() = let fileContent = """let q = query { for x in ["1"] do select x }""" this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"selec","custom operation: select", addtlRefAssy=standard40AssemblyRefs) @@ -1169,8 +1075,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"selec","Calls" , addtlRefAssy=standard40AssemblyRefs) this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"selec","Linq.QueryBuilder.Select" , addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member public this.``QueryExpression.QuickInfoSmokeTest2``() = let fileContent = """let q = query { for x in ["1"] do join y in ["2"] on (x = y); select (x,y) }""" this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"joi","custom operation: join" , addtlRefAssy=standard40AssemblyRefs ) @@ -1178,8 +1083,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"joi","Calls" , addtlRefAssy=standard40AssemblyRefs ) this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"joi","Linq.QueryBuilder.Join" , addtlRefAssy=standard40AssemblyRefs ) - [] - [] + [] member public this.``QueryExpression.QuickInfoSmokeTest3``() = let fileContent = """let q = query { for x in ["1"] do groupJoin y in ["2"] on (x = y) into g; select (x,g) }""" this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"groupJoin","custom operation: groupJoin" , addtlRefAssy=standard40AssemblyRefs ) @@ -1189,7 +1093,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate /// Hovering over a literal string should not show data tips for variable names that appear in the string - [] + [] member public this.``StringLiteralWithIdentifierLookALikes.Bug2360_A``() = let fileContent = """let y = 1 let f x = "x" @@ -1197,13 +1101,13 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "f x = \"" "val" /// Hovering over a literal string should not show data tips for variable names that appear in the string - [] + [] member public this.``Regression.StringLiteralWithIdentifierLookALikes.Bug2360_B``() = let fileContent = """let y = 1""" this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"let ","int") /// FEATURE: Intellisense information from types in earlier files in the project is available in subsequent files. - [] + [] member public this.``AcrossMultipleFiles``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1231,7 +1135,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate AssertContains(tooltip,"File1.Bob") /// FEATURE: Linked files work - [] + [] member public this.``AcrossLinkedFiles``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1258,7 +1162,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate printf "Second-%s\n" tooltip AssertContains(tooltip,"Link.Bob") - [] + [] member public this.``TauStarter``() = let code = ["#light" @@ -1278,12 +1182,12 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate MoveCursorToEndOfMarker(file,"(*Scenario021*)") let tooltip = time1 GetQuickInfoAtCursor file "Time of first tooltip" printf "First-%s\n" tooltip - Assert.IsTrue(tooltip.Contains("Bob =")) + Assert.True(tooltip.Contains("Bob =")) MoveCursorToEndOfMarker(file,"(*Scenario022*)") let tooltip = time1 GetQuickInfoAtCursor file "Time of first tooltip" printf "First-%s\n" tooltip - Assert.IsTrue(tooltip.Contains("Alice =")) + Assert.True(tooltip.Contains("Alice =")) member private this.QuickInfoResolutionTest lines queries = let code = [ yield "#light" @@ -1299,7 +1203,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate MoveCursorToEndOfMarker(file,marker) let tooltip = time1 GetQuickInfoAtCursor file "Time for tooltip" printf "QuickInfo at marker '%s' is '%s', expect '%s'\n" marker tooltip expectedText - Assert.IsTrue(tooltip.Contains(expectedText)) + Assert.True(tooltip.Contains(expectedText)) member public this.GetLongPathsTestCases() = ["let test0 = System.Console.In" @@ -1331,12 +1235,12 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("type Test0e = System.Collections.Generic.","KeyNotFoundException","Generic.KeyNotFoundException"); // note resolves to type ] - [] + [] member public this.``LongPaths``() = let text,cases = this.GetLongPathsTestCases() this.QuickInfoResolutionTest text cases - [] + [] member public this.``Global.LongPaths``() = let text,cases = this.GetLongPathsTestCases() let replace (s:string) = s.Replace("System", "global.System") @@ -1348,7 +1252,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.QuickInfoResolutionTest text cases - [] + [] member public this.``TypeAndModuleReferences``() = this.QuickInfoResolutionTest ["let test1 = List.length" @@ -1364,7 +1268,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("let test3 = (\"1\").","Length" ,"String.Length"); ("let test3b = (id \"1\").","Length" ,"String.Length") ] - [] + [] member public this.``ModuleNameAndMisc``() = this.QuickInfoResolutionTest ["module (*test3q*)MM3 =" @@ -1377,7 +1281,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("let test4 = ","lock" ,"lock"); ("let (*test5*) ","ffff" ,"ffff") ] - [] + [] member public this.``MemberIdentifiers``() = this.QuickInfoResolutionTest ["type TestType() =" @@ -1393,7 +1297,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("member (*test7*) xx.","QQQQ" ,"float"); ("let test8 = (TestType()).", "PPPP" , "PPPP") ] - [] + [] member public this.``IdentifiersForFields``() = this.QuickInfoResolutionTest ["type TestType9 = { XXX : int }" @@ -1403,7 +1307,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate [("type TestType9 = { ", "XXX" , "XXX: int"); ("let test11 = { ", "XXX" , "XXX");] - [] + [] member public this.``IdentifiersForUnionCases``() = this.QuickInfoResolutionTest ["type TestType10 = Case1 | Case2 of int" @@ -1415,7 +1319,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("let test12 = (", "Case1" , "union case TestType10.Case1"); ("let test12 = (Case1,", "Case2" , "union case TestType10.Case2");] - [] + [] member public this.``IdentifiersInAttributes``() = this.QuickInfoResolutionTest ["[<(*test13*)System.CLSCompliant(true)>]" @@ -1429,7 +1333,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("[<(*test13*)System.", "CLSCompliant" , "CLSCompliantAttribute"); ("[<(*test14*)", "CLSCompliant" , "CLSCompliantAttribute");] - [] + [] member public this.``ArgumentAndPropertyNames``() = this.QuickInfoResolutionTest ["type R = { mutable AAA : int }" @@ -1450,12 +1354,12 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ("let test16 = new System.Reflection.AssemblyName(", "assemblyName", "argument assemblyName")] /// Quickinfo was throwing an exception when the mouse was over the end of a line. - [] + [] member public this.``AtEndOfLine``() = let fileContent = """#light""" this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "#light" "Bug:" - [] + [] member public this.``Regression.FieldRepeatedInToolTip.Bug3538``() = this.AssertIdentifierInToolTipExactlyOnce """#light @@ -1466,7 +1370,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate val mutable x : int""" "LayoutKind.Expl" "Explicit" - [] + [] member public this.``Regression.FieldRepeatedInToolTip.Bug3818``() = this.AssertIdentifierInToolTipExactlyOnce """#light @@ -1475,7 +1379,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate do ()""" "Inherite" "Inherited" // Get the tooltip at "Inherite" & Verify that it contains the 'Inherited' field exactly once - [] + [] member public this.``MethodAndPropTooltip``() = let fileContent = """#light open System @@ -1485,7 +1389,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertIdentifierInToolTipExactlyOnce fileContent "Console.Cle" "Clear" this.AssertIdentifierInToolTipExactlyOnce fileContent "Console.Back" "BackgroundColor" - [] + [] member public this.``Regression.StaticVsInstance.Bug3626``() = let fileContent = """ type Foo() = @@ -1501,7 +1405,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"(*string*) Hoo.Ba","Foo.Bar") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"(*string*) Hoo.Ba","-> string") - [] + [] member public this.``Class.OnlyClassInfo``() = let fileContent = """type TT(x : int, ?y : int) = class end""" @@ -1509,7 +1413,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"type T","type TT") this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "type T" "---" - //KnownFail: [] + //KnownFail: [] member public this.``Async.AsyncToolTips``() = let fileContent = """let a = async { @@ -1521,7 +1425,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"asy","AsyncBuilder") this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "asy" "---" - [] + [] member public this.``Regression.Exceptions.Bug3723``() = let fileContent = """exception E3E of int * int exception E4E of (int * int) @@ -1533,7 +1437,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate // E5E is an alias - should contain name of the aliased exception this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"exception E5","E4E") - [] + [] member public this.``Regression.Classes.Bug4066``() = let fileContent = """type Foo() as this = do this |> ignore @@ -1550,7 +1454,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"Bar() = thi","this") this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "Bar() = thi" "ref" - [] + [] member public this.``Regression.Classes.Bug2362``() = let fileContent = """let append mm nn = fun ac -> mm (nn ac)""" this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"let appen","mm: ('a -> 'b) -> nn: ('c -> 'a) -> ac: 'c -> 'b") @@ -1558,14 +1462,14 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"let append m","'a -> 'b") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"let append mm n","'c -> 'a") - [] + [] member public this.``Regression.ModuleAlias.Bug3790a``() = let fileContent = """module ``Some`` = Microsoft.FSharp.Collections.List module None = Microsoft.FSharp.Collections.List""" this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "module ``So" "Option" this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "module No" "Option" - [] + [] member public this.``Regression.ModuleAlias.Bug3790b``() = let code = [ "#light" @@ -1578,14 +1482,14 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate let tooltip = GetQuickInfoAtCursor file AssertNotContains(tooltip, "Option") - [] + [] member public this.``Regression.ActivePatterns.Bug4100a``() = let fileContent = """let (|Lazy|) x = x match 0 with | Lazy y -> ()""" // Test quickinfo in place where the declaration is used this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "with | Laz" "'?" // e.g. "Lazy: '?3107 -> '?3107", "Lazy: 'a -> 'a" will be fine - [] + [] member public this.``Regression.ActivePatterns.Bug4100b``() = let fileContent = """let Some (a:int) = a match None with @@ -1601,7 +1505,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate // This shouldn't find the function returning string but a pattern returning int this.VerifyQuickInfoDoesNotContainAnyAtEndOfMarker fileContent "| NSom" "int -> string" - [] + [] member public this.``Regression.ActivePatterns.Bug4103``() = let fileContent = """let (|Lazy|) x = x match 0 with | Lazy y -> ()""" @@ -1611,7 +1515,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate // This test checks that we don't show any tooltips for operators // (which is currently not supported, but it used to collide with support for active patterns) - [] + [] member public this.``Regression.NoTooltipForOperators.Bug4567``() = let fileContent = """let ( |+| ) a b = a + b let n = 1 |+| 2 @@ -1622,7 +1526,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"true |","") // Check to see that two distinct projects can be present - [] + [] member public this.``AcrossTwoProjects``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1643,16 +1547,16 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate MoveCursorToEndOfMarker(file1,"type (*bob*)Bob") let tooltip = time1 GetQuickInfoAtCursor file1 "Time of file1 tooltip" printf "Tooltip for file1:\n%s\n" tooltip - Assert.IsTrue(tooltip.Contains("Bob1 =")) + Assert.True(tooltip.Contains("Bob1 =")) // Check Bob2 MoveCursorToEndOfMarker(file2,"type (*bob*)Bob") let tooltip = time1 GetQuickInfoAtCursor file2 "Time of file2 tooltip" printf "Tooltip for file2:\n%s\n" tooltip - Assert.IsTrue(tooltip.Contains("Bob2 =")) + Assert.True(tooltip.Contains("Bob2 =")) // In this bug, relative paths with .. in them weren't working. - [] + [] member public this.``BugInRelativePaths``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1680,7 +1584,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate AssertContains(tooltip,"File1.Bob") // QuickInfo over a type that references types in an unreferenced assembly works. - [] + [] member public this.``MissingDependencyReferences.QuickInfo.Bug5409``() = let code = ["#light" @@ -1697,7 +1601,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate /// The fix--at the point in time it was fixed--was to modify the parser to send a limited number /// of additional EOF tokens to allow the recovery code to proceed up the change of productions /// in the grammar. - [] + [] member public this.``Regression.Bug1605``() = let fileContent = """let rec f l = match l with @@ -1706,7 +1610,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate // This string doesn't matter except that it should prove there is some datatip present. this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"| [] -> str","string") - [] + [] member public this.``Regression.Bug4642``() = let fileContent = """ "AA".Chars """ this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"\"AA\".Ch","int -> char") @@ -1724,11 +1628,10 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate let descr = descrFunc() AssertContainsInOrder(descr,rhsContainsOrder) | None -> - Console.WriteLine("Could not find completion name '{0}'", completionName) ShowErrors(project) - Assert.Fail() + failwith $"Could not find completion name '{completionName}'" - [] + [] //``CompletiongListItem.DocCommentsOnMembers`` and with //Regression 5856 member public this.``Regression.MemberDefinition.DocComments.Bug5856_1``() = this.AssertMemberDataTipContainsInOrder @@ -1755,7 +1658,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_2``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1779,7 +1682,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_3``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1803,7 +1706,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_4``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1829,7 +1732,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_5``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1852,7 +1755,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_6``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1875,7 +1778,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_7``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1899,7 +1802,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_8``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1922,7 +1825,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_9``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1945,7 +1848,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_10``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1964,7 +1867,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_13``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -1983,7 +1886,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_14``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2002,7 +1905,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ] ) - [] + [] member public this.``Regression.MemberDefinition.DocComments.Bug5856_15``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2021,7 +1924,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate ) - [] + [] member public this.``Regression.ExtensionMethods.DocComments.Bug6028``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2042,7 +1945,7 @@ query." ] ) - [] + [] member public this.``Regression.OnMscorlibMethodInScript.Bug6489``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2064,7 +1967,7 @@ query." /// BUG: intellisense on "self" parameter in implicit ctor classes is wrong - [] + [] member public this.``Regression.CompListItemInfo.Bug5694``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2085,7 +1988,7 @@ query." /// Bug 4592: Check that ctors are displayed from C# classes, i.e. the "new" lines below. - [] + [] member public this.``Regression.Class.Printing.CSharp.Classes.Only.Bug4592``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2103,7 +2006,7 @@ query." " member NextDouble: unit -> float"] ) - [] + [] member public this.``GenericDotNetMethodShowsComment``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2119,7 +2022,7 @@ query." ) /// Bug 4624: Check the order in which members are printed, C# classes - [] + [] member public this.``Regression.Class.Printing.CSharp.Classes.Bug4624``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2143,7 +2046,7 @@ query." ]) /// Bug 4624: Check the order in which members are printed, F# classes - [] + [] member public this.``Regression.Class.Printing.FSharp.Classes.Bug4624``() = this.AssertMemberDataTipContainsInOrder ((*code *) @@ -2191,7 +2094,7 @@ query." ]) (*------------------------------------------IDE automation starts here -------------------------------------------------*) - [] + [] member public this.``Automation.Regression.AccessibilityOnTypeMembers.Bug4168``() = let fileContent = """module Test type internal Foo2(*Marker*) () = @@ -2203,7 +2106,7 @@ query." private new(x:int,y:int,z:int) = new Foo2()""" this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker*)", "type internal Foo2") - [] + [] member public this.``Automation.Regression.AccessorsAndMutators.Bug4276``() = let fileContent = """type TestType1(*Marker1*)( x : int , y : int ) = let mutable x = x @@ -2242,14 +2145,13 @@ query." this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker2*)" "get_Length" this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker2*)" "set_Length" - [] - [] + [] member public this.``Automation.AutoOpenMyNamespace``() = let fileContent ="""namespace System.Numerics type t = BigInteger(*Marker1*)""" this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "r(*Marker1*)", "type BigInteger") - [] + [] member public this.``Automation.Regression.BeforeAndAfterIdentifier.Bug4371``() = let fileContent = """module Test let f arg1 (arg2, arg3, arg4) arg5 = 42 @@ -2262,7 +2164,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "property System.Console.BufferWidth: int") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"(*Marker3*)","Full name: Test.printer") - [] + [] member public this.``Automation.Regression.ConstructorWithSameNameAsType.Bug2739``() = let fileContent = """namespace AA module AA = @@ -2272,7 +2174,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker1*)", "AA.AA: AA") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "BB.BB: string") - [] + [] member public this.``Automation.Regression.EventImplementation.Bug5471``() = let fileContent = """namespace regressiontest open System @@ -2327,7 +2229,7 @@ query." AssertContains(tooltip, "override CommandReference.CanExecuteChanged: IEvent") AssertContains(tooltip, "regressiontest.CommandReference.CanExecuteChanged") - [] + [] member public this.``Automation.ExtensionMethod``() = let fileContent ="""namespace TestQuickinfo @@ -2446,7 +2348,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker42*)", "FSStruct.ExtensionProperty: string") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker42*)", "fs struct extension property") - [] + [] member public this.``Automation.Regression.GenericFunction.Bug2868``() = let fileContent ="""module Test // Hovering over a generic function (generic argument decorated with [] attribute yields a bad tooltip @@ -2457,8 +2359,7 @@ query." this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker*)" "Exception" this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker*)" "thrown" - [] - [] + [] member public this.``Automation.IdentifierHaveDiffMeanings``() = let fileContent ="""namespace NS module float(*Marker1_1*) = @@ -2524,14 +2425,14 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker6_2*)", "member ValType.Value : int with set") this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker6_2*)" "Microsoft.FSharp.Core.ExtraTopLevelOperators.set" - [] + [] member public this.``Automation.Regression.ModuleIdentifier.Bug2937``() = let fileContent ="""module XXX(*Marker*) type t = C3""" this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker*)", "module XXX") this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker*)" "\n" - [] + [] member public this.``Automation.Regression.NamesArgument.Bug3818``() = let fileContent ="""module m [] @@ -2539,8 +2440,7 @@ query." end""" this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker1*)", "property System.AttributeUsageAttribute.AllowMultiple: bool") - [] - [] + [] member public this.``Automation.OnUnitsOfMeasure``() = let fileContent ="""namespace TestQuickinfo @@ -2580,7 +2480,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker22*)", "from Microsoft.FSharp.Collections") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker22*)", "Functional programming operators related to the Set<_> type.") - [] + [] member public this.``Automation.OverRiddenMembers``() = let fileContent ="""namespace QuickinfoGeneric @@ -2602,7 +2502,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker11*)", "override ByteOutputSink.WriteChar: c: char -> unit") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker12*)", "override ByteOutputSink.WriteString: s: string -> unit") - [] + [] member public this.``Automation.Regression.QuotedIdentifier.Bug3790``() = let fileContent ="""module Test module ``Some``(*Marker1*) = Microsoft.FSharp.Collections.List @@ -2612,8 +2512,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "``(*Marker2*)", "module List") this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "``(*Marker2*)" "Option.Some" - [] - [] + [] member public this.``Automation.Setter``() = let fileContent ="""type T() = member this.XX @@ -2653,7 +2552,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker4*)", "T2.Foo: a: 'a * b: 'b -> string") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker5*)", "val foo: int -> int -> int") - [] + [] member public this.``Automation.Regression.TupleException.Bug3723``() = let fileContent ="""namespace TestQuickinfo exception E3(*Marker1*) of int * int @@ -2665,7 +2564,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "Full name: TestQuickinfo.E4") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker3*)", "exception E5 = E4") - [] + [] member public this.``Automation.TypeAbbreviations``() = let fileContent ="""namespace NS module TypeAbbreviation = @@ -2716,7 +2615,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker5_1*)", "type AbAttrName = AbstractClassAttribute") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker5_2*)", "type AbAttrName = AbstractClassAttribute") - [] + [] member public this.``Automation.Regression.TypeInferenceScenarios.Bug2362&3538``() = let fileContent ="""module Test.Module1 @@ -2751,7 +2650,7 @@ query." this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"(*Marker7*)","type A =") this.AssertQuickInfoContainsAtEndOfMarker(fileContent,"(*Marker7*)","val mutable x: int") - [] + [] member public this.``Automation.Regression.TypemoduleConstructorLastLine.Bug2494``() = let fileContent ="""namespace NS open System @@ -2777,7 +2676,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*MarkerVal*)", "val pq: PriorityQueue<'a,'b>") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*MarkerLastLine*)", "val singleton: k: 'a -> a: 'b -> PriorityQueue<'a,'b>") - [] + [] member public this.``Automation.WhereQuickInfoShouldNotShowUp``() = let fileContent ="""namespace Test @@ -2825,7 +2724,7 @@ query." this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker7*)" "bigint" this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker8*)" "myString" - [] + [] member public this.``Automation.Regression.XmlDocComments.Bug3157``() = let fileContent ="""namespace TestQuickinfo module XmlComment = @@ -2839,7 +2738,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker*)", "Full name: TestQuickinfo.XmlComment.func") this.VerifyQuickInfoDoesNotContainAnyAtStartOfMarker fileContent "(*Marker*)" "XmlComment K" - [] + [] member public this.``Automation.Regression.XmlDocCommentsOnExtensionMembers.Bug138112``() = let fileContent ="""module Module1 = type T() = @@ -2862,8 +2761,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "XmlComment M2") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker3*)", "XmlComment M3") - [] - [] + [] member public this.XmlDocCommentsForArguments() = let fileContent = """ type bar() = @@ -3059,7 +2957,7 @@ query." AssertContains(tooltip, expectedTip) - [] + [] member public this.``Automation.XDelegateDUStructfromOwnCode``() = let fileContent ="""module Test @@ -3099,7 +2997,7 @@ query." ("(*Marker4*)", "Gets and sets X")] this.VerifyUsingFsTestLib fileContent queries false - [] + [] member public this.``Automation.StructDelegateDUfromOwnCode``() = let fileContent ="""module Test @@ -3141,7 +3039,7 @@ query." ] this.VerifyUsingFsTestLib fileContent queries false - [] + [] member public this.``Automation.TupleRecordClassfromOwnCode``() = let fileContent ="""module Test @@ -3237,9 +3135,7 @@ query." gpatcc.AssertExactly(0,0) - [] - [] - [] + [] // QuickInfo still works on valid operators in a query with errors elsewhere in it member public this.``Query.WithError1.Bug196137``() = let fileContent =""" @@ -3255,10 +3151,8 @@ query." }""" this.AssertQuickInfoInQuery (fileContent, "(*Mark*)", "Product.ProductName: string") - [] - [] + [] // QuickInfo still works on valid operators in a query with errors elsewhere in it - [] member public this.``Query.WithError2``() = let fileContent =""" open DataSource @@ -3271,8 +3165,7 @@ query." }""" this.AssertQuickInfoInQuery (fileContent, "(*Mark*)", "custom operation: minBy ('Value)") - [] - [] + [] // QuickInfo works in a large query (using many operators) member public this.``Query.WithinLargeQuery``() = let fileContent =""" @@ -3303,9 +3196,7 @@ query." this.AssertQuickInfoInQuery (fileContent, "(*Mark3*)", "custom operation: where (bool)") this.AssertQuickInfoInQuery (fileContent, "(*Mark4*)", "custom operation: distinct") - [] - [] - [] + [] // Arguments to query operators have correct QuickInfo // quickinfo should be correct including when the operator is causing an error member public this.``Query.ArgumentToQuery.OperatorError``() = @@ -3319,9 +3210,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "n.GetType()", "val n: int",queryAssemblyRefs) this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "Type()", "System.Object.GetType() : System.Type",queryAssemblyRefs) - [] - [] - [] + [] // Arguments to query operators have correct QuickInfo // quickinfo should be correct In a nested query member public this.``Query.ArgumentToQuery.InNestedQuery``() = @@ -3342,10 +3231,8 @@ query." this.AssertQuickInfoInQuery (fileContent, "(*Mark3*)", "custom operation: groupValBy ('Value) ('Key)") this.AssertQuickInfoInQuery (fileContent, "(*Mark4*)", "custom operation: select ('Result)") - [] - [] + [] // A computation expression with its own custom operators has correct QuickInfo displayed - [] member public this.``Query.ComputationExpression.Method``() = let fileContent =""" open System.Collections.Generic @@ -3387,8 +3274,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Mark1*)", "member WorkflowBuilder.Combine: f: 'b0 * g: 'c1 -> 'c1",queryAssemblyRefs) this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Mark2*)", "member WorkflowBuilder.Zero: unit -> unit",queryAssemblyRefs) - [] - [] + [] // A computation expression with its own custom operators has correct QuickInfo displayed member public this.``Query.ComputationExpression.CustomOp``() = let fileContent =""" @@ -3424,6 +3310,5 @@ query." // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickParse.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickParse.fs index 4f2297a74e4..40efc4655a8 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickParse.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickParse.fs @@ -3,13 +3,9 @@ namespace Tests.LanguageService open System -open NUnit.Framework +open Xunit open FSharp.Compiler.EditorServices -[] -[] -[] -[] type QuickParse() = let CheckIsland(tolerateJustAfter:bool, s : string, p : int, expected) = @@ -17,9 +13,9 @@ type QuickParse() = match QuickParse.GetCompleteIdentifierIsland tolerateJustAfter s p with | Some (s, col, _) -> Some (s, col) | None -> None - Assert.AreEqual(expected, actual) + Assert.Equal(expected, actual) - [] + [] member public qp.CheckGetPartialLongName() = let CheckAt(line, index, expected) = let actual = QuickParse.GetPartialLongNameEx(line, index) @@ -53,118 +49,118 @@ type QuickParse() = Check("let y=SomeModule . ", (["SomeModule"], "", Some 18)) - [] + [] member public qp.CheckIsland0() = CheckIsland(true, "", -1, None) - [] + [] member public qp.CheckIsland1() = CheckIsland(false, "", -1, None) - [] + [] member public qp.CheckIsland2() = CheckIsland(true, "", 0, None) - [] + [] member public qp.CheckIsland3() = CheckIsland(false, "", 0, None) - [] + [] member public qp.CheckIsland4() = CheckIsland(true, null, 0, None) - [] + [] member public qp.CheckIsland5() = CheckIsland(false, null, 0, None) - [] + [] member public qp.CheckIsland6() = CheckIsland(false, "identifier", 0, Some("identifier",10)) - [] + [] member public qp.CheckIsland7() = CheckIsland(false, "identifier", 8, Some("identifier",10)) - [] + [] member public qp.CheckIsland8() = CheckIsland(true, "identifier", 0, Some("identifier",10)) - [] + [] member public qp.CheckIsland9() = CheckIsland(true, "identifier", 8, Some("identifier",10)) // A place where tolerateJustAfter matters - [] + [] member public qp.CheckIsland10() = CheckIsland(false, "identifier", 10, None) - [] + [] member public qp.CheckIsland11() = CheckIsland(true, "identifier", 10, Some("identifier",10)) // Index which overflows the line - [] + [] member public qp.CheckIsland12() = CheckIsland(true, "identifier", 11, None) - [] + [] member public qp.CheckIsland13() = CheckIsland(false, "identifier", 11, None) // Match active pattern identifiers - [] + [] member public qp.CheckIsland14() = CheckIsland(false, "|Identifier|", 0, Some("|Identifier|",12)) - [] + [] member public qp.CheckIsland15() = CheckIsland(true, "|Identifier|", 0, Some("|Identifier|",12)) - [] + [] member public qp.CheckIsland16() = CheckIsland(false, "|Identifier|", 12, None) - [] + [] member public qp.CheckIsland17() = CheckIsland(true, "|Identifier|", 12, Some("|Identifier|",12)) - [] + [] member public qp.CheckIsland18() = CheckIsland(false, "|Identifier|", 13, None) - [] + [] member public qp.CheckIsland19() = CheckIsland(true, "|Identifier|", 13, None) // ``Quoted`` identifiers - [] + [] member public qp.CheckIsland20() = CheckIsland(false, "``Space Man``", 0, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland21() = CheckIsland(true, "``Space Man``", 0, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland22() = CheckIsland(false, "``Space Man``", 10, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland23() = CheckIsland(true, "``Space Man``", 10, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland24() = CheckIsland(false, "``Space Man``", 11, Some("``Space Man``",13)) - // [] + // [] // member public qp.CheckIsland25() = CheckIsland(true, "``Space Man``", 11, Some("Man",11)) // This is probably not what the user wanted. Not enforcing this test. - [] + [] member public qp.CheckIsland26() = CheckIsland(false, "``Space Man``", 12, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland27() = CheckIsland(true, "``Space Man``", 12, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland28() = CheckIsland(false, "``Space Man``", 13, None) - [] + [] member public qp.CheckIsland29() = CheckIsland(true, "``Space Man``", 13, Some("``Space Man``",13)) - [] + [] member public qp.CheckIsland30() = CheckIsland(false, "``Space Man``", 14, None) - [] + [] member public qp.CheckIsland31() = CheckIsland(true, "``Space Man``", 14, None) - [] + [] member public qp.CheckIsland32() = CheckIsland(true, "``msft-prices.csv``", 14, Some("``msft-prices.csv``",19)) // handle extracting islands from arrays - [] + [] member public qp.CheckIsland33() = CheckIsland(true, "[|abc;def|]", 2, Some("abc",5)) - [] + [] member public qp.CheckIsland34() = CheckIsland(true, "[|abc;def|]", 4, Some("abc",5)) - [] + [] member public qp.CheckIsland35() = CheckIsland(true, "[|abc;def|]", 5, Some("abc",5)) - [] + [] member public qp.CheckIsland36() = CheckIsland(true, "[|abc;def|]", 6, Some("def",9)) - [] + [] member public qp.CheckIsland37() = CheckIsland(true, "[|abc;def|]", 8, Some("def",9)) - [] + [] member public qp.CheckIsland38() = CheckIsland(true, "[|abc;def|]", 9, Some("def",9)) - [] + [] member public qp.CheckIsland39() = CheckIsland(false, "identifier(*boo*)", 0, Some("identifier",10)) - [] + [] member public qp.CheckIsland40() = CheckIsland(true, "identifier(*boo*)", 0, Some("identifier",10)) - [] + [] member public qp.CheckIsland41() = CheckIsland(false, "identifier(*boo*)", 10, None) - [] + [] member public qp.CheckIsland42() = CheckIsland(true, "identifier(*boo*)", 10, Some("identifier",10)) - [] + [] member public qp.CheckIsland43() = CheckIsland(false, "identifier(*boo*)", 11, None) - [] + [] member public qp.CheckIsland44() = CheckIsland(true, "identifier(*boo*)", 11, None) - [] + [] member public qp.CheckIsland45() = CheckIsland(false, "``Space Man (*boo*)``", 13, Some("``Space Man (*boo*)``",21)) - [] + [] member public qp.CheckIsland46() = CheckIsland(true, "``Space Man (*boo*)``", 13, Some("``Space Man (*boo*)``",21)) - [] + [] member public qp.CheckIsland47() = CheckIsland(false, "(*boo*)identifier", 11, Some("identifier",17)) - [] + [] member public qp.CheckIsland48() = CheckIsland(true, "(*boo*)identifier", 11, Some("identifier",17)) - [] + [] member public qp.CheckIsland49() = CheckIsland(false, "identifier(*(* *)boo*)", 0, Some("identifier",10)) - [] + [] member public qp.CheckIsland50() = CheckIsland(true, "identifier(*(* *)boo*)", 0, Some("identifier",10)) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs index 8a563a879dc..852758363c5 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs @@ -5,7 +5,7 @@ namespace Tests.LanguageService.Script open System open System.IO open System.Reflection -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -13,8 +13,6 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -[] -[] type UsingMSBuild() as this = inherit LanguageServiceBaseTests() @@ -59,7 +57,7 @@ type UsingMSBuild() as this = [ for i = 0 to errorList.Length - 1 do yield errorList.[i].Message] - Assert.IsTrue(errorList + Assert.True(errorList |> GetErrorMessages |> Seq.exists (fun errorMessage -> errorMessage.Contains(expectedStr))) @@ -92,7 +90,7 @@ type UsingMSBuild() as this = match squiggleOption with | None -> Assert.Fail("Expected a squiggle but none was seen.") | Some(severity,message) -> - Assert.IsTrue((severity=expectedSeverity), sprintf "Expected %s but saw %s: %s" nameOfExpected nameOfNotExpected message) + Assert.True((severity=expectedSeverity), sprintf "Expected %s but saw %s: %s" nameOfExpected nameOfNotExpected message) assertf(message,containing) AssertSquiggle Microsoft.VisualStudio.FSharp.LanguageService.Severity.Error "Error" "Warning" AssertContains, AssertSquiggle Microsoft.VisualStudio.FSharp.LanguageService.Severity.Warning "Warning" "Error" AssertContains, @@ -133,27 +131,26 @@ type UsingMSBuild() as this = AssertNotContains(tooltip, notexpected) /// There was a problem with Salsa that caused squiggles not to be shown for .fsx files. - [] + [] member public this.``Fsx.Squiggles.ShowInFsxFiles``() = let fileContent = """open Thing1.Thing2""" this.VerifyFSXErrorListContainedExpectedString(fileContent,"Thing1") /// Regression test for FSharp1.0:4861 - #r to nonexistent file causes the first line to be squiggled /// There was a problem with Salsa that caused squiggles not to be shown for .fsx files. - [] + [] member public this.``Fsx.Hash.RProperSquiggleForNonExistentFile``() = let fileContent = """#r "NonExistent" """ this.VerifyFSXErrorListContainedExpectedString(fileContent,"was not found or is invalid") /// Nonexistent hash. There was a problem with Salsa that caused squiggles not to be shown for .fsx files. - [] + [] member public this.``Fsx.Hash.RDoesNotExist.Bug3325``() = let fileContent = """#r "ThisDLLDoesNotExist" """ this.VerifyFSXErrorListContainedExpectedString(fileContent,"'ThisDLLDoesNotExist' was not found or is invalid") // There was a spurious error message on the first line. - [] - [] + [] member public this.``Fsx.ExactlyOneError.Bug4861``() = let code = ["#light" // First line is important in this repro @@ -162,7 +159,7 @@ type UsingMSBuild() as this = let (project, _) = createSingleFileFsxFromLines code AssertExactlyCountErrorSeenContaining(project, "Nonexistent", 1) // ...and not an error on the first line. - [] + [] member public this.``Fsx.InvalidHashLoad.ShouldBeASquiggle.Bug3012``() = let fileContent = """ #light @@ -171,8 +168,7 @@ type UsingMSBuild() as this = this.VerifyFSXErrorListContainedExpectedString(fileContent,"Bar.fs") // Transitive to existing property. - [] - [] + [] member public this.``Fsx.ScriptClosure.TransitiveLoad1``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -196,8 +192,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // Transitive to nonexisting property. - [] - [] + [] member public this.``Fsx.ScriptClosure.TransitiveLoad2``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -219,8 +214,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "NonExistingProperty") /// FEATURE: Typing a #r into a file will cause it to be recognized by intellisense. - [] - [] + [] member public this.``Fsx.HashR.AddedIn``() = let code = ["#light" @@ -240,7 +234,7 @@ type UsingMSBuild() as this = gpatcc.AssertExactly(notAA[file],notAA[file], true (* expectCreate, because dependent DLL set changed *)) // FEATURE: Adding a #load to a file will cause types from that file to be visible in intellisense - [] + [] member public this.``Fsx.HashLoad.Added``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -271,7 +265,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // FEATURE: Removing a #load to a file will cause types from that file to no longer be visible in intellisense - [] + [] member public this.``Fsx.HashLoad.Removed``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -301,7 +295,7 @@ type UsingMSBuild() as this = TakeCoffeeBreak(this.VS) VerifyErrorListContainedExpectedStr("MyNamespace",project) - [] + [] member public this.``Fsx.HashLoad.Conditionals``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -330,14 +324,13 @@ type UsingMSBuild() as this = MoveCursorToEndOfMarker(fsx, "InDifferentFS.") let completion = AutoCompleteAtCursor fsx let completion = completion |> Array.map (fun (CompletionItem(name, _, _, _, _)) -> name) |> set - Assert.AreEqual(Set.count completion, 2, "Expected 2 elements in the completion list") - Assert.IsTrue(completion.Contains "x", "Completion list should contain x because INTERACTIVE is defined") - Assert.IsTrue(completion.Contains "B", "Completion list should contain B because DEBUG is not defined") + Assert.Equal(Set.count completion, 2) + Assert.True(completion.Contains "x", "Completion list should contain x because INTERACTIVE is defined") + Assert.True(completion.Contains "B", "Completion list should contain B because DEBUG is not defined") /// FEATURE: Removing a #r into a file will cause it to no longer be seen by intellisense. - [] - [] + [] member public this.``Fsx.HashR.Removed``() = let code = ["#light" @@ -362,8 +355,7 @@ type UsingMSBuild() as this = // Corecursive load to existing property. - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad3``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -387,8 +379,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // #load of .fsi is respected (for non-hidden property) - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad9``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -416,8 +407,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // #load of .fsi is respected at second #load level (for non-hidden property) - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad10``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -448,8 +438,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // #load of .fsi is respected when dispersed between two #load levels (for non-hidden property) - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad11``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -480,8 +469,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // #load of .fsi is respected when dispersed between two #load levels (the other way) (for non-hidden property) - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad12``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -512,8 +500,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // #nowarn seen in closed .fsx is global to the closure - [] - [] + [] member public this.``Fsx.NoError.ScriptClosure.TransitiveLoad16``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -534,7 +521,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) /// FEATURE: #r in .fsx to a .dll name works. - [] + [] member public this.``Fsx.NoError.HashR.DllWithNoPath``() = let fileContent = """ #light @@ -543,7 +530,7 @@ type UsingMSBuild() as this = this.VerifyFSXNoErrorList(fileContent) - [] + [] // 'System' is in the default set. Make sure we can still resolve it. member public this.``Fsx.NoError.HashR.BugDefaultReferenceFileIsAlsoResolved``() = let fileContent = """ @@ -552,8 +539,7 @@ type UsingMSBuild() as this = """ this.VerifyFSXNoErrorList(fileContent) - [] - [] + [] member public this.``Fsx.NoError.HashR.DoubleReference``() = let fileContent = """ #light @@ -562,8 +548,7 @@ type UsingMSBuild() as this = """ this.VerifyFSXNoErrorList(fileContent) - [] - [] + [] // 'CustomMarshalers' is loaded from the GAC _and_ it is available on XP and above. member public this.``Fsx.NoError.HashR.ResolveFromGAC``() = let fileContent = """ @@ -572,17 +557,14 @@ type UsingMSBuild() as this = """ this.VerifyFSXNoErrorList(fileContent) - [] - [] + [] member public this.``Fsx.NoError.HashR.ResolveFromFullyQualifiedPath``() = let fullyqualifiepathtoddll = System.IO.Path.Combine( System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), "System.configuration.dll" ) let code = ["#light";"#r @\"" + fullyqualifiepathtoddll + "\""] let (project, _) = createSingleFileFsxFromLines code AssertNoErrorsOrWarnings(project) - [] - [] - [] + [] member public this.``Fsx.NoError.HashR.RelativePath1``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -618,8 +600,7 @@ type UsingMSBuild() as this = let ans = GetSquiggleAtCursor(script1) AssertNoSquiggle(ans) - [] - [] + [] member public this.``Fsx.NoError.HashR.RelativePath2``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -656,7 +637,7 @@ type UsingMSBuild() as this = AssertNoSquiggle(ans) /// FEATURE: #load in an .fsx file will include that file in the 'build' of the .fsx. - [] + [] member public this.``Fsx.NoError.HashLoad.Simple``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -678,8 +659,7 @@ type UsingMSBuild() as this = AssertNoErrorsOrWarnings(project) // In this bug the #loaded file contains a level-4 warning (copy to avoid mutation). This warning was reported at the #load in file2.fsx but shouldn't have been.s - [] - [] + [] member public this.``Fsx.NoWarn.OnLoadedFile.Bug4837``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -699,8 +679,7 @@ type UsingMSBuild() as this = /// FEATURE: .fsx files have automatic imports of certain system assemblies. //There is a test bug here. The actual scenario works. Need to revisit. - [] - [] + [] member public this.``Fsx.NoError.AutomaticImportsForFsxFiles``() = let fileContent = """ #light @@ -717,8 +696,7 @@ type UsingMSBuild() as this = this.VerifyFSXNoErrorList(fileContent) // Corecursive load to nonexisting property. - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad4``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -741,8 +719,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "NonExistingProperty") // #load of .fsi is respected - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad5``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -770,8 +747,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "HiddenProperty") // #load of .fsi is respected at second #load level - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad6``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -802,8 +778,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "HiddenProperty") // #load of .fsi is respected when dispersed between two #load levels - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad7``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -834,8 +809,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "HiddenProperty") // #load of .fsi is respected when dispersed between two #load levels (the other way) - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad8``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -866,8 +840,7 @@ type UsingMSBuild() as this = AssertExactlyOneErrorSeenContaining(project, "HiddenProperty") // Bug seen during development: A #load in an .fs would be followed. - [] - [] + [] member public this.``Fsx.ExactlyOneError.ScriptClosure.TransitiveLoad15``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -890,7 +863,7 @@ type UsingMSBuild() as this = TakeCoffeeBreak(this.VS) AssertExactlyOneErrorSeenContaining(project, "Namespace") - [] + [] member public this.``Fsx.Bug4311HoverOverReferenceInFirstLine``() = let fileContent = """#r "PresentationFramework.dll" @@ -899,7 +872,7 @@ type UsingMSBuild() as this = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile fileContent marker "PresentationFramework.dll" this.AssertQuickInfoNotContainsAtEndOfMarkerInFsxFile fileContent marker "multiple results" - [] + [] member public this.``Fsx.QuickInfo.Bug4979``() = let code = ["System.ConsoleModifiers.Shift |> ignore " @@ -925,7 +898,7 @@ type UsingMSBuild() as this = // they may be metadata-only assemblies. // // "Reference Assemblies" was only introduced in 3.5sp1, so not all 2.0 F# boxes will have it, so only run on 4.0 - [] + [] member public this.``Fsx.Bug5073``() = let fileContent = """#r "System" """ let marker = "#r \"System" @@ -933,35 +906,32 @@ type UsingMSBuild() as this = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile fileContent marker ".NET Framework" /// FEATURE: Hovering over a resolved #r file will show a data tip with the fully qualified path to that file. - [] + [] member public this.``Fsx.HashR_QuickInfo.ShowFilenameOfResolvedAssembly``() = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile """#r "System.Transactions" """ // Pick anything that isn't in the standard set of assemblies. "#r \"System.Tra" "System.Transactions.dll" - [] + [] member public this.``Fsx.HashR_QuickInfo.BugDefaultReferenceFileIsAlsoResolved``() = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile """#r "System" """ // 'System' is in the default set. Make sure we can still resolve it. "#r \"Syst" "System.dll" - [] - [] + [] member public this.``Fsx.HashR_QuickInfo.DoubleReference``() = let fileContent = """#r "System" // Mark1 #r "System" // Mark2 """ // The same reference repeated twice. this.AssertQuickInfoContainsAtStartOfMarkerInFsxFile fileContent "tem\" // Mark1" "System.dll" this.AssertQuickInfoContainsAtStartOfMarkerInFsxFile fileContent "tem\" // Mark2" "System.dll" - [] - [] + [] member public this.``Fsx.HashR_QuickInfo.ResolveFromGAC``() = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile """#r "CustomMarshalers" """ // 'mscorcfg' is loaded from the GAC _and_ it is available on XP and above. "#r \"Custo" ".NET Framework" - [] - [] + [] member public this.``Fsx.HashR_QuickInfo.ResolveFromFullyQualifiedPath``() = let fullyqualifiepathtoddll = System.IO.Path.Combine( System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), "System.configuration.dll" ) // Can be any fully qualified path to an assembly let expectedtooltip = System.Reflection.Assembly.ReflectionOnlyLoadFrom(fullyqualifiepathtoddll).FullName @@ -970,7 +940,7 @@ type UsingMSBuild() as this = this.AssertQuickInfoContainsAtEndOfMarkerInFsxFile fileContent marker expectedtooltip //this.AssertQuickInfoNotContainsAtEndOfMarkerInFsxFile fileContent marker ".dll" - [] + [] member public this.``Fsx.InvalidHashReference.ShouldBeASquiggle.Bug3012``() = let code = ["#light" @@ -979,11 +949,10 @@ type UsingMSBuild() as this = MoveCursorToEndOfMarker(file,"#r \"Ba") let squiggle = GetSquiggleAtCursor(file) TakeCoffeeBreak(this.VS) - Assert.IsTrue(snd squiggle.Value |> fun str -> str.Contains("Bar.dll")) + Assert.True(snd squiggle.Value |> fun str -> str.Contains("Bar.dll")) // Bug seen during development: The unresolved reference error would x-ray through to the root. - [] - [] + [] member public this.``Fsx.ScriptClosure.TransitiveLoad14``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1016,23 +985,23 @@ type UsingMSBuild() as this = | Some(sev,msg) -> AssertEqual(Microsoft.VisualStudio.FSharp.LanguageService.Severity.Error, sev) AssertContains(msg, expectedStr) - | _ -> Assert.Fail() + | _ -> failwith "" /// FEATURE: #r, #I, #load are all errors when running under the language service - [] + [] member public this.``Fsx.HashDirectivesAreErrors.InNonScriptFiles.Case1``() = this.TestFsxHashDirectivesAreErrors("#r \"Joe", "may only be used in F# script files") - [] + [] member public this.``Fsx.HashDirectivesAreErrors.InNonScriptFiles.Case2``() = this.TestFsxHashDirectivesAreErrors("#I \"", "may only be used in F# script files") - [] + [] member public this.``Fsx.HashDirectivesAreErrors.InNonScriptFiles.Case3``() = this.TestFsxHashDirectivesAreErrors("#load \"Doo", "may only be used in F# script files") /// FEATURE: #reference against a non-assembly .EXE gives a reasonable error message - //[] + //[] member public this.``Fsx.HashReferenceAgainstNonAssemblyExe``() = let windows = System.Environment.GetEnvironmentVariable("windir") let code = @@ -1048,8 +1017,7 @@ type UsingMSBuild() as this = (* ---------------------------------------------------------------------------------- *) // FEATURE: A #loaded file is squiggled with an error if there are errors in that file. - [] - [] + [] member public this.``Fsx.HashLoadedFileWithErrors.Bug3149``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1074,8 +1042,7 @@ type UsingMSBuild() as this = // FEATURE: A #loaded file is squiggled with a warning if there are warning that file. - [] - [] + [] member public this.``Fsx.HashLoadedFileWithWarnings.Bug3149``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1098,8 +1065,7 @@ type UsingMSBuild() as this = AssertSquiggleIsWarningContaining(ans, "WarningHere") // Bug: #load should report the first error message from a file - [] - [] + [] member public this.``Fsx.HashLoadedFileWithErrors.Bug3652``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1125,7 +1091,7 @@ type UsingMSBuild() as this = AssertSquiggleIsErrorNotContaining(ans, "foo") // In this bug the .fsx project directory was wrong so it couldn't reference a relative file. - [] + [] member public this.``Fsx.ScriptCanReferenceBinDirectoryOutput.Bug3151``() = use _guard = this.UsingNewVS() let stopWatch = new System.Diagnostics.Stopwatch() @@ -1155,8 +1121,7 @@ type UsingMSBuild() as this = /// In this bug, multiple references to mscorlib .dll were causing problem in load closure - [] - [] + [] member public this.``Fsx.BugAllowExplicitReferenceToMsCorlib``() = let code = ["#r \"mscorlib\"" @@ -1169,8 +1134,7 @@ type UsingMSBuild() as this = AssertCompListContains(completions,"CommandLineArgs") /// FEATURE: There is a global fsi module that should be in scope for script files. - [] - [] + [] member public this.``Fsx.Bug2530FsiObject``() = let code = ["#light" @@ -1183,8 +1147,7 @@ type UsingMSBuild() as this = AssertCompListContains(completions,"CommandLineArgs") // Ensure that the script closure algorithm gets the right order of hash directives - [] - [] + [] member public this.``Fsx.ScriptClosure.SurfaceOrderOfHashes``() = let code = ["#r \"System.Runtime.Remoting\"" @@ -1199,12 +1162,12 @@ type UsingMSBuild() as this = AssertArrayContainsPartialMatchOf(fas.OtherOptions, "System.Runtime.Remoting.dll") AssertArrayContainsPartialMatchOf(fas.OtherOptions, "System.Transactions.dll") AssertArrayContainsPartialMatchOf(fas.OtherOptions, "FSharp.Compiler.Interactive.Settings.dll") - Assert.AreEqual(Path.Combine(projectFolder,"File1.fsx"), fas.SourceFiles.[0]) - Assert.AreEqual(1, fas.SourceFiles.Length) + Assert.Equal(Path.Combine(projectFolder,"File1.fsx"), fas.SourceFiles.[0]) + Assert.Equal(1, fas.SourceFiles.Length) /// FEATURE: #reference against a strong name should work. - [] + [] member public this.``Fsx.HashReferenceAgainstStrongName``() = let code = ["#light" @@ -1217,7 +1180,7 @@ type UsingMSBuild() as this = /// Try out some bogus file names in #r, #I and #load. - [] + [] member public this.``Fsx.InvalidMetaCommandFilenames``() = let code = [ @@ -1236,7 +1199,7 @@ type UsingMSBuild() as this = TakeCoffeeBreak(this.VS) // This used to assert /// FEATURE: .fsx files have INTERACTIVE #defined - [] + [] member public this.``Fsx.INTERACTIVEIsDefinedInFsxFiles``() = let code = [ @@ -1249,9 +1212,7 @@ type UsingMSBuild() as this = AssertEqual(TokenType.Identifier ,GetTokenTypeAtCursor(file)) // Ensure that basic compile of an .fsx works - [] - [] - [] + [] member public this.``Fsx.CompileFsx_1``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1260,14 +1221,12 @@ type UsingMSBuild() as this = let file1 = AddFileFromTextEx(project,"Script.fsx","Script.fsx",BuildAction.Compile, ["printfn \"Hello world\""]) let build = time1 Build project "Time to build project" - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") ShowErrors(project) // Compile a script which #loads a source file. The build can't succeed without the loaded file. - [] - [] - [] + [] member public this.``Fsx.CompileFsx_2``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1285,12 +1244,10 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line () - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // Compile a script which #loads a source file. The build can't succeed without - [] - [] - [] + [] member public this.``Fsx.CompileFsx_3``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1308,12 +1265,10 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line () - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // Must be explicitly referenced by compile. - [] - [] - [] + [] member public this.``Fsx.CompileFsx_Bug5416_1``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1325,13 +1280,10 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line () - Assert.IsTrue(not(build.BuildSucceeded), "Expected build to fail") + Assert.True(not(build.BuildSucceeded), "Expected build to fail") // Must be explicitly referenced by compile. - [] - [] - [] - [] + [] member public this.``Fsx.CompileFsx_Bug5416_2``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1357,13 +1309,11 @@ type UsingMSBuild() as this = for line in lines do printfn "%s" line () if not(SupportsOutputWindowPane(this.VS)) then - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // Ensure that #load order is preserved when #loading multiple files. - [] - [] - [] + [] member public this.``Fsx.CompileFsx_5``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1388,13 +1338,11 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line () - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // If an fs file is explicitly passed in to the compiler and also #loaded then // the command-line order is respected rather than the #load order - [] - [] - [] + [] member public this.``Fsx.CompileFsx_6``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1419,14 +1367,12 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line () - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // If a #loaded file does not exist, there should be an error - [] - [] - [] + [] member public this.``Fsx.CompileFsx_7``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1441,13 +1387,11 @@ type UsingMSBuild() as this = for line in lines do printfn "%s" line AssertListContainsInOrder(lines, ["error FS0079: Could not load file"; "NonexistentFile.fs"; "because it does not exist or is inaccessible"]) - Assert.IsTrue(not(build.BuildSucceeded), "Expected build to fail") + Assert.True(not(build.BuildSucceeded), "Expected build to fail") // #r references should be respected. - [] - [] - [] + [] member public this.``Fsx.CompileFsx_8``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1462,13 +1406,11 @@ type UsingMSBuild() as this = let lines = GetOutputWindowPaneLines(this.VS) for line in lines do printfn "%s" line - Assert.IsTrue(build.BuildSucceeded, "Expected build to succeed") + Assert.True(build.BuildSucceeded, "Expected build to succeed") // Missing script file should be a reasonable failure, not a callstack. - [] - [] - [] + [] member public this.``Fsx.CompileFsx_Bug5414``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -1486,11 +1428,11 @@ type UsingMSBuild() as this = printfn "%s" line AssertNotContains(line,"error MSB") // Microsoft.FSharp.Targets(135,9): error MSB6006: "fsc.exe" exited with code -532462766. - Assert.IsTrue(not(build.BuildSucceeded), "Expected build to fail") + Assert.True(not(build.BuildSucceeded), "Expected build to fail") /// There was a problem in which synthetic tokens like #load were causing asserts - [] + [] member public this.``Fsx.SyntheticTokens``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -1503,7 +1445,7 @@ type UsingMSBuild() as this = ) /// There was a problem where an unclosed reference picked up the text of the reference on the next line. - [] + [] member public this.``Fsx.ShouldBeAbleToReference30Assemblies.Bug2050``() = let code = ["#light" @@ -1516,7 +1458,7 @@ type UsingMSBuild() as this = AssertCompListContains(completions,"Linq") /// There was a problem where an unclosed reference picked up the text of the reference on the next line. - [] + [] member public this.``Fsx.UnclosedHashReference.Case1``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -1524,7 +1466,7 @@ type UsingMSBuild() as this = "#reference \"" // Unclosed "#reference \"Hello There\""] ) - [] + [] member public this.``Fsx.UnclosedHashReference.Case2``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -1534,7 +1476,7 @@ type UsingMSBuild() as this = ) /// There was a problem where an unclosed reference picked up the text of the reference on the next line. - [] + [] member public this.``Fsx.UnclosedHashLoad``() = Helper.ExhaustivelyScrutinize( this.TestRunner, @@ -1543,9 +1485,7 @@ type UsingMSBuild() as this = "#load \"Hello There\""] ) - [] - [] - [] + [] member public this.``TypeProvider.UnitsOfMeasure.SmokeTest1``() = let code = ["open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames" @@ -1565,22 +1505,22 @@ type UsingMSBuild() as this = use _guard = this.UsingNewVS() let providerAssemblyName = PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") let providerAssembly = System.Reflection.Assembly.LoadFrom providerAssemblyName - Assert.IsNotNull(providerAssembly, "provider assembly should not be null") + Assert.NotNull(providerAssembly) let providerCounters = providerAssembly.GetType("DummyProviderForLanguageServiceTesting.GlobalCounters") - Assert.IsNotNull(providerCounters, "provider counters module should not be null") + Assert.NotNull(providerCounters) let totalCreationsMeth = providerCounters.GetMethod("GetTotalCreations") - Assert.IsNotNull(totalCreationsMeth, "totalCreationsMeth should not be null") + Assert.NotNull(totalCreationsMeth) let totalDisposalsMeth = providerCounters.GetMethod("GetTotalDisposals") - Assert.IsNotNull(totalDisposalsMeth, "totalDisposalsMeth should not be null") + Assert.NotNull(totalDisposalsMeth) let checkConfigsMeth = providerCounters.GetMethod("CheckAllConfigsDisposed") - Assert.IsNotNull(checkConfigsMeth, "checkConfigsMeth should not be null") + Assert.NotNull(checkConfigsMeth) let providerCounters2 = providerAssembly.GetType("ProviderImplementation.ProvidedTypes.GlobalCountersForInvalidation") - Assert.IsNotNull(providerCounters2, "provider counters #2 module should not be null") + Assert.NotNull(providerCounters2) let totalInvalidationHandlersAddedMeth = providerCounters2.GetMethod("GetInvalidationHandlersAdded") - Assert.IsNotNull(totalInvalidationHandlersAddedMeth, "totalInvalidationHandlersAddedMeth should not be null") + Assert.NotNull(totalInvalidationHandlersAddedMeth) let totalInvalidationHandlersRemovedMeth = providerCounters2.GetMethod("GetInvalidationHandlersRemoved") - Assert.IsNotNull(totalInvalidationHandlersRemovedMeth, "totalInvalidationHandlersRemovedMeth should not be null") + Assert.NotNull(totalInvalidationHandlersRemovedMeth) let totalCreations() = totalCreationsMeth.Invoke(null, [| |]) :?> int let totalDisposals() = totalDisposalsMeth.Invoke(null, [| |]) :?> int @@ -1598,8 +1538,8 @@ type UsingMSBuild() as this = let countInvalidationHandlersAdded() = totalInvalidationHandlersAdded() - startInvalidationHandlersAdded let countInvalidationHandlersRemoved() = totalInvalidationHandlersRemoved() - startInvalidationHandlersRemoved - Assert.IsTrue(startCreations >= startDisposals, "Check0") - Assert.IsTrue(startInvalidationHandlersAdded >= startInvalidationHandlersRemoved, "Check0") + Assert.True(startCreations >= startDisposals, "Check0") + Assert.True(startInvalidationHandlersAdded >= startInvalidationHandlersRemoved, "Check0") for i in 1 .. 50 do let solution = this.CreateSolution() let project = CreateProject(solution,"testproject" + string (i % 20)) @@ -1624,17 +1564,17 @@ type UsingMSBuild() as this = let d = countDisposals() // Creations should always be greater or equal to disposals - Assert.IsTrue(c >= d, "Check2, countCreations() >= countDisposals(), iteration " + string i + ", countCreations() = " + string c + ", countDisposals() = " + string d) + Assert.True(c >= d, "Check2, countCreations() >= countDisposals(), iteration " + string i + ", countCreations() = " + string c + ", countDisposals() = " + string d) // Creations can run ahead of iterations if the background checker resurrects the builder for a project // even after we've moved on from it. - Assert.IsTrue((c >= i), "Check3, countCreations() >= i, iteration " + string i + ", countCreations() = " + string c) + Assert.True((c >= i), "Check3, countCreations() >= i, iteration " + string i + ", countCreations() = " + string c) if not clearing then // By default we hold 3 build incrementalBuilderCache entries and 5 typeCheckInfo entries, so if we're not clearing // there should be some roots to project builds still present if i >= 3 then - Assert.IsTrue(c >= d + 3, "Check4a, c >= countDisposals() + 3, iteration " + string i + ", i = " + string i + ", countDisposals() = " + string d) + Assert.True(c >= d + 3, "Check4a, c >= countDisposals() + 3, iteration " + string i + ", i = " + string i + ", countDisposals() = " + string d) printfn "Check4a2, i = %d, countInvalidationHandlersRemoved() = %d" i (countInvalidationHandlersRemoved()) // If we forcefully clear out caches and force a collection, then we can say much stronger things... @@ -1644,31 +1584,30 @@ type UsingMSBuild() as this = let d = countDisposals() // Creations should be equal to disposals after a `ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients` - Assert.IsTrue((c = d), "Check4b, countCreations() = countDisposals(), iteration " + string i) - Assert.IsTrue((countInvalidationHandlersAdded() = countInvalidationHandlersRemoved()), "Check4b2, all invalidation handlers removed, iteration " + string i) + Assert.True((c = d), "Check4b, countCreations() = countDisposals(), iteration " + string i) + Assert.True((countInvalidationHandlersAdded() = countInvalidationHandlersRemoved()), "Check4b2, all invalidation handlers removed, iteration " + string i) let c = countCreations() let d = countDisposals() - Assert.IsTrue(c >= 50, "Check5, at end, countCreations() >= 50") + Assert.True(c >= 50, "Check5, at end, countCreations() >= 50") ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients(this.VS) let c = countCreations() let d = countDisposals() // Creations should be equal to disposals after a `ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients` - Assert.IsTrue((c = d), "Check6b, at end, countCreations() = countDisposals() after explicit clearing") - Assert.IsTrue((countInvalidationHandlersAdded() = countInvalidationHandlersRemoved()), "Check6b2, at end, all invalidation handlers removed after explicit clearing") + Assert.True((c = d), "Check6b, at end, countCreations() = countDisposals() after explicit clearing") + Assert.True((countInvalidationHandlersAdded() = countInvalidationHandlersRemoved()), "Check6b2, at end, all invalidation handlers removed after explicit clearing") checkConfigsDisposed() - [] + [] member public this.``TypeProvider.Disposal.SmokeTest1``() = this.TypeProviderDisposalSmokeTest(true) - [] + [] member public this.``TypeProvider.Disposal.SmokeTest2``() = this.TypeProviderDisposalSmokeTest(false) // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.TimeStamp.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.TimeStamp.fs index 76c6d663df2..530260a0d5f 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.TimeStamp.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.TimeStamp.fs @@ -4,15 +4,13 @@ namespace Tests.LanguageService.TimeStamp open System open System.IO -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService -[] -[] type UsingMSBuild() = inherit LanguageServiceBaseTests() @@ -46,7 +44,7 @@ type UsingMSBuild() = // In this bug, if you clean the dependent project, the dependee started getting errors again about the unresolved assembly. // The desired behavior is like C#, which is if the assembly disappears from disk, we use cached results of last time it was there. // Disabled due to issue #11752 --- https://github.com/dotnet/fsharp/issues/11752 - //[] + //[] member public this.``Regression.NoError.Timestamps.Bug3368b``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -88,8 +86,7 @@ type UsingMSBuild() = AssertNoErrorsOrWarnings(project2) // this is key, project2 remembers what used to be on disk, does not fail due to missing assembly // In this bug, the referenced project output didn't exist yet. Building dependee should cause update in dependent - [] - [] + [] member public this.``Regression.NoContainedString.Timestamps.Bug3368a``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -121,7 +118,7 @@ type UsingMSBuild() = AssertNoErrorSeenContaining(project2, "project1") // FEATURE: OnIdle() will reprocess open dirty files, even if those file do not currently have editor focus - // [] TODO This test does not work because the unit tests do not cover product code that implements this feature + // [] TODO This test does not work because the unit tests do not cover product code that implements this feature member public this.``Timestamps.Bug3368c``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -147,7 +144,7 @@ type UsingMSBuild() = TakeCoffeeBreak(this.VS) let errs = GetErrors(project2) - Assert.IsTrue(List.length errs > 0, "There should be errors (unresolved reference)") + Assert.True(List.length errs > 0, "There should be errors (unresolved reference)") // switch focus to a different file (to turn off 'focus' idle processing for file2) let file1 = OpenFile(project1,"File1.fs") @@ -156,7 +153,7 @@ type UsingMSBuild() = printfn "building dependent project..." Build project1 |> ignore let errs = GetErrors(project2) - Assert.IsTrue(List.length errs > 0, "There should be errors (unresolved reference)") + Assert.True(List.length errs > 0, "There should be errors (unresolved reference)") TakeCoffeeBreak(this.VS) // the code that should clear out the errors is in LanguageService.cs:LanguageService.OnIdle(), // but unit tests do not call this FSharp.LanguageService.Base code; TakeCoffeeBreak(this.VS) just simulates @@ -165,8 +162,7 @@ type UsingMSBuild() = AssertNoErrorsOrWarnings(project2) // FEATURE: When a referenced assembly's timestamp changes the reference is reread. - [] - [] + [] member public this.``Timestamps.ReferenceAssemblyChangeAbsolute``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -194,7 +190,7 @@ type UsingMSBuild() = SwitchToFile this.VS file2 MoveCursorToEndOfMarker(file2,"File1.File1.") let completions = AutoCompleteAtCursor(file2) - Assert.AreEqual(0, completions.Length) + Assert.Equal(0, completions.Length) // Now modify project1's file and rebuild. ReplaceFileInMemory file1 @@ -208,12 +204,11 @@ type UsingMSBuild() = MoveCursorToEndOfMarker(file2,"File1.File1.") TakeCoffeeBreak(this.VS) // Give enough time to catch up let completions = AutoCompleteAtCursor(file2) - Assert.AreNotEqual(0, completions.Length) + Assert.NotEqual(0, completions.Length) printfn "Completions=%A\n" completions // In this bug, relative paths to referenced assemblies weren't seen. - [] - [] + [] member public this.``Timestamps.ReferenceAssemblyChangeRelative``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -249,7 +244,7 @@ type UsingMSBuild() = SwitchToFile this.VS file2 MoveCursorToEndOfMarker(file2,"File1.File1.") let completions = AutoCompleteAtCursor(file2) - Assert.AreEqual(0, completions.Length) + Assert.Equal(0, completions.Length) // Now modify project1's file and rebuild. ReplaceFileInMemory file1 @@ -263,12 +258,11 @@ type UsingMSBuild() = MoveCursorToEndOfMarker(file2,"File1.File1.") TakeCoffeeBreak(this.VS) // Give enough time to catch up let completions = AutoCompleteAtCursor(file2) - Assert.AreNotEqual(0, completions.Length) + Assert.NotEqual(0, completions.Length) printfn "Completions=%A\n" completions // FEATURE: When a referenced project's assembly timestamp changes the reference is reread. - [] - [] + [] member public this.``Timestamps.ProjectReferenceAssemblyChange``() = use _guard = this.UsingNewVS() let solution = this.CreateSolution() @@ -302,7 +296,7 @@ type UsingMSBuild() = SwitchToFile this.VS file2 MoveCursorToEndOfMarker(file2,"File1.File1.") let completions = AutoCompleteAtCursor(file2) - Assert.AreEqual(0, completions.Length) + Assert.Equal(0, completions.Length) // Now modify project1's file and rebuild. ReplaceFileInMemory file1 @@ -316,7 +310,7 @@ type UsingMSBuild() = MoveCursorToEndOfMarker(file2,"File1.File1.") TakeCoffeeBreak(this.VS) // Give enough time to catch up let completions = AutoCompleteAtCursor(file2) - Assert.AreNotEqual(0, completions.Length) + Assert.NotEqual(0, completions.Length) printfn "Completions=%A\n" completions @@ -325,10 +319,9 @@ namespace Tests.LanguageService.TimeStamp open Tests.LanguageService open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem -open NUnit.Framework +open Xunit open Salsa.Salsa // Context project system -[] type UsingProjectSystem() = inherit UsingMSBuild(VsOpts = LanguageServiceExtension.ProjectSystemTestFlavour) \ No newline at end of file diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs index faf186f8cef..a0cedaf030f 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs @@ -8,7 +8,7 @@ open System.Collections.Generic open System.IO open System.Text.RegularExpressions open System.Xml.Linq -open NUnit.Framework +open Xunit // VS namespaces open Microsoft.VisualStudio @@ -23,13 +23,6 @@ open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem -[] -type public AssemblyResolverTestFixture () = - - [] - member public _.Init () = AssemblyResolver.addResolver () - -[][] type Config() = inherit TheTests() @@ -38,7 +31,7 @@ type Config() = static let SaveProject(project : UnitTestingFSharpProjectNode) = project.Save(null, 1, 0u) |> ignore - [] + [] member this.TargetPlatform () = this.MakeProjectAndDoWithProjectFileAndConfigChangeNotifier(["foo.fs"], [], this.MSBuildProjectMultiPlatformBoilerplate "Library", @@ -46,32 +39,32 @@ type Config() = ccn((project :> IVsHierarchy), "Debug|x86") project.ComputeSourcesAndFlags() let flags = project.CompilationOptions |> List.ofArray - Assert.IsTrue(List.exists (fun s -> s = "--platform:x86") flags) + Assert.True(List.exists (fun s -> s = "--platform:x86") flags) () )) - [] + [] member this.``Configs.EnsureAtLeastOneConfiguration`` () = this.HelperEnsureAtLeastOne @"" [|"Debug"|] // the goal of the test - when no configs, "Debug" should magically appear [|"x86"|] - [] + [] member this.``Configs.EnsureAtLeastOnePlatform`` () = this.HelperEnsureAtLeastOne @"" [|"Release"|] [|"Any CPU"|] // the goal of the test - when no platforms, "AnyCPU" should magically appear - [] + [] member this.``Configs.EnsureAtLeastOneConfigurationAndPlatform`` () = this.HelperEnsureAtLeastOne "" [|"Debug"|] // first goal of the test - when no configs, "Debug" should magically appear [|"Any CPU"|] // second goal of the test - when no platforms, "AnyCPU" should magically appear - [] + [] member this.``Configs.EnsureAtLeastOneConfiguration.Imported`` () = // Take advantage of the fact that we always create projects one directory below TempPath let tmpTargets = Path.Combine(Path.GetTempPath(), "foo.targets") @@ -88,7 +81,7 @@ type Config() = finally File.Delete tmpTargets - [] + [] member this.``Configs.EnsureAtLeastOnePlatform.Imported`` () = // Take advantage of the fact that we always create projects one directory below TempPath // The unit test failed due to the previous test use the same target name "foo.targets". @@ -106,7 +99,7 @@ type Config() = finally File.Delete tmpTargets - [] + [] member this.``Configs.Renaming`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiConfigBoilerplate ["Debug",""; "Release",""], @@ -122,7 +115,7 @@ type Config() = TheTests.AssertSimilarXml(expectedXDoc.Root, xDoc.Root) )) - [] + [] member this.``Configs.Deleting`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiConfigBoilerplate ["Debug",""; "Release",""], @@ -137,7 +130,7 @@ type Config() = let expectedXDoc = XDocument.Load(new StringReader(TheTests.SimpleFsprojText(["foo.fs"],[],expected))) TheTests.AssertSimilarXml(expectedXDoc.Root, xDoc.Root) )) - [] + [] member this.``Configs.Adding`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiConfigBoilerplate ["Debug",""; "Release",""], @@ -152,7 +145,7 @@ type Config() = let expectedXDoc = XDocument.Load(new StringReader(TheTests.SimpleFsprojText(["foo.fs"],[],expected))) TheTests.AssertSimilarXml(expectedXDoc.Root, xDoc.Root) )) - [] + [] member this.``Configs.AddingBaseless`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiConfigBoilerplate ["Debug",""; "Release",""], @@ -168,7 +161,7 @@ type Config() = TheTests.AssertSimilarXml(expectedXDoc.Root, xDoc.Root) )) - [] + [] member this.``Configs.Platforms.Deleting`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiPlatform ["Any CPU",""; "x86",""], @@ -185,7 +178,7 @@ type Config() = )) - [] + [] member this.``Configs.Platforms.Adding`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiPlatform ["Any CPU",""; "x86",""], @@ -202,7 +195,7 @@ type Config() = )) - [] + [] member this.``Configs.Platforms.AddingBaseless`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiPlatform ["Any CPU",""; "x86",""], diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Miscellaneous.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Miscellaneous.fs index 7aa25427e2d..800411f1bd7 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Miscellaneous.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Miscellaneous.fs @@ -18,13 +18,12 @@ open Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.VisualStudio.FSharp.Editor // Internal unittest namespaces -open NUnit.Framework +open Xunit open Salsa open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem -[][] type Miscellaneous() = inherit TheTests() @@ -34,7 +33,7 @@ type Miscellaneous() = static let SaveProject(project : UnitTestingFSharpProjectNode) = project.Save(null, 1, 0u) |> ignore - //[] // keep disabled unless trying to prove that UnhandledExceptionHandler is working + //[] // keep disabled unless trying to prove that UnhandledExceptionHandler is working member public this.EnsureThatUnhandledExceptionsCauseAnAssert() = this.MakeProjectAndDo([], ["System"], "", (fun proj -> let t = new System.Threading.Thread(new System.Threading.ThreadStart(fun () -> failwith "foo")) @@ -42,16 +41,16 @@ type Miscellaneous() = System.Threading.Thread.Sleep(1000) )) - [] + [] member public this.``Miscellaneous.CreatePropertiesObject`` () = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) use project = TheTests.CreateProject(projFile) let prop = project.CreatePropertiesObject() - Assert.AreEqual(typeof, prop.GetType()) + Assert.Equal(typeof, prop.GetType()) ) - [] + [] member public this.``Miscellaneous.TestProperties`` () = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) @@ -59,63 +58,63 @@ type Miscellaneous() = let prop = new FSharpProjectNodeProperties(project) prop.AssemblyName <- "a" - Assert.AreEqual("a", prop.AssemblyName) + Assert.Equal("a", prop.AssemblyName) // Output type and output file name prop.OutputType <- OutputType.Exe - Assert.AreEqual(OutputType.Exe, prop.OutputType) - Assert.AreEqual("a.exe", prop.OutputFileName) + Assert.Equal(OutputType.Exe, prop.OutputType) + Assert.Equal("a.exe", prop.OutputFileName) prop.OutputType <- OutputType.Library - Assert.AreEqual(OutputType.Library, prop.OutputType) - Assert.AreEqual("a.dll", prop.OutputFileName) + Assert.Equal(OutputType.Library, prop.OutputType) + Assert.Equal("a.dll", prop.OutputFileName) prop.OutputType <- OutputType.WinExe - Assert.AreEqual(OutputType.WinExe, prop.OutputType) - Assert.AreEqual("a.exe", prop.OutputFileName) + Assert.Equal(OutputType.WinExe, prop.OutputType) + Assert.Equal("a.exe", prop.OutputFileName) ) - [] + [] member public this.``Miscellaneous.CreateServices`` () = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) use project = TheTests.CreateProject(projFile) let proj = project.CreateServices(typeof) - Assert.AreEqual(typeof, proj.GetType()) + Assert.Equal(typeof, proj.GetType()) let eproj = project.CreateServices(typeof) - Assert.AreEqual(typeof, eproj.GetType()) + Assert.Equal(typeof, eproj.GetType()) let badservice = project.CreateServices(typeof) - Assert.IsNull(badservice) + Assert.Null(badservice) ) - [] + [] member public this.``Miscellaneous.FSharpFileNode.RelativeFilePath`` () = this.MakeProjectAndDo(["orig1.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "orig1.fs") let files = new List() project.FindNodesOfType(files) - Assert.AreEqual(1, files.Count) + Assert.Equal(1, files.Count) let file = files.[0] let path = file.RelativeFilePath - Assert.AreEqual("orig1.fs", path) + Assert.Equal("orig1.fs", path) )) - [] + [] member public this.``Miscellaneous.FSharpFileNode.CreateServices`` () = this.MakeProjectAndDo(["orig1.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "orig1.fs") let files = new List() project.FindNodesOfType(files) - Assert.AreEqual(1, files.Count) + Assert.Equal(1, files.Count) let file = files.[0] let badservice = file.CreateServices(typeof) - Assert.IsNull(badservice) + Assert.Null(badservice) let eproj = file.CreateServices(typeof) - Assert.AreEqual(typeof, eproj.GetType()) + Assert.Equal(typeof, eproj.GetType()) )) - //[] + //[] member public this.AttemptDragAndDrop() = printfn "starting..." let fsproj = "D:\Depot\staging\Test.fsproj" @@ -159,15 +158,14 @@ type Miscellaneous() = node <- node.NextSibling if node = null then finished <- true - Assert.AreNotEqual(node, null) + Assert.NotEqual(node, null) let itemId = node.ID project.DragEnter(iOleDataObject, keyboardState, itemId, &dwEffect) |> ignore () - [] - [] + [] member public this.``Automation.OutputGroup.OUTPUTLOC``() = this.MakeProjectAndDoWithProjectFile(["foo.fs"], [], this.MSBuildProjectMultiPlatform(["x86",""],"x86"), @@ -184,8 +182,7 @@ type Miscellaneous() = ) ) - [] - [] + [] member public this.``Automation.OutputGroups``() = DoWithTempFile "Test.fsproj" (fun file -> let text = TheTests.FsprojTextWithProjectReferences([],[],[],@" @@ -247,7 +244,7 @@ type Miscellaneous() = AssertEqual expected ogInfos ) - [] + [] member public this.``LoadProject.x86`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], ["System"], this.MSBuildProjectMultiPlatform(["x86",""],"x86"), @@ -262,8 +259,7 @@ type Miscellaneous() = AssertEqual 1 l.Count )) - [] - [] + [] member public this.``BuildAndClean``() = this.MakeProjectAndDoWithProjectFileAndConfigChangeNotifier(["foo.fs"], [], this.MSBuildProjectBoilerplate "Library", @@ -291,7 +287,7 @@ type Miscellaneous() = success <- fSuccess <> 0 printfn "Build %s, code %i, phase: %s." (if success then "succeeded" else "failed") fSuccess (if isCleaning then "Cleaning" else "Build") - event.Set() |> Assert.IsTrue + event.Set() |> Assert.True VSConstants.S_OK member this.Tick pfContinue = pfContinue <- 1; VSConstants.S_OK } @@ -301,10 +297,10 @@ type Miscellaneous() = let output = VsMocks.vsOutputWindowPane(ref []) let doBuild target = success <- false - event.Reset() |> Assert.IsTrue + event.Reset() |> Assert.True buildMgrAccessor.BeginDesignTimeBuild() |> ValidateOK // this is not a design-time build, but our mock does all the right initialization of the build manager for us, similar to what the system would do in VS for real buildableCfg.Build(0u, output, target) - event.WaitOne() |> Assert.IsTrue + event.WaitOne() |> Assert.True buildMgrAccessor.EndDesignTimeBuild() |> ValidateOK // this is not a design-time build, but our mock does all the right initialization of the build manager for us, similar to what the system would do in VS for real AssertEqual true success @@ -324,7 +320,7 @@ type Miscellaneous() = )) - //KnownFail: [] + //KnownFail: [] member public this.``ErrorReporting.EmptyModuleReportedAtTheLastLine``() = let (outputWindowPaneErrors : string list ref) = ref [] // output window pane errors let vso = VsMocks.vsOutputWindowPane(outputWindowPaneErrors) @@ -357,17 +353,11 @@ type Miscellaneous() = () )) -#if NUNIT_V2 - [][)>] - member public this.``DebuggingDLLFails``() = this.``DebuggingDLLFailsFunc``() -#else - [] + [] member public this.``DebuggingDLLFails``() = - Assert.That((fun () -> this.``DebuggingDLLFailsFunc``()), NUnit.Framework.Throws.TypeOf(typeof)) -#endif + Assert.Throws((fun () -> this.``DebuggingDLLFailsFunc``())) - [] - [] + [] member public this.``DebuggingEXESucceeds``() = this.MakeProjectAndDoWithProjectFileAndConfigChangeNotifier(["foo.fs"], [], this.MSBuildProjectBoilerplate "Exe", @@ -376,7 +366,7 @@ type Miscellaneous() = let fooPath = Path.Combine(project.ProjectFolder, "foo.fs") File.AppendAllText(fooPath, "#light") let buildResult = project.Build("Build") - Assert.IsTrue buildResult.IsSuccessful + Assert.True buildResult.IsSuccessful AssertEqual true (File.Exists (Path.Combine(project.ProjectFolder, "bin\\Debug\\Blah.exe"))) let mutable configurationInterface : IVsCfg = null @@ -387,11 +377,11 @@ type Miscellaneous() = config.DebugLaunch(0ul) |> ignore with | :? ClassLibraryCannotBeStartedDirectlyException -> Assert.Fail("Exe should be debuggable") - | _ -> Assert.Fail() // DmiLom: Currently DebugLaunch() swallows most exceptions, in future if we improve DebugLaunch() we will expect it to throw a particular exception here + | _ -> failwith "" // DmiLom: Currently DebugLaunch() swallows most exceptions, in future if we improve DebugLaunch() we will expect it to throw a particular exception here () )) - [] + [] member public this.``IsDocumentInProject`` () = DoWithTempFile "Test.fsproj" (fun file -> let fakeCsLibProjectFile = @"..\CsLib\CsLib.csproj" @@ -414,7 +404,7 @@ type Miscellaneous() = checkInProject false "System.dll" ) - //Known Fail: [] + //Known Fail: [] member public this.``PreBuildEvent`` () = this.MakeProjectAndDoWithProjectFile(["foo.fs"], ["System"], "", (fun project projFileName -> @@ -434,10 +424,10 @@ type Miscellaneous() = printfn "Build output:" !outputWindowPaneErrors |> Seq.iter (printfn "%s") let expectedRegex = new Regex("\\s*ProjectExt\\[.fsproj\\]") - Assert.IsTrue(!outputWindowPaneErrors |> List.exists (fun s -> expectedRegex.IsMatch(s)), "did not see expected value in build output") + Assert.True(!outputWindowPaneErrors |> List.exists (fun s -> expectedRegex.IsMatch(s)), "did not see expected value in build output") )) - [] + [] member public this.``BuildMacroValues`` () = let logger (message:string) = System.IO.File.AppendAllText(@"c:\temp\logfile.txt", (message + Environment.NewLine)) @@ -455,23 +445,23 @@ type Miscellaneous() = // Verify Solution values let solutionDir = project.GetBuildMacroValue("SolutionDir") - Assert.IsNotNull (solutionDir, "SolutionDir is NULL") - Assert.IsFalse ( (solutionDir = "*Undefined*"), "SolutionDir not defined") + Assert.NotNull(solutionDir) + Assert.False ( (solutionDir = "*Undefined*"), "SolutionDir not defined") let solutionFileName = project.GetBuildMacroValue("SolutionFileName") - Assert.IsNotNull (solutionFileName, "SolutionFileName is null") - Assert.IsFalse ( (solutionFileName = "*Undefined*"), "SolutionFileName not defined") + Assert.NotNull(solutionFileName) + Assert.False ( (solutionFileName = "*Undefined*"), "SolutionFileName not defined") let solutionName = project.GetBuildMacroValue("SolutionName") - Assert.IsNotNull (solutionName, "SolutionName is null") - Assert.IsFalse ( (solutionName = "*Undefined*"), "SolutionName not defined") + Assert.NotNull(solutionName) + Assert.False ( (solutionName = "*Undefined*"), "SolutionName not defined") let solutionExt = project.GetBuildMacroValue("SolutionExt") - Assert.IsNotNull (solutionExt, "SolutionExt is null") - Assert.IsFalse ( (solutionExt = "*Undefined*"), "SolutionExt not defined") + Assert.NotNull(solutionExt) + Assert.False ( (solutionExt = "*Undefined*"), "SolutionExt not defined") ) - [] + [] member public this.CreateFSharpManifestResourceName () = DoWithTempFile "Test.fsproj" (fun file -> let text = TheTests.FsprojTextWithProjectReferences(["foo.fs";"Bar.resx"; "Bar.de.resx"; "Xyz\Baz.ru.resx"; "Abc.resources"],[],[],"") @@ -491,14 +481,14 @@ type Miscellaneous() = let buildMgr = project.Site.GetService(typeof) :?> IVsSolutionBuildManager let cfgs = Array.create 1 (null : IVsProjectCfg) let hr = buildMgr.FindActiveProjectCfg(System.IntPtr.Zero, System.IntPtr.Zero, project, cfgs) - Assert.AreEqual(VSConstants.S_OK, hr) - Assert.IsNotNull(cfgs.[0]) + Assert.Equal(VSConstants.S_OK, hr) + Assert.NotNull(cfgs.[0]) let mutable cfgName = "" let hr = cfgs.[0].get_CanonicalName(&cfgName) - Assert.AreEqual(VSConstants.S_OK, hr) + Assert.Equal(VSConstants.S_OK, hr) cfgName - [] + [] member this.``MSBuildExtensibility.BrokenCompileDependsOn.WithRecovery`` () = this.MakeProjectAndDoWithProjectFileAndConfigChangeNotifier( ["foo.fs";"bar.fs"], @@ -529,7 +519,7 @@ type Miscellaneous() = project.Reload() // Ensure we are not in 'Foo' config, and thus expect failure let curCfgCanonicalName = this.GetCurrentConfigCanonicalName(project) - Assert.IsFalse(curCfgCanonicalName.StartsWith("Foo"), sprintf "default config should not be 'Foo'! in fact it had canonical name '%s'" curCfgCanonicalName) + Assert.False(curCfgCanonicalName.StartsWith("Foo"), sprintf "default config should not be 'Foo'! in fact it had canonical name '%s'" curCfgCanonicalName) // Now the project system is in a state where ComputeSourcesAndFlags will fail. // Our goal is to at least be able to open individual source files and treat them like 'files outside a project' with regards to intellisense, etc. // Also, if the user does 'Build', he will get an error which will help diagnose the problem. @@ -537,10 +527,10 @@ type Miscellaneous() = let ips = ipps.GetProjectSite() let expected = [| |] // Ideal behavior is [|"foo.fs";"bar.fs"|], and we could choose to improve this in the future. For now we are just happy to now throw/crash. let actual = ips.CompilationSourceFiles - Assert.AreEqual(expected, actual, "project site did not report expected set of source files") + Assert.Equal(expected, actual) ) - [] + [] member public this.TestBuildActions () = DoWithTempFile "Test.fsproj" (fun file -> let text = TheTests.FsprojTextWithProjectReferences(["foo.fs";"Bar.resx"; "Bar.de.resx"; "Xyz\Baz.ru.resx"; "Abc.resources"],[],[],"") @@ -571,7 +561,7 @@ type Miscellaneous() = () ) - [] + [] member public this.TestBuildActionConversions () = let replace (pattern:string) (replacement:string) (input:string) = Regex.Replace(input, pattern, replacement) @@ -582,10 +572,10 @@ type Miscellaneous() = props :?> BuildableNodeProperties let checkNotStandardBuildAction buildAction = - Assert.IsFalse(VSLangProj.prjBuildAction.prjBuildActionNone = buildAction, "Unexpected None match") - Assert.IsFalse(VSLangProj.prjBuildAction.prjBuildActionCompile = buildAction, "Unexpected Compile match") - Assert.IsFalse(VSLangProj.prjBuildAction.prjBuildActionContent = buildAction, "Unexpected Content match") - Assert.IsFalse(VSLangProj.prjBuildAction.prjBuildActionEmbeddedResource = buildAction, "Unexpected EmbeddedResource match") + Assert.False(VSLangProj.prjBuildAction.prjBuildActionNone = buildAction, "Unexpected None match") + Assert.False(VSLangProj.prjBuildAction.prjBuildActionCompile = buildAction, "Unexpected Compile match") + Assert.False(VSLangProj.prjBuildAction.prjBuildActionContent = buildAction, "Unexpected Content match") + Assert.False(VSLangProj.prjBuildAction.prjBuildActionEmbeddedResource = buildAction, "Unexpected EmbeddedResource match") DoWithTempFile "Test.fsproj" (fun file -> let text = @@ -598,32 +588,32 @@ type Miscellaneous() = // test proper behavior from project file let node = getBuildableNodeProps project "Compile.fs" - Assert.IsTrue(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionCompile, "Compile build action failed") - Assert.IsTrue(node.ItemType = "Compile", "Compile item type failed") + Assert.True(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionCompile, "Compile build action failed") + Assert.True(node.ItemType = "Compile", "Compile item type failed") let node = getBuildableNodeProps project "None.fs" - Assert.IsTrue(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionNone, "None build action failed") - Assert.IsTrue(node.ItemType = "None", "None item type failed") + Assert.True(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionNone, "None build action failed") + Assert.True(node.ItemType = "None", "None item type failed") let node = getBuildableNodeProps project "Resource.fs" checkNotStandardBuildAction node.BuildAction - Assert.IsTrue(node.ItemType = "Resource", "Resource item type failed") + Assert.True(node.ItemType = "Resource", "Resource item type failed") let node = getBuildableNodeProps project "Dude.fs" checkNotStandardBuildAction node.BuildAction - Assert.IsTrue(node.ItemType = "Dude", "Dude item type failed") + Assert.True(node.ItemType = "Dude", "Dude item type failed") // test handling of bogus values node.BuildAction <- enum 100 - Assert.IsTrue(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionNone, "Bogus build action not mapped to None") + Assert.True(node.BuildAction = VSLangProj.prjBuildAction.prjBuildActionNone, "Bogus build action not mapped to None") node.ItemType <- "Wibble" - Assert.IsTrue(node.ItemType = "None", "Bogus item type not mapped to None") + Assert.True(node.ItemType = "None", "Bogus item type not mapped to None") () ) - [] + [] member this.``WildcardsInProjectFile.ThrowingCase`` () = DoWithTempFile "Test.fsproj"(fun file -> let text = TheTests.FsprojTextWithProjectReferences(["*.fs"],[],[],"") @@ -639,10 +629,10 @@ type Miscellaneous() = exceptionThrown <- true AssertEqual "*.fs" e.ItemSpecification AssertEqual "Compile" e.ItemType - Assert.IsTrue(exceptionThrown) + Assert.True(exceptionThrown) ) - [] + [] member this.``WildcardsInProjectFile.OkCase`` () = DoWithTempFile "Test.fsproj"(fun file -> let text = TheTests.FsprojTextWithProjectReferences(["*.fs"],[],[],"") @@ -659,13 +649,12 @@ type Miscellaneous() = | [ _; fn ] -> // first file is AssemblyAttributes.fs AssertEqual fileName fn | _ -> - sprintf "wring set of compile items %A" items |> Assert.Fail + failwithf "wring set of compile items %A" items () finally project.Close() |> ignore ) -[] type Utilities() = (* Simulation of the code found in Xaml editor that we were crashing. The relevent code is pasted below. @@ -733,24 +722,24 @@ type Utilities() = let CheckPublicKeyToString(bytes,expect) = let actual = KeyToken.ToHexString(bytes) - Assert.AreEqual(expect, actual) + Assert.Equal(expect, actual) SimulateXamlEditorReceivingThroughDTE(actual) - [] + [] member public this.``PublicKeyToken.0000000000000000``() = CheckPublicKeyToString([|0uy;0uy;0uy;0uy;0uy;0uy;0uy;0uy|], "0000000000000000") - [] + [] member public this.``PublicKeyToken.0000000000000001``() = CheckPublicKeyToString([|0uy;0uy;0uy;0uy;0uy;0uy;0uy;1uy|], "0000000000000001") - [] + [] member public this.``PublicKeyToken.0a00000000000001``() = CheckPublicKeyToString([|0xauy;0uy;0uy;0uy;0uy;0uy;0uy;1uy|], "0a00000000000001") - [] + [] member public this.``Parse MSBuild property of type Int64`` () = - Assert.AreEqual(123L, ProjectNode.ParsePropertyValueToInt64("123")) - Assert.AreEqual(255L, ProjectNode.ParsePropertyValueToInt64("0xFF")) - Assert.AreEqual(null, ProjectNode.ParsePropertyValueToInt64("")) - Assert.AreEqual(null, ProjectNode.ParsePropertyValueToInt64(null)) + Assert.Equal(123L, ProjectNode.ParsePropertyValueToInt64("123").Value) + Assert.Equal(255L, ProjectNode.ParsePropertyValueToInt64("0xFF").Value) + Assert.Null(ProjectNode.ParsePropertyValueToInt64("")) + Assert.Null(ProjectNode.ParsePropertyValueToInt64(null)) Throws(fun () -> ignore (ProjectNode.ParsePropertyValueToInt64("abc"))) Throws(fun () -> ignore (ProjectNode.ParsePropertyValueToInt64("12333333333333333333333333"))) diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.MultiTargeting.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.MultiTargeting.fs index f1b699a428c..1e393f7ceed 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.MultiTargeting.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.MultiTargeting.fs @@ -8,7 +8,7 @@ open System.IO open System.Reflection open System.Text.RegularExpressions open System.Xml.Linq -open NUnit.Framework +open Xunit open Salsa open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers @@ -16,7 +16,6 @@ open UnitTests.TestLib.ProjectSystem open Microsoft.VisualStudio.FSharp.ProjectSystem -[][] type MultiTargeting() = inherit TheTests() @@ -35,7 +34,7 @@ type MultiTargeting() = File.AppendAllText(projFile, TheTests.FsprojTextWithProjectReferencesAndOtherFlags([], [refLibPath], [], null, "", "v4.0")) refLibPath - [] + [] member public this.``Multitargeting.CheckIconForMismatchedAssemblyReference`` () = DoWithTempFile "Test.fsproj" (fun projFile -> let sp, ccn = VsMocks.MakeMockServiceProviderAndConfigChangeNotifier40() @@ -43,14 +42,14 @@ type MultiTargeting() = use project = TheTests.CreateProject(projFile, "true", ccn, sp) let l = new List() project.FindNodesOfType(l) - Assert.AreEqual(1, l.Count) - Assert.AreEqual(refLibPath, l.[0].Url) - Assert.AreEqual(refLibPath, l.[0].Caption) + Assert.Equal(1, l.Count) + Assert.Equal(refLibPath, l.[0].Url) + Assert.Equal(refLibPath, l.[0].Caption) let ref = l.[0] - Assert.AreEqual(true, ref.CanShowDefaultIcon()) + Assert.Equal(true, ref.CanShowDefaultIcon()) ) - [] + [] member public this.``Multitargeting.CheckIconForMatchedAssemblyReference20`` () = DoWithTempFile "Test.fsproj" (fun projFile -> let sp, ccn = VsMocks.MakeMockServiceProviderAndConfigChangeNotifier20() @@ -58,14 +57,14 @@ type MultiTargeting() = use project = TheTests.CreateProject(projFile, "true", ccn, sp) let l = new List() project.FindNodesOfType(l) - Assert.AreEqual(1, l.Count) - Assert.AreEqual(refLibPath, l.[0].Url) - Assert.AreEqual(refLibPath, l.[0].Caption) + Assert.Equal(1, l.Count) + Assert.Equal(refLibPath, l.[0].Url) + Assert.Equal(refLibPath, l.[0].Caption) let ref = l.[0] - Assert.AreEqual(true, ref.CanShowDefaultIcon()) + Assert.Equal(true, ref.CanShowDefaultIcon()) ) - [] + [] member public this.``Multitargeting.DetermineRuntimeAndSKU`` () = DoWithTempFile "Test.fsproj" (fun projFile -> let sp, ccn = VsMocks.MakeMockServiceProviderAndConfigChangeNotifier40() @@ -74,62 +73,62 @@ type MultiTargeting() = let validate (fn : System.Runtime.Versioning.FrameworkName) eR eS = let (runtime, sku) = project.DetermineRuntimeAndSKU(fn.ToString()) - Assert.AreEqual(eR, runtime) - Assert.AreEqual(eS, sku) + Assert.Equal(eR, runtime) + Assert.Equal(eS, sku) validate (new System.Runtime.Versioning.FrameworkName(".NETFramework", new System.Version(4, 0))) "v4.0" ".NETFramework,Version=v4.0" validate (new System.Runtime.Versioning.FrameworkName(".NETFramework", new System.Version(2, 0))) "v2.0.50727" null ) - [] + [] member public this.``Multitargeting.AppConfigNoStartupNode`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", "sku") - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.AppConfigVersionExistsAddNewSku`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", "sku") - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.AppConfigVersionExistsReplaceSku`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", "sku") - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.AppConfigVersionExistsRemoveSku`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", null) - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.AppConfigVersionReplaceOldRuntime`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", "sku") - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) - Assert.IsFalse(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) + Assert.False(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.AppConfigVersionReplaceOldRuntimes`` () = let root = XElement.Parse("") let dirty = LangConfigFile.PatchUpXml(root, "version", "sku") - Assert.IsTrue(dirty) - Assert.IsTrue(root.ToString().Contains("")) - Assert.IsFalse(root.ToString().Contains("")) - Assert.IsFalse(root.ToString().Contains("")) + Assert.True(dirty) + Assert.True(root.ToString().Contains("")) + Assert.False(root.ToString().Contains("")) + Assert.False(root.ToString().Contains("")) - [] + [] member public this.``Multitargeting.TestFrameworkNameToVersionString`` () = let validatePair name str = let res = HierarchyNode.GetFrameworkVersionString(name) - Assert.AreEqual(str, res) + Assert.Equal(str, res) validatePair (new System.Runtime.Versioning.FrameworkName(".NETFramework", new System.Version(4,0))) "v4.0" validatePair (new System.Runtime.Versioning.FrameworkName(".NETFramework", new System.Version(4,0,5))) "v4.0.5" @@ -143,7 +142,7 @@ type MultiTargeting() = validatePair (new System.Runtime.Versioning.FrameworkName(".NETFramework", new System.Version(2,0,0,1))) "v2.0" (* - [] + [] member public this.``Multitargeting.AddAppConfigIfRetargetTo40Full`` () = DoWithTempFile "Test.fsproj" (fun projFile -> let sp, ccn = VsMocks.MakeMockServiceProviderAndConfigChangeNotifier20() @@ -157,10 +156,10 @@ type MultiTargeting() = project.FixupAppConfigOnTargetFXChange(fn.ToString(), "4.3.0.0", false) |> ignore let appFile = Path.Combine((Path.GetDirectoryName projFile), "app.config") let appText = System.IO.File.ReadAllText(appFile) - Assert.IsTrue(appText.Contains("")) - //Assert.IsTrue(appText.Contains("")) - //Assert.IsTrue(appText.Contains("")) - //Assert.IsTrue(appText.Contains("")) + Assert.True(appText.Contains("")) + //Assert.True(appText.Contains("")) + //Assert.True(appText.Contains("")) + //Assert.True(appText.Contains("")) () ) *) diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Project.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Project.fs index ac6b083a0cb..993a3590e6c 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Project.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Project.fs @@ -8,11 +8,12 @@ open System.Collections.Generic open System.IO open System.Text.RegularExpressions open System.Xml.Linq -open NUnit.Framework +open Xunit // VS namespaces open Microsoft.VisualStudio open Microsoft.VisualStudio.Shell.Interop +open Microsoft.VisualStudio.FSharp open Microsoft.VisualStudio.FSharp.ProjectSystem // Internal unittest namespaces @@ -22,10 +23,11 @@ open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem -[][] type Project() = inherit TheTests() + do + AssemblyResolver.addResolver () //TODO: look for a way to remove the helper functions static let ANYTREE = Tree("",Nil,Nil) @@ -34,7 +36,7 @@ type Project() = static let SaveProject(project : UnitTestingFSharpProjectNode) = project.Save(null, 1, 0u) |> ignore - [] + [] member public _.NewFolderOnProjectMenu() = printfn "starting..." let package = new FSharpProjectPackage() @@ -51,7 +53,7 @@ type Project() = Assert.Fail("Unexpected: New Folder was not enabled") () - [] + [] member public this.``FsprojFileToSolutionExplorer.FileOrderInFsprojIsRespected.Case1``() = let compileItems = ["one.fs"; "two.fs"; "three.fs"] let expect = Tree("References", ANYTREE, @@ -63,7 +65,7 @@ type Project() = // "one" "three" "two" this.``FsprojFileToSolutionExplorer.PositiveTest``(compileItems, "", expect) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileOrderInFsprojIsRespected.Case2``() = let compileItems = [@"A\B\D\foo.fs"; @"A\B\C\bar.fs"] let expect = Tree("References", ANYTREE, @@ -79,7 +81,7 @@ type Project() = // no alphabetization of files or folders this.``FsprojFileToSolutionExplorer.PositiveTest``(compileItems, "", expect) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileOrderInFsprojIsRespected.Case3``() = let compileItems = [@"B\foo.fs"; @"A\bar.fs"] let other = @" @@ -99,7 +101,7 @@ type Project() = // Including folder should not put folder at front of other folders this.``FsprojFileToSolutionExplorer.PositiveTest``(compileItems, other, expect) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileOrderInFsprojIsRespected.Case4``() = let compileItems = [@"foo.fs"; @"A\bar.fs"] let other = @" @@ -119,7 +121,7 @@ type Project() = this.``FsprojFileToSolutionExplorer.PositiveTest``(compileItems, other, expect) - [] + [] member public this.``FsprojFileToSolutionExplorer.LinksIntoFoldersAreRespected``() = let compileItems = [] let other = @" @@ -144,7 +146,7 @@ type Project() = this.``FsprojFileToSolutionExplorer.PositiveTest``(compileItems, other, expect) - [] + [] member public this.``Links.AddLinkToRootWorks``() = let compileItems = [@"Folder\foo.fs"; @"bar.fs"; ] this.MakeProjectAndDoWithProjectFile(compileItems, [], "", (fun project fileName -> @@ -168,7 +170,7 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``Links.AddLinkToSubfolderWorks``() = let compileItems = [@"bar.fs"; @"Folder\foo.fs"; ] this.MakeProjectAndDoWithProjectFile(compileItems, [], "", (fun project fileName -> @@ -190,7 +192,7 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``Links.AddLinkToRootWorksForNonFsFile``() = let compileItems = [@"Folder\foo.fs"; @"bar.fs"; ] this.MakeProjectAndDoWithProjectFile(compileItems, [], "", (fun project fileName -> @@ -214,7 +216,7 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``Removal.ExcludeFileShouldDirtyProjectFileAndBeSeenOnDiskAfterSave``() = let items = MSBuildItems([CompileItem "foo.fs"; CompileItem "bar.fs"]) this.MakeProjectAndDoWithProjectFile([], [], items.ToString(), (fun project fileName -> @@ -235,7 +237,7 @@ type Project() = AssertEqualMsg false (fsprojFileText.Contains(toVerify)) "it was not removed from the .fsproj on disk" )) - [] + [] member public this.``Removal.RemoveReferenceShouldDirtyProjectFileAndBeSeenOnDiskAfterSave``() = let items = MSBuildItems([CompileItem "foo.fs"; CompileItem "bar.fs"]) this.MakeProjectAndDoWithProjectFile([], ["System"], items.ToString(), (fun project fileName -> @@ -256,7 +258,7 @@ type Project() = AssertEqualMsg false (fsprojFileText.Contains(toVerify)) "it was not removed from the .fsproj on disk" )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.MoveUpShouldDirtyProject``() = let items = MSBuildItems([CompileItem "foo.fs"; CompileItem "bar.fs"]) this.MakeProjectAndDoWithProjectFile([], [], items.ToString(), (fun project fileName -> @@ -273,7 +275,7 @@ type Project() = TheTests.AssertSameTree(expect, project.FirstChild) )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.MoveDownShouldDirtyProject``() = let items = MSBuildItems([CompileItem "foo.fs"; CompileItem "bar.fs"]) this.MakeProjectAndDoWithProjectFile([], [], items.ToString(), (fun project fileName -> @@ -299,7 +301,7 @@ type Project() = member private this.SampleFolderWithItemsEntity = ([CompileItem @"MyFolder\x1.fs"; CompileItem @"MyFolder\Sub\x2.fs"; CompileItem @"MyFolder\x3.fs"], fun t -> Tree("MyFolder",Tree("x1.fs", Nil, Tree("Sub", Tree("x2.fs", Nil, Nil), Tree("x3.fs", Nil, Nil))), t)) - [] + [] member public this.``SpecificVersion.OptionsSavedToFsprojFile``() = let items = MSBuildItems( [CompileItem "foo.fs"] ) this.MakeProjectAndDoWithProjectFile([], ["System"], items.ToString(), (fun project fileName -> @@ -314,12 +316,12 @@ type Project() = let expected = XDocument.Load(new StringReader(@"True")).Root TheTests.AssertSimilarXml(expected, e) let inc = e.Attributes() |> WithAttrName "Include" |> Seq.head - Assert.IsTrue(inc.Value.StartsWith("System, Version", StringComparison.Ordinal), "assembly reference lacks version")) + Assert.True(inc.Value.StartsWith("System, Version", StringComparison.Ordinal), "assembly reference lacks version")) false, (fun (e:XElement) -> let expected = XDocument.Load(new StringReader(@"False")).Root TheTests.AssertSimilarXml(expected, e) let inc = e.Attributes() |> WithAttrName "Include" |> Seq.head - Assert.IsTrue(inc.Value.StartsWith("System, Version", StringComparison.Ordinal), "assembly reference lacks version")) + Assert.True(inc.Value.StartsWith("System, Version", StringComparison.Ordinal), "assembly reference lacks version")) |] let props = system.NodeProperties :?> AssemblyReferenceProperties for v, f in a do @@ -333,7 +335,7 @@ type Project() = f refNode )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileRenaming.RenamingAFileDoesNotChangeOrderInSolutionExplorerOrMSBuild``() = for entity, treeMaker in [this.SampleFileEntity; this.SampleEmptyFolderEntity] do let items = MSBuildItems( [CompileItem "foo.fs"] @ entity ) @@ -390,15 +392,15 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAboveFile``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAbove``(this.SampleFileEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAboveEmptyFolder``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAbove``(this.SampleEmptyFolderEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAboveFolderWithItems``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedUpAbove``(this.SampleFolderWithItemsEntity) @@ -431,15 +433,15 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelowFile``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelow``(this.SampleFileEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelowEmptyFolder``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelow``(this.SampleEmptyFolderEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelowFolderWithItems``() = this.``FsprojFileToSolutionExplorer.FileMovement.EntityCanBeMovedDownBelow``(this.SampleFolderWithItemsEntity) @@ -484,15 +486,15 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAboveFile``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAbove``(this.SampleFileEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAboveEmptyFolder``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAbove``(this.SampleEmptyFolderEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAboveFolderWithItems``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedUpAbove``(this.SampleFolderWithItemsEntity) @@ -537,19 +539,19 @@ type Project() = TheTests.HelpfulAssertMatches '<' regexStr fsprojFileText )) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelowFile``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelow``(this.SampleFileEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelowEmptyFolder``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelow``(this.SampleEmptyFolderEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelowFolderWithItems``() = this.``FsprojFileToSolutionExplorer.FileMovement.FolderWithItemsCanBeMovedDownBelow``(this.SampleFolderWithItemsEntity) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.NegativeTests.EntityCannotBeMovedAboveReferences``() = for entity in this.SampleEntities do printfn "=========> testing moving %s" (entity.ToString()) @@ -562,7 +564,7 @@ type Project() = let foo = TheTests.FindNodeWithCaption(project, entity.Caption()) TheTests.EnsureMoveUpDisabled(foo) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.NegativeTests.EntityCannotBeMovedUpWhenTopOfFolder``() = for entity in this.SampleEntities |> List.map (fun e -> e.IntoFolder(@"Folder\")) do printfn "=========> testing moving %s" (entity.ToString()) @@ -575,7 +577,7 @@ type Project() = let bar = TheTests.FindNodeWithCaption(project, entity.Caption()) TheTests.EnsureMoveUpDisabled(bar) - [] + [] member public this.``FsprojFileToSolutionExplorer.FileMovement.NegativeTests.EntityCannotBeMovedDownWhenBottomOfFolder``() = for entity in this.SampleEntities |> List.map (fun e -> e.IntoFolder(@"Folder\")) do printfn "=========> testing moving %s" (entity.ToString()) @@ -588,7 +590,7 @@ type Project() = let bar = TheTests.FindNodeWithCaption(project, entity.Caption()) TheTests.EnsureMoveDownDisabled(bar) - [] + [] member public this.``RenameFile.FailureToRenameInRDT.Bug616680.EnsureRevertToKnownConsistentState``() = this.MakeProjectAndDo(["orig1.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "orig1.fs") @@ -615,7 +617,7 @@ type Project() = File.Delete(absFilePath) )) - [] + [] member public this.``RenameFile.FailureToRenameInRDT.Bug616680.EnsureThatFileOrderDidNotChange``() = this.MakeProjectAndDo(["a.fs";"b.fs";"orig1.fs";"c.fs";"d.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "orig1.fs") @@ -646,7 +648,7 @@ type Project() = File.Delete(absFilePath) )) - [] + [] member public this.``RenameFile.VerifyItemIdsRemainsTheSame``() = let name1 = "orig.fs" let name2 = "orig2.fs" @@ -668,7 +670,7 @@ type Project() = File.Delete(absFilePath) )) - [] + [] member public this.``RenameFile.MainlineSuccessCase``() = this.MakeProjectAndDo(["orig1.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "orig1.fs") @@ -694,7 +696,7 @@ type Project() = File.Delete(absFilePath) )) - [] //ref bug https://github.com/dotnet/fsharp/issues/259 + [] //ref bug https://github.com/dotnet/fsharp/issues/259 member public this.``RenameFile.InFolder``() = this.MakeProjectAndDo(["file1.fs"; @"Folder1\file2.fs"; @"Folder1\nested1.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "Folder1", "nested1.fs") @@ -757,7 +759,7 @@ type Project() = (* Disabled for now - see https://github.com/dotnet/fsharp/pull/3071 - this is testing old project system features - [] + [] member public this.``RenameFile.BuildActionIsResetBasedOnFilenameExtension``() = let GetTextFromBuildAction (action:VSLangProj.prjBuildAction) = match action with @@ -832,8 +834,7 @@ type Project() = *) - [] - [] + [] member public this.``FsprojOutputWindow.ErrorOriginColumnsAreBase1``() = let (outputWindowPaneErrors : string list ref) = ref [] // output window pane errors let vso = VsMocks.vsOutputWindowPane(outputWindowPaneErrors) @@ -856,8 +857,7 @@ type Project() = AssertEqual (List.length errors) 1 ) - [] - [] + [] member public this.``FsprojOutputWindow.HighUnicodeCharactersAreProperlyDisplayed``() = let (outputWindowPaneErrors : string list ref) = ref [] // output window pane errors let vso = VsMocks.vsOutputWindowPane(outputWindowPaneErrors) diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.ProjectItems.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.ProjectItems.fs index 3e1e26c8f22..26c25a7edf6 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.ProjectItems.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.ProjectItems.fs @@ -4,20 +4,19 @@ namespace Tests.ProjectSystem open System open System.IO -open NUnit.Framework +open Xunit open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.ProjectSystem open Microsoft.VisualStudio.FSharp.ProjectSystem -[][] type ProjectItems() = inherit TheTests() //TODO: look for a way to remove the helper functions static let ANYTREE = Tree("",Nil,Nil) - [] + [] member public this.``RemoveAssemblyReference.NoIVsTrackProjectDocuments2Events``() = this.MakeProjectAndDo(["file.fs"], ["System.Numerics"],"", (fun project -> let listener = project.Site.GetService(typeof) :?> Salsa.VsMocks.IVsTrackProjectDocuments2Listener @@ -28,7 +27,7 @@ type ProjectItems() = |> Array.exists (fun f -> f.IndexOf("System.Numerics") <> -1) let mutable wasCalled = false - Assert.IsTrue(containsSystemNumerics (), "Project should contains reference to System.Numerics") + Assert.True(containsSystemNumerics (), "Project should contains reference to System.Numerics") let refContainer = project.GetReferenceContainer() let reference = @@ -39,11 +38,11 @@ type ProjectItems() = reference.Remove(false) ) - Assert.IsFalse(wasCalled, "No events from IVsTrackProjectDocuments2 are expected") - Assert.IsFalse(containsSystemNumerics(), "Project should not contains reference to System.Numerics") + Assert.False(wasCalled, "No events from IVsTrackProjectDocuments2 are expected") + Assert.False(containsSystemNumerics(), "Project should not contains reference to System.Numerics") )) - [] + [] member public this.``AddNewItem.ItemAppearsAtBottomOfFsprojFile``() = this.MakeProjectAndDo(["orig.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "a.fs") @@ -58,7 +57,7 @@ type ProjectItems() = File.Delete(absFilePath) )) - [] + [] member public this.``AddNewItem.ToAFolder.ItemAppearsAtBottomOfFolder``() = this.MakeProjectAndDo(["orig.fs"; "Folder\\f1.fs"; "Folder\\f2.fs"; "final.fs"], [], "", (fun project -> let dir = Path.Combine(project.ProjectFolder, "Folder") @@ -75,7 +74,7 @@ type ProjectItems() = File.Delete(absFilePath) )) - [] + [] member public this.``AddNewItemBelow.ItemAppearsInRightSpot``() = this.MakeProjectAndDo(["orig1.fs"; "orig2.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "new.fs") @@ -98,7 +97,7 @@ type ProjectItems() = File.Delete(absFilePath) )) - [] + [] member public this.``AddNewItemAbove.ItemAppearsInRightSpot.Case1``() = this.MakeProjectAndDo(["orig1.fs"; "orig2.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "new.fs") @@ -121,7 +120,7 @@ type ProjectItems() = File.Delete(absFilePath) )) - [] + [] member public this.``AddNewItemAbove.ItemAppearsInRightSpot.Case2``() = this.MakeProjectAndDo(["orig1.fs"; "orig2.fs"], [], "", (fun project -> let absFilePath = Path.Combine(project.ProjectFolder, "new.fs") diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs index f64efebaefe..5d9e702cfe9 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs @@ -7,7 +7,7 @@ open System.Collections.Generic open System.IO open System.Reflection -open NUnit.Framework +open Xunit open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem @@ -16,7 +16,6 @@ open Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.VisualStudio.Shell.Interop open System.Xml.Linq -[][] type References() = inherit TheTests() @@ -41,25 +40,25 @@ type References() = let fooPath = Path.Combine(project.ProjectFolder, "foo.fs") File.AppendAllText(fooPath, "namespace Foo\nmodule Bar =\n let x = 42") let buildResult = project.Build("Build") - Assert.IsTrue buildResult.IsSuccessful + Assert.True buildResult.IsSuccessful let exe = Path.Combine(project.ProjectFolder, "bin\\Debug\\Test.exe") k exe)) - [] + [] member this.``BasicAssemblyReferences1``() = this.MakeProjectAndDo([], ["System"], "", (fun proj -> let systemRef = proj.FirstChild.FirstChild :?> AssemblyReferenceNode - Assert.IsTrue(systemRef.CanShowDefaultIcon()) + Assert.True(systemRef.CanShowDefaultIcon()) )) - [] + [] member this.``BasicAssemblyReferences2``() = this.MakeProjectAndDo([], ["System.Net"], "", (fun proj -> let systemRef = proj.FirstChild.FirstChild :?> AssemblyReferenceNode - Assert.IsTrue(systemRef.CanShowDefaultIcon()) + Assert.True(systemRef.CanShowDefaultIcon()) )) - [] + [] member this.``AddReference.StarredAssemblyName`` () = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) @@ -67,11 +66,11 @@ type References() = let assemblyName = new AssemblyName(typeof.Assembly.FullName) let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus, bstrFile = "*" + assemblyName.FullName) let refContainer = GetReferenceContainerNode(project) - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull let l = new List() project.FindNodesOfType(l) - Assert.AreEqual(1, l.Count) - Assert.AreEqual("System.Windows.Forms", l.[0].Caption) + Assert.Equal(1, l.Count) + Assert.Equal("System.Windows.Forms", l.[0].Caption) SaveProject(project) let fsprojFileText = File.ReadAllText(project.FileName) printfn "%s" fsprojFileText @@ -79,34 +78,32 @@ type References() = TheTests.HelpfulAssertMatches '<' expectedFsprojRegex fsprojFileText ) - [] - [] + [] member this.``References.Bug787899.AddDuplicateUnresolved``() = // Let's create a run-of-the-mill project just to have a spare assembly around this.CreateDummyTestProjectBuildItAndDo(fun exe -> - Assert.IsTrue(File.Exists exe, "failed to build exe") + Assert.True(File.Exists exe, "failed to build exe") this.MakeProjectAndDoWithProjectFile(["doesNotMatter.fs"], ["mscorlib"; "System"; "System.Core"; "System.Net"], ".\\Test.dll", "v4.0", (fun project file -> let assemRef = TheTests.FindNodeWithCaption(project, "Test") :?> AssemblyReferenceNode - Assert.IsFalse(assemRef.CanShowDefaultIcon(), "reference should be banged out, does not resolve") + Assert.False(assemRef.CanShowDefaultIcon(), "reference should be banged out, does not resolve") // add reference to Test.exe let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, bstrFile = exe) let refContainer = GetReferenceContainerNode(project) - refContainer.AddReferenceFromSelectorData(selectorData) |> (fun x -> Assert.IsNotNull(x, "expected AddReference to succeed")) + refContainer.AddReferenceFromSelectorData(selectorData) |> (fun x -> Assert.NotNull(x)) // it should have succeeded (no throw) )) ) - [] - [] + [] member this.``References.Bug787899.AddDuplicateResolved``() = // Let's create a run-of-the-mill project just to have a spare assembly around this.CreateDummyTestProjectBuildItAndDo(fun exe -> - Assert.IsTrue(File.Exists exe, "failed to build exe") + Assert.True(File.Exists exe, "failed to build exe") this.MakeProjectAndDoWithProjectFile(["doesNotMatter.fs"], ["mscorlib"; "System"; "System.Core"; "System.Net"], sprintf "%s" exe, "v4.0", (fun project file -> let assemRef = TheTests.FindNodeWithCaption(project, "Test") :?> AssemblyReferenceNode - Assert.IsTrue(assemRef.CanShowDefaultIcon(), "reference should not be banged out, does resolve") + Assert.True(assemRef.CanShowDefaultIcon(), "reference should not be banged out, does resolve") // add reference to Test.exe let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, bstrFile = exe) let refContainer = GetReferenceContainerNode(project) @@ -114,11 +111,11 @@ type References() = refContainer.AddReferenceFromSelectorData(selectorData) |> ignore Assert.Fail("expected AddReference to Fail") with :? InvalidOperationException as e -> - Assert.AreEqual("A reference to 'Test' (with assembly name 'Test') could not be added. A reference to the component 'Test' with the same assembly name already exists in the project.", e.Message) + Assert.Equal("A reference to 'Test' (with assembly name 'Test') could not be added. A reference to the component 'Test' with the same assembly name already exists in the project.", e.Message) )) ) - [] + [] member this.``ReferenceResolution.Bug4423.LoadedFsProj.Works``() = this.MakeProjectAndDo(["doesNotMatter.fs"], ["mscorlib"; "System"; "System.Core"; "System.Net"], "", "v4.0", (fun project -> let expectedRefInfo = [ "mscorlib", true @@ -136,7 +133,7 @@ type References() = )) - [] + [] member this.``ReferenceResolution.Bug4423.LoadedFsProj.WithExactDuplicates``() = this.MakeProjectAndDo(["doesNotMatter.fs"], ["System"; "System"], "", "v4.0", (fun project -> let expectedRefInfo = [ "System", true // In C#, one will be banged out, whereas @@ -151,7 +148,7 @@ type References() = AssertEqual expectedRefInfo actualRefInfo )) - [] + [] member this.``ReferenceResolution.Bug4423.LoadedFsProj.WithBadDuplicates``() = this.MakeProjectAndDo(["doesNotMatter.fs"], ["System"; "System.dll"], "", "v4.0", (fun project -> let expectedRefInfo = [ "System", false // one will be banged out @@ -166,7 +163,7 @@ type References() = AssertEqual expectedRefInfo actualRefInfo )) - [] + [] member this.``ReferenceResolution.Bug4423.LoadedFsProj.WorksWithFilenames``() = let netDir = currentFrameworkDirectory let ssmw = Path.Combine(netDir, "System.ServiceModel.Web.dll") @@ -182,7 +179,7 @@ type References() = AssertEqual expectedRefInfo actualRefInfo )) - [] + [] member this.``ReferenceResolution.Bug4423.LoadedFsProj.WeirdCases``() = this.MakeProjectAndDo(["doesNotMatter.fs"], ["mscorlib, Version=4.0.0.0"; "System, Version=4.0.0.0"; "System.Core, Version=4.0.0.0"; "System.Net, Version=4.0.0.0"], "", "v4.0", (fun project -> let expectedRefInfo = [ "mscorlib", true @@ -212,14 +209,14 @@ type References() = | _ -> failwith "unexpected" let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = cType, bstrFile = fullPath) let refContainer = GetReferenceContainerNode(project) - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull SaveProject(project) let fsprojFileText = File.ReadAllText(project.FileName) printfn "%s" fsprojFileText TheTests.HelpfulAssertMatches '<' expectedFsprojRegex fsprojFileText )) - [] + [] member this.``ReferenceResolution.Bug4423.FxAssembly.NetTab.AddDuplicate1``() = let netDir = currentFrameworkDirectory try @@ -232,7 +229,7 @@ type References() = with e -> TheTests.HelpfulAssertMatches ' ' "A reference to '.*' \\(with assembly name '.*'\\) could not be added. A reference to the component '.*' with the same assembly name already exists in the project." e.Message -// see 5491 [] +// see 5491 [] member this.``ReferenceResolution.Bug4423.FxAssembly.NetTab.AddDuplicate2``() = let netDir = currentFrameworkDirectory try @@ -245,12 +242,11 @@ type References() = with e -> TheTests.HelpfulAssertMatches ' ' "A reference to '.*' could not be added. A reference to the component '.*' already exists in the project." e.Message - [] - [] + [] member this.``ReferenceResolution.Bug4423.NonFxAssembly.BrowseTab.RelativeHintPath.InsideProjectDir``() = // Let's create a run-of-the-mill project just to have a spare assembly around this.CreateDummyTestProjectBuildItAndDo(fun exe -> - Assert.IsTrue(File.Exists exe, "failed to build exe") + Assert.True(File.Exists exe, "failed to build exe") // Now let's create an assembly reference to it and ensure we get expected relative HintPath let expectedFsprojRegex = @"" + @"\s*Test.exe" // in this directory @@ -258,10 +254,10 @@ type References() = this.MakeProjectAndDo(["bar.fs"], [], "", "v4.5", (fun project -> let exeCopy = Path.Combine(project.ProjectFolder, "Test.exe") File.Copy(exe, exeCopy, true) - Assert.IsTrue(File.Exists exeCopy, "failed to build exe") + Assert.True(File.Exists exeCopy, "failed to build exe") let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, bstrFile = exeCopy) let refContainer = GetReferenceContainerNode(project) - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull SaveProject(project) let fsprojFileText = File.ReadAllText(project.FileName) printfn "%s" fsprojFileText @@ -269,26 +265,25 @@ type References() = // Finally, ensure that the reference works as expected project.Reload() let assemRef = TheTests.FindNodeWithCaption(project, "Test") :?> AssemblyReferenceNode - Assert.IsTrue(assemRef.CanShowDefaultIcon(), "the reference could not be resolved") + Assert.True(assemRef.CanShowDefaultIcon(), "the reference could not be resolved") // Use the referenced DLL as a double-check let barPath = Path.Combine(project.ProjectFolder, "bar.fs") File.AppendAllText(barPath, "printfn \"%d\" Foo.Bar.x") // code that requires the referenced assembly to successfully compile let buildResult = project.Build("Build") - Assert.IsTrue buildResult.IsSuccessful + Assert.True buildResult.IsSuccessful )) ) - [] - [] + [] member this.``ReferenceResolution.Bug4423.NonFxAssembly.BrowseTab.RelativeHintPath.OutsideProjectDir``() = this.MakeProjectAndDo(["foo.fs"], [], "", (fun project -> // Let's create a run-of-the-mill let fooPath = Path.Combine(project.ProjectFolder, "foo.fs") File.AppendAllText(fooPath, "namespace Foo\nmodule Bar =\n let x = 42") let buildResult = project.Build("Build") - Assert.IsTrue buildResult.IsSuccessful + Assert.True buildResult.IsSuccessful let exe = Path.Combine(project.ProjectFolder, "bin\\Debug\\Test.exe") - Assert.IsTrue(File.Exists exe, "failed to build exe") + Assert.True(File.Exists exe, "failed to build exe") // Now let's create an assembly reference to it and ensure we get expected relative HintPath let expectedFsprojRegex = @"" + @"\s*\.\.\\.*?" // the point is, some path start with "..\", since both projects are rooted somewhere in the temp directory (where unit tests create them) @@ -296,7 +291,7 @@ type References() = this.MakeProjectAndDo(["bar.fs"], [], "", "v4.5", (fun project -> let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, bstrFile = exe) let refContainer = GetReferenceContainerNode(project) - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull SaveProject(project) let fsprojFileText = File.ReadAllText(project.FileName) printfn "%s" fsprojFileText @@ -304,16 +299,16 @@ type References() = // Finally, ensure that the reference works as expected project.Reload() let assemRef = TheTests.FindNodeWithCaption(project, "Test") :?> AssemblyReferenceNode - Assert.IsTrue(assemRef.CanShowDefaultIcon(), "the reference could not be resolved") + Assert.True(assemRef.CanShowDefaultIcon(), "the reference could not be resolved") // Use the referenced DLL as a double-check let barPath = Path.Combine(project.ProjectFolder, "bar.fs") File.AppendAllText(barPath, "printfn \"%d\" Foo.Bar.x") // code that requires the referenced assembly to successfully compile let buildResult = project.Build("Build") - Assert.IsTrue buildResult.IsSuccessful + Assert.True buildResult.IsSuccessful )) )) - [] + [] member this.``ReferenceResolution.Bug4423.NotAValidDll.BrowseTab``() = let dirName = Path.GetTempPath() let dll = Path.Combine(dirName, "Foo.dll") @@ -323,7 +318,7 @@ type References() = let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, bstrFile = dll) let refContainer = GetReferenceContainerNode(project) try - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull Assert.Fail("this should not have succeeded") with e -> AssertContains e.Message "could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component." @@ -331,14 +326,14 @@ type References() = finally File.Delete(dll) - [] + [] member this.``PathReferences.Existing`` () = DoWithTempFile "Test.fsproj"(fun projFile -> let dirName = Path.GetDirectoryName(projFile) let libDirName = Directory.CreateDirectory(Path.Combine(dirName, "lib")).FullName let codeBase = (new Uri(Assembly.GetExecutingAssembly().EscapedCodeBase)).LocalPath |> Path.GetDirectoryName - let refLibPath = Path.Combine(libDirName, "nunit.framework.dll") - File.Copy(Path.Combine(codeBase, "nunit.framework.dll"), refLibPath) + let refLibPath = Path.Combine(libDirName, "xunit.core.dll") + File.Copy(Path.Combine(codeBase, "xunit.core.dll"), refLibPath) File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [refLibPath], "")) use project = TheTests.CreateProject(projFile) let l = new List() @@ -346,14 +341,14 @@ type References() = AssertEqual 1 l.Count AssertEqual refLibPath l.[0].Url AssertEqual refLibPath l.[0].Caption // when Include is a filename, entirety is caption - Assert.IsNotNull(l.[0].ResolvedAssembly) + Assert.NotNull(l.[0].ResolvedAssembly) let refContainer = let l = new List() project.FindNodesOfType(l) l.[0] let mscorlibPath = (new Uri("".GetType().Assembly.EscapedCodeBase)).LocalPath let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus, bstrFile = mscorlibPath) - refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull + refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.NotNull let l = new List() project.FindNodesOfType(l) AssertEqual 2 l.Count @@ -362,7 +357,7 @@ type References() = AssertEqual "mscorlib" l.[1].Caption ) - [] + [] member this.``PathReferences.Existing.Captions`` () = DoWithTempFile "Test.fsproj"(fun projFile -> File.AppendAllText(projFile, TheTests.FsprojTextWithProjectReferences( @@ -375,12 +370,12 @@ type References() = project.FindNodesOfType(l) AssertEqual 2 l.Count AssertEqual "System.dll" l.[0].Caption - Assert.IsNotNull(l.[0].ResolvedAssembly) + Assert.NotNull(l.[0].ResolvedAssembly) AssertEqual "System.Net.dll" l.[1].Caption - Assert.IsNotNull(l.[1].ResolvedAssembly) + Assert.NotNull(l.[1].ResolvedAssembly) ) - [] + [] member this.``PathReferences.NonExistent`` () = DoWithTempFile "Test.fsproj"(fun projFile -> let refLibPath = @"c:\foo\baz\blahblah.dll" @@ -390,11 +385,11 @@ type References() = project.FindNodesOfType(l) AssertEqual 1 l.Count AssertEqual refLibPath l.[0].Caption - Assert.IsNull(l.[0].ResolvedAssembly) + Assert.Null(l.[0].ResolvedAssembly) ) - [] + [] member this.``FsprojPreferencePage.ProjSupportsPrefReadWrite``() = let testProp = "AssemblyName" let compileItem = [@"foo.fs"] @@ -431,7 +426,7 @@ type References() = // Disabled due to: https://github.com/dotnet/fsharp/issues/1460 // On DEV 15 Preview 4 the VS IDE Test fails with : // System.InvalidOperationException : Operation is not valid due to the current state of the object. - // [] // Disabled due to: https://github.com/dotnet/fsharp/issues/1460 + // [] // Disabled due to: https://github.com/dotnet/fsharp/issues/1460 member this.``AddReference.COM`` () = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) @@ -450,23 +445,23 @@ type References() = let comReference = refContainer.AddReferenceFromSelectorData(selectorData) // check reference node properties - Assert.IsNotNull comReference - Assert.IsTrue(comReference :? ComReferenceNode) + Assert.NotNull comReference + Assert.True(comReference :? ComReferenceNode) let comRef = comReference :?> ComReferenceNode - Assert.AreEqual(1, comRef.MajorVersionNumber) - Assert.AreEqual(0, comRef.MinorVersionNumber) - Assert.AreEqual(guid, comRef.TypeGuid) - Assert.AreEqual("Microsoft Shell Controls And Automation", comRef.Caption) + Assert.Equal(1, comRef.MajorVersionNumber) + Assert.Equal(0, comRef.MinorVersionNumber) + Assert.Equal(guid, comRef.TypeGuid) + Assert.Equal("Microsoft Shell Controls And Automation", comRef.Caption) let sysDirectory = Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) - Assert.IsTrue(String.Compare(Path.Combine(sysDirectory, "shell32.dll"), comRef.InstalledFilePath, StringComparison.OrdinalIgnoreCase) = 0) + Assert.True(String.Compare(Path.Combine(sysDirectory, "shell32.dll"), comRef.InstalledFilePath, StringComparison.OrdinalIgnoreCase) = 0) // check node exists under references let l = new List() project.FindNodesOfType(l) - Assert.AreEqual(1, l.Count) + Assert.Equal(1, l.Count) let referenceNode = l.[0] - Assert.AreSame(comRef, referenceNode) + Assert.Same(comRef, referenceNode) // check saved msbuild item SaveProject(project) @@ -475,13 +470,13 @@ type References() = let xn s = fsproj.Root.GetDefaultNamespace().GetName(s) let comReferencesXml = fsproj.Descendants(xn "COMReference") |> Seq.toList - Assert.AreEqual(1, comReferencesXml |> List.length) + Assert.Equal(1, comReferencesXml |> List.length) let comRefXml = comReferencesXml |> List.head - Assert.AreEqual("Microsoft Shell Controls And Automation", comRefXml.Attribute(XName.Get("Include")).Value) - Assert.AreEqual(guid, Guid(comRefXml.Element(xn "Guid").Value)) - Assert.AreEqual("1", comRefXml.Element(xn "VersionMajor").Value) - Assert.AreEqual("0", comRefXml.Element(xn "VersionMinor").Value) - Assert.AreEqual("0", comRefXml.Element(xn "Lcid").Value) + Assert.Equal("Microsoft Shell Controls And Automation", comRefXml.Attribute(XName.Get("Include")).Value) + Assert.Equal(guid, Guid(comRefXml.Element(xn "Guid").Value)) + Assert.Equal("1", comRefXml.Element(xn "VersionMajor").Value) + Assert.Equal("0", comRefXml.Element(xn "VersionMinor").Value) + Assert.Equal("0", comRefXml.Element(xn "Lcid").Value) ) diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.RoundTrip.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.RoundTrip.fs index 1aad389737d..56aaf84d713 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.RoundTrip.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.RoundTrip.fs @@ -5,14 +5,13 @@ namespace Tests.ProjectSystem open System open System.IO open System.Text.RegularExpressions -open NUnit.Framework +open Xunit open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem open Microsoft.VisualStudio.FSharp.ProjectSystem -[][] type RoundTrip() = inherit TheTests() @@ -43,7 +42,7 @@ type RoundTrip() = Assert.Fail("did not remove empty ItemGroups") )) - [] + [] member public this.``FsprojRoundTrip.Basic.NonemptyFoldersRemoved.Case1``() = this.``FsprojRoundtrip.PositiveTest``( MSBuildItems [CompileItem @"bar.fs" @@ -52,7 +51,7 @@ type RoundTrip() = MSBuildItems [CompileItem @"bar.fs" CompileItem @"Folder\foo.fs"]) - [] + [] member public this.``FsprojRoundTrip.Basic.NonemptyFoldersRemoved.Case2``() = this.``FsprojRoundtrip.PositiveTest``( MSBuildItems [CompileItem @"bar.fs" @@ -65,7 +64,7 @@ type RoundTrip() = CompileItem @"A\B\C\foo.fs" CompileItem @"A\qux.fs"]) - [] + [] member public this.``FsprojRoundTrip.ComplexButLegalCase``() = let items = MSBuildItems [CompileItem @"A\B\foo.fs" CompileItem @"A\bar.fs" @@ -76,7 +75,7 @@ type RoundTrip() = ] this.``FsprojRoundtrip.PositiveTest``(items, items) - [] + [] member public this.``FsprojRoundTrip.EmptyFoldersArePreservedWhenRestIsIdempotent``() = let items = MSBuildItems [CompileItem @"bar.fs" FolderItem @"A\Empty1\" @@ -85,7 +84,7 @@ type RoundTrip() = CompileItem @"A\qux.fs"] this.``FsprojRoundtrip.PositiveTest``(items, items) - [] + [] member public this.``FsprojRoundTrip.EmptyFoldersArePreservedWhenRestIsLegalButNotIdempotent``() = let origItems = [CompileItem @"bar.fs" FolderItem @"A\Empty1\" @@ -100,13 +99,13 @@ type RoundTrip() = CompileItem @"A\qux.fs"] this.``FsprojRoundtrip.PositiveTest``(MSBuildItems origItems, MSBuildItems expectedItems) - [] + [] member public this.``FsprojRoundTrip.Regression.FoldersWithSameName``() = let items = MSBuildItems [CompileItem @"First\Second\bar.fs" CompileItem @"Second\qux.fs"] this.``FsprojRoundtrip.PositiveTest``(items, items) - [] + [] member public this.``FsprojRoundTrip.Regression.FoldersWithSameName2``() = let items = MSBuildItems [CompileItem @"First\First\bar.fs"] this.``FsprojRoundtrip.PositiveTest``(items, items) @@ -128,21 +127,21 @@ type RoundTrip() = () ) - [] + [] member public this.``FsprojRoundTrip.Basic.Invalid.Case1``() = let items = MSBuildItems [CompileItem @"A\B\C\foo.fs" CompileItem @"B\bar.fs" CompileItem @"A\B\D\qux.fs"] // would cause A to be rendered twice this.``Fsproj.NegativeTest`` items - [] + [] member public this.``FsprojRoundTrip.Basic.Invalid.Case2``() = let items = MSBuildItems [CompileItem @"A\foo.fs" CompileItem @"bar.fs" CompileItem @"A\qux.fs"] // would cause A to be rendered twice this.``Fsproj.NegativeTest`` items - // REVIEW NYI: [] + // REVIEW NYI: [] member public this.``FsprojRoundTrip.Basic.Invalid.Case3``() = let items = MSBuildItems [CompileItem @"A\foo.fs" FolderItem @"A\" // must be before anything below it diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.UpToDate.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.UpToDate.fs index d21681de617..b63ec3eed8e 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.UpToDate.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.UpToDate.fs @@ -18,21 +18,16 @@ open Microsoft.VisualStudio.FSharp open Microsoft.VisualStudio.FSharp.ProjectSystem // Internal unittest namespaces -open NUnit.Framework +open Xunit open Salsa open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem -[][] type UpToDate() = inherit TheTests() - [] - member public _.Init () = AssemblyResolver.addResolver () - - [] - [] + [] member public this.ItemInputs () = this.MakeProjectAndDo(["file1.fs"], [], @" @@ -64,36 +59,35 @@ type UpToDate() = File.AppendAllText(nonePath, "none") File.AppendAllText(embedPath, "some embedded resource") - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) project.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(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.UtcNow.AddMinutes(5.)) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) for path in [sourcePath; contentPath; resourcePath; embedPath; configPath] do printfn "Testing path %s" path // touch file File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(5.)) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) // delete file let originalContent = File.ReadAllText(path) File.Delete(path) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.AppendAllText(path, originalContent) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) )) - [] - [] + [] member public this.PropertyInputs () = this.MakeProjectAndDo(["file1.fs"], [], @" @@ -117,32 +111,31 @@ type UpToDate() = File.AppendAllText(keyPath, "a key") project.SetConfiguration(config.ConfigCanonicalName); - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) project.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) for path in [verPath; keyPath] do printfn "Testing path %s" path // touch file File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(5.)) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) // delete file let originalContent = File.ReadAllText(path) File.Delete(path) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.AppendAllText(path, originalContent) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) )) - [] - [] + [] member public this.ProjectFile () = this.MakeProjectAndDoWithProjectFile(["file1.fs"], [], "", (fun project projFileName -> let configNameDebug = ConfigCanonicalName("Debug", "x86") @@ -153,20 +146,19 @@ type UpToDate() = let startTime = DateTime.UtcNow File.AppendAllText(absFilePath, "printfn \"hello\"") - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) project.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) // touch proj file File.SetLastWriteTime(projFileName, DateTime.UtcNow.AddMinutes(5.)) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.SetLastWriteTime(projFileName, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) )) - [] - [] + [] member public this.References () = let configNameDebug = ConfigCanonicalName("Debug", "x86") let output = VsMocks.vsOutputWindowPane(ref []) @@ -185,9 +177,9 @@ type UpToDate() = let config1 = project1.ConfigProvider.GetProjectConfiguration(configNameDebug) - Assert.IsFalse(config1.IsUpToDate(logger, true)) + Assert.False(config1.IsUpToDate(logger, true)) project1.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config1.IsUpToDate(logger, true)) + Assert.True(config1.IsUpToDate(logger, true)) let output1 = Path.Combine(project1.ProjectFolder, "bin\\debug", project1.OutputFileName) @@ -204,24 +196,23 @@ type UpToDate() = let config2 = project2.ConfigProvider.GetProjectConfiguration(configNameDebug) let startTime = DateTime.UtcNow - Assert.IsFalse(config2.IsUpToDate(logger, true)) + Assert.False(config2.IsUpToDate(logger, true)) project2.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config2.IsUpToDate(logger, true)) + Assert.True(config2.IsUpToDate(logger, true)) // reference is updated File.SetLastWriteTime(output1, DateTime.UtcNow.AddMinutes(5.)) - Assert.IsFalse(config2.IsUpToDate(logger, true)) + Assert.False(config2.IsUpToDate(logger, true)) File.SetLastWriteTime(output1, startTime) - Assert.IsTrue(config2.IsUpToDate(logger, true)) + Assert.True(config2.IsUpToDate(logger, true)) // reference is missing File.Delete(output1) - Assert.IsFalse(config2.IsUpToDate(logger, true)) + Assert.False(config2.IsUpToDate(logger, true)) ) ) - [] - [] + [] member public this.OutputFiles () = this.MakeProjectAndDo(["file1.fs"], [], @" @@ -249,9 +240,9 @@ type UpToDate() = File.AppendAllText(sourcePath, "printfn \"hello\"") File.AppendAllText(appConfigPath, """""") - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) project.Build(configNameDebug, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) let startTime = DateTime.UtcNow @@ -260,23 +251,22 @@ type UpToDate() = // touch file File.SetLastWriteTime(path, DateTime.UtcNow.AddMinutes(-5.)) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) // delete file let originalContent = File.ReadAllBytes(path) File.Delete(path) - Assert.IsFalse(config.IsUpToDate(logger, true)) + Assert.False(config.IsUpToDate(logger, true)) File.WriteAllBytes(path, originalContent) File.SetLastWriteTime(path, startTime) - Assert.IsTrue(config.IsUpToDate(logger, true)) + Assert.True(config.IsUpToDate(logger, true)) )) - [] - [] + [] member public this.ConfigChanges () = this.MakeProjectAndDo(["file1.fs"], [], "", (fun project -> let configNameDebugx86 = ConfigCanonicalName("Debug", "x86") @@ -295,37 +285,37 @@ type UpToDate() = let sourcePath = Path.Combine(project.ProjectFolder, "file1.fs") File.AppendAllText(sourcePath, "printfn \"hello\"") - Assert.IsFalse(debugConfigx86.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigx86.IsUpToDate(logger, true)) - Assert.IsFalse(debugConfigAnyCPU.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigAnyCPU.IsUpToDate(logger, true)) + Assert.False(debugConfigx86.IsUpToDate(logger, true)) + Assert.False(releaseConfigx86.IsUpToDate(logger, true)) + Assert.False(debugConfigAnyCPU.IsUpToDate(logger, true)) + Assert.False(releaseConfigAnyCPU.IsUpToDate(logger, true)) project.Build(configNameDebugx86, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(debugConfigx86.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigx86.IsUpToDate(logger, true)) - Assert.IsFalse(debugConfigAnyCPU.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigAnyCPU.IsUpToDate(logger, true)) + Assert.True(debugConfigx86.IsUpToDate(logger, true)) + Assert.False(releaseConfigx86.IsUpToDate(logger, true)) + Assert.False(debugConfigAnyCPU.IsUpToDate(logger, true)) + Assert.False(releaseConfigAnyCPU.IsUpToDate(logger, true)) project.Build(configNameReleasex86, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(debugConfigx86.IsUpToDate(logger, true)) - Assert.IsTrue(releaseConfigx86.IsUpToDate(logger, true)) - Assert.IsFalse(debugConfigAnyCPU.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigAnyCPU.IsUpToDate(logger, true)) + Assert.True(debugConfigx86.IsUpToDate(logger, true)) + Assert.True(releaseConfigx86.IsUpToDate(logger, true)) + Assert.False(debugConfigAnyCPU.IsUpToDate(logger, true)) + Assert.False(releaseConfigAnyCPU.IsUpToDate(logger, true)) project.Build(configNameDebugAnyCPU, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(debugConfigx86.IsUpToDate(logger, true)) - Assert.IsTrue(releaseConfigx86.IsUpToDate(logger, true)) - Assert.IsTrue(debugConfigAnyCPU.IsUpToDate(logger, true)) - Assert.IsFalse(releaseConfigAnyCPU.IsUpToDate(logger, true)) + Assert.True(debugConfigx86.IsUpToDate(logger, true)) + Assert.True(releaseConfigx86.IsUpToDate(logger, true)) + Assert.True(debugConfigAnyCPU.IsUpToDate(logger, true)) + Assert.False(releaseConfigAnyCPU.IsUpToDate(logger, true)) project.Build(configNameReleaseAnyCPU, output, "Build", null) |> AssertBuildSuccessful - Assert.IsTrue(debugConfigx86.IsUpToDate(logger, true)) - Assert.IsTrue(releaseConfigx86.IsUpToDate(logger, true)) - Assert.IsTrue(debugConfigAnyCPU.IsUpToDate(logger, true)) - Assert.IsTrue(releaseConfigAnyCPU.IsUpToDate(logger, true)) + Assert.True(debugConfigx86.IsUpToDate(logger, true)) + Assert.True(releaseConfigx86.IsUpToDate(logger, true)) + Assert.True(debugConfigAnyCPU.IsUpToDate(logger, true)) + Assert.True(releaseConfigAnyCPU.IsUpToDate(logger, true)) )) - [] + [] member public this.UTDCheckEnabled () = this.MakeProjectAndDo(["file1.fs"], [], @" @@ -335,10 +325,10 @@ type UpToDate() = let configNameDebug = ConfigCanonicalName("Debug", "x86") let config = project.ConfigProvider.GetProjectConfiguration(configNameDebug) - Assert.IsFalse(config.IsFastUpToDateCheckEnabled()) + Assert.False(config.IsFastUpToDateCheckEnabled()) )) - [] + [] member public this.UTDOptionsFlags () = this.MakeProjectAndDo(["file1.fs"], [], "", (fun project -> let configNameDebugx86 = ConfigCanonicalName("Debug", "x86") @@ -352,8 +342,8 @@ type UpToDate() = let supported = Array.zeroCreate 1 let ready = Array.zeroCreate 1 buildableConfig.QueryStartUpToDateCheck(flag, supported, ready) |> ignore - Assert.IsTrue(supported.[0] = expected) - Assert.IsTrue(ready.[0] = expected) + Assert.True(supported.[0] = expected) + Assert.True(ready.[0] = expected) [ VSConstants.VSUTDCF_DTEEONLY, 1 VSConstants.VSUTDCF_PACKAGE, 0 @@ -362,7 +352,7 @@ type UpToDate() = |> List.iter (fun (flag, expected) -> testFlag flag expected) )) - [] + [] member public this.UTDOptionsFlagsUTDDisabled () = this.MakeProjectAndDo(["file1.fs"], [], @" @@ -380,8 +370,8 @@ type UpToDate() = let supported = Array.zeroCreate 1 let ready = Array.zeroCreate 1 buildableConfig.QueryStartUpToDateCheck(flag, supported, ready) |> ignore - Assert.AreEqual(supported.[0], expected) - Assert.AreEqual(ready.[0], expected) + Assert.Equal(supported.[0], expected) + Assert.Equal(ready.[0], expected) [ VSConstants.VSUTDCF_DTEEONLY, 1 VSConstants.VSUTDCF_PACKAGE, 0 @@ -390,10 +380,9 @@ type UpToDate() = |> List.iter (fun (flag, expected) -> testFlag flag expected) )) -[] type ``UpToDate PreserveNewest`` () = - [] + [] member public this.IsUpToDatePreserveNewest () = let test (input, inputTimestamp) (output, outputTimestamp) = @@ -416,28 +405,28 @@ type ``UpToDate PreserveNewest`` () = let ``no input -> not up-to-date and log`` = let u, logs = test ("readme.md", None) ("leggimi.md", None) - Assert.IsFalse(u) + Assert.False(u) logs |> List.exists (fun s -> s.Contains("readme.md") && s.Contains("can't find expected input")) - |> Assert.IsTrue + |> Assert.True let ``no output -> not up-to-date and log`` = let u, logs = test ("from.txt", Some now) ("to.txt", None) - Assert.IsFalse(u) + Assert.False(u) logs |> List.exists (fun s -> s.Contains("to.txt") && s.Contains("can't find expected output")) - |> Assert.IsTrue + |> Assert.True let ``a newer version of output file is ok`` = let u, logs = test ("before.doc", Some before) ("after.doc", Some now) - Assert.IsTrue(u) + Assert.True(u) logs |> AssertEqual [] let ``stale output file -> not up-to-date and log`` = let u, logs = test ("logo.png", Some now) ("animatedlogo.gif", Some before) - Assert.IsFalse(u) + Assert.False(u) logs |> List.exists (fun s -> s.Contains("animatedlogo.gif") && s.Contains("stale")) - |> Assert.IsTrue + |> Assert.True () diff --git a/vsintegration/tests/UnitTests/TestLib.LanguageService.fs b/vsintegration/tests/UnitTests/TestLib.LanguageService.fs index b4e055b036b..ecc8cc1479f 100644 --- a/vsintegration/tests/UnitTests/TestLib.LanguageService.fs +++ b/vsintegration/tests/UnitTests/TestLib.LanguageService.fs @@ -4,7 +4,7 @@ namespace UnitTests.TestLib.LanguageService open System open System.Reflection -open NUnit.Framework +open Xunit open System.Diagnostics open System.IO open Salsa.Salsa @@ -246,8 +246,6 @@ type internal GlobalParseAndTypeCheckCounter private(initialParseCount:int, init /// various functions that abstract actions over vs. type LanguageServiceBaseTests() = - let _resolver = AssemblyResolver.addResolver () - let mutable defaultSolution : OpenSolution = Unchecked.defaultof<_> let cache = System.Collections.Generic.Dictionary() @@ -261,7 +259,48 @@ type LanguageServiceBaseTests() = // Timings ----------------------------------------------------------------------------- let stopWatch = new Stopwatch() let ResetStopWatch() = stopWatch.Reset(); stopWatch.Start() - + + + let Init() = + let AssertNotAssemblyNameContains(a:System.Reflection.Assembly, text1:string, text2:string) = + let fullname = sprintf "%A" a + if fullname.Contains(text1) && fullname.Contains(text2) then + // Can't throw an exception here because its in an event handler. + System.Diagnostics.Debug.Assert(false, sprintf "Unexpected: loaded assembly '%s' to not contain '%s' and '%s'" fullname text1 text2) + + // Under .NET 4.0 we don't allow 3.5.0.0 assemblies + let AssertNotBackVersionAssembly(args:AssemblyLoadEventArgs) = + + // We're worried about loading these when running against .NET 4.0: + // Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + // Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + AssertNotAssemblyNameContains(args.LoadedAssembly,"Microsoft.Build", "Version=3.5.0.0") + () + AppDomain.CurrentDomain.AssemblyLoad.Add AssertNotBackVersionAssembly + + UIStuff.SetupSynchronizationContext() + + defaultVS <- ops.CreateVisualStudio() + currentVS <- defaultVS + + defaultSolution <- GlobalFunctions.CreateSolution(defaultVS) + cache.Clear() + + do + Init() + + if box currentVS <> box defaultVS then + failwith "LanguageServiceBaseTests.Setup was called when 'active' instance of VS is not 'default' one - this may denote that tests contains errors" + + // reset state of default VS instance that can be shared among the tests + ShiftKeyUp(currentVS) + ops.CleanInvisibleProject(currentVS) + + ResetStopWatch() + testStopwatch.Reset() + testStopwatch.Start() + () + member internal _.VsOpts with set op = ops <- op @@ -367,50 +406,13 @@ type LanguageServiceBaseTests() = GlobalFunctions.AddAssemblyReference(proj, ref) - /// Called per test run -#if NUNIT_V2 - [] - member this.TestFixtureSetUp() = -#else - [] - member this.Init() = -#endif - let AssertNotAssemblyNameContains(a:System.Reflection.Assembly, text1:string, text2:string) = - let fullname = sprintf "%A" a - if fullname.Contains(text1) && fullname.Contains(text2) then - // Can't throw an exception here because its in an event handler. - System.Diagnostics.Debug.Assert(false, sprintf "Unexpected: loaded assembly '%s' to not contain '%s' and '%s'" fullname text1 text2) - - // Under .NET 4.0 we don't allow 3.5.0.0 assemblies - let AssertNotBackVersionAssembly(args:AssemblyLoadEventArgs) = - - // We're worried about loading these when running against .NET 4.0: - // Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - // Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - AssertNotAssemblyNameContains(args.LoadedAssembly,"Microsoft.Build", "Version=3.5.0.0") - () - AppDomain.CurrentDomain.AssemblyLoad.Add AssertNotBackVersionAssembly - - UIStuff.SetupSynchronizationContext() - - defaultVS <- ops.CreateVisualStudio() - currentVS <- defaultVS + interface IDisposable with + member _.Dispose() = + if box currentVS <> box defaultVS then + failwith "LanguageServiceBaseTests.Shutdown was called when 'active' instance of VS is not 'default' one - this may denote that tests contains errors" - defaultSolution <- GlobalFunctions.CreateSolution(defaultVS) - cache.Clear() - -#if NUNIT_V2 - [] - member this.Shutdown() = -#else - [] - member this.Cleanup() = -#endif - if box currentVS <> box defaultVS then - failwith "LanguageServiceBaseTests.Shutdown was called when 'active' instance of VS is not 'default' one - this may denote that tests contains errors" - - GlobalFunctions.Cleanup(defaultVS) - cache.Clear() + GlobalFunctions.Cleanup(defaultVS) + cache.Clear() member this.UsingNewVS() = if box currentVS <> box defaultVS then @@ -423,24 +425,7 @@ type LanguageServiceBaseTests() = GlobalFunctions.Cleanup(currentVS) currentVS <- defaultVS } - - /// Called per test - [] - member this.Setup() = - if box currentVS <> box defaultVS then - failwith "LanguageServiceBaseTests.Setup was called when 'active' instance of VS is not 'default' one - this may denote that tests contains errors" - - // reset state of default VS instance that can be shared among the tests - ShiftKeyUp(currentVS) - ops.CleanInvisibleProject(currentVS) - - ResetStopWatch() - testStopwatch.Reset() - testStopwatch.Start() - () - /// Called per test - [] member this.TearDown() = diff --git a/vsintegration/tests/UnitTests/TestLib.ProjectSystem.fs b/vsintegration/tests/UnitTests/TestLib.ProjectSystem.fs index d1e554f4e8c..5f9095ff4d9 100644 --- a/vsintegration/tests/UnitTests/TestLib.ProjectSystem.fs +++ b/vsintegration/tests/UnitTests/TestLib.ProjectSystem.fs @@ -25,7 +25,7 @@ open Microsoft.Build.Execution open Microsoft.Build.Framework #nowarn "52" // The value has been copied to ensure the original is not mutated -open NUnit.Framework +open Xunit open UnitTests.TestLib.Utils open UnitTests.TestLib.Utils.Asserts open UnitTests.TestLib.Utils.FilesystemHelpers @@ -76,20 +76,6 @@ type TheTests() = project.FindNodesOfType(l) l.[0] - ///////////////////////////////// - /// Called per test - [] - member this.Setup() = - () - - - [] - member this.TearDown() = - // help find leaks per-test - System.GC.Collect() - System.GC.WaitForPendingFinalizers() - () - ///////////////////////////////// /// helpers static member AssertMatches (r : Regex) (s:string) = diff --git a/vsintegration/tests/UnitTests/TestLib.Salsa.fs b/vsintegration/tests/UnitTests/TestLib.Salsa.fs index c9dcbbb115a..ac3636723eb 100644 --- a/vsintegration/tests/UnitTests/TestLib.Salsa.fs +++ b/vsintegration/tests/UnitTests/TestLib.Salsa.fs @@ -4,7 +4,7 @@ module UnitTests.TestLib.Salsa open System open System.IO -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open System.Text.RegularExpressions @@ -36,7 +36,7 @@ let AssertContainsInOrder(s:string,cs:string list) = containsInOrderFrom 0 cs let AssertContains(value: string, substring: string) = - Assert.That(value, Contains.Substring substring) + Assert.Contains(substring, value) let AssertArrayContainsPartialMatchOf(a:string array,c) = let found = ref false diff --git a/vsintegration/tests/UnitTests/TestLib.Utils.fs b/vsintegration/tests/UnitTests/TestLib.Utils.fs index 3a74b0c0e94..8072604ca2b 100644 --- a/vsintegration/tests/UnitTests/TestLib.Utils.fs +++ b/vsintegration/tests/UnitTests/TestLib.Utils.fs @@ -47,7 +47,7 @@ module Asserts = | None -> () let AssertBuildSuccessful (result: Microsoft.VisualStudio.FSharp.ProjectSystem.BuildResult) = - Assert.IsTrue(result.IsSuccessful, "Expected build to succeed") + Assert.True(result.IsSuccessful, "Expected build to succeed") module UIStuff = let SetupSynchronizationContext() = diff --git a/vsintegration/tests/UnitTests/Tests.Build.fs b/vsintegration/tests/UnitTests/Tests.Build.fs index 78e4559d358..6f87164333f 100644 --- a/vsintegration/tests/UnitTests/Tests.Build.fs +++ b/vsintegration/tests/UnitTests/Tests.Build.fs @@ -2,7 +2,7 @@ namespace Tests -open NUnit.Framework +open Xunit open System open System.IO open System.Diagnostics @@ -19,8 +19,7 @@ module HandyExtensions = if not (s.MatchesPattern p) then let up = System.Text.RegularExpressions.Regex.Unescape p let message = sprintf "Expected\n%A\nto match pattern\n%A" s up - printfn "%s" message - Assert.Fail() + failwith message open HandyExtensions type MyLogger(f : string -> unit) = @@ -49,7 +48,6 @@ type FauxHostObject() = interface ITaskHost // no members -[] type Build() = (* Asserts ----------------------------------------------------------------------------- *) let AssertEqual expected actual = @@ -60,16 +58,7 @@ type Build() = let MakeTaskItem (itemSpec : string) = new TaskItem(itemSpec) :> ITaskItem - /// Called per test - [] - member this.Setup() = - () - - [] - member this.TearDown() = - () - - [] + [] member public this.TestCodePage() = let tool = new FSharp.Build.Fsc() printfn "By the way, the registry or app.config tool path is %s" tool.ToolPath @@ -85,7 +74,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDebugSymbols() = let tool = new FSharp.Build.Fsc() tool.DebugSymbols <- true @@ -100,7 +89,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDebugType() = let tool = new FSharp.Build.Fsc() tool.DebugType <- "pdbONly" @@ -115,7 +104,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDefineConstants() = let tool = new FSharp.Build.Fsc() tool.DefineConstants <- [| MakeTaskItem "FOO=3" @@ -132,7 +121,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDisabledWarnings1() = let tool = new FSharp.Build.Fsc() tool.DisabledWarnings <- "52;109" @@ -147,7 +136,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDisabledWarnings2() = let tool = new FSharp.Build.Fsc() tool.DisabledWarnings <- ";" // e.g. someone may have $(NoWarn);$(SomeOtherVar) and both vars are empty @@ -161,7 +150,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestWarningsNotAsErrors() = let tool = new FSharp.Build.Fsc() tool.WarningsNotAsErrors <- "52;109" @@ -176,7 +165,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestVersionFile() = let tool = new FSharp.Build.Fsc() tool.VersionFile <- "src/version" @@ -191,7 +180,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestDocumentationFile() = let tool = new FSharp.Build.Fsc() tool.DocumentationFile <- "foo.xml" @@ -206,7 +195,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestGenerateInterfaceFile() = let tool = new FSharp.Build.Fsc() tool.GenerateInterfaceFile <- "foo.fsi" @@ -221,7 +210,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestKeyFile() = let tool = new FSharp.Build.Fsc() tool.KeyFile <- "key.txt" @@ -236,7 +225,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestNoFramework() = let tool = new FSharp.Build.Fsc() tool.NoFramework <- true @@ -251,7 +240,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestOptimize() = let tool = new FSharp.Build.Fsc() tool.Optimize <- false @@ -265,7 +254,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestTailcalls() = let tool = new FSharp.Build.Fsc() tool.Tailcalls <- true @@ -280,7 +269,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestOtherFlags() = let tool = new FSharp.Build.Fsc() tool.OtherFlags <- "--yadda yadda" @@ -296,7 +285,7 @@ type Build() = "yadda") cmd - [] + [] member public this.TestOutputAssembly() = let tool = new FSharp.Build.Fsc() tool.OutputAssembly <- "oUt.dll" @@ -311,7 +300,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestPdbFile() = let tool = new FSharp.Build.Fsc() tool.PdbFile <- "out.pdb" @@ -326,7 +315,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestPlatform1() = let tool = new FSharp.Build.Fsc() tool.Platform <- "x64" @@ -341,7 +330,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestPlatform3() = let tool = new FSharp.Build.Fsc() tool.Platform <- "x86" @@ -356,10 +345,10 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestReferences() = let tool = new FSharp.Build.Fsc() - let dll = "c:\\sd\\staging\\tools\\nunit\\nunit.framework.dll" + let dll = "c:\\sd\\staging\\tools\\xunit\\xunit.core.dll" tool.References <- [| MakeTaskItem dll |] AssertEqual 1 tool.References.Length let cmd = tool.InternalGenerateResponseFileCommands() @@ -372,39 +361,39 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestReferencePath() = let tool = new FSharp.Build.Fsc() - let path = "c:\\sd\\staging\\tools\\nunit\\;c:\\Foo" + let path = "c:\\sd\\staging\\tools\\xunit\\;c:\\Foo" tool.ReferencePath <- path AssertEqual path tool.ReferencePath let cmd = tool.InternalGenerateResponseFileCommands() printfn "cmd=\"%s\"" cmd AssertEqual ("--optimize+" + Environment.NewLine + - "--lib:c:\\sd\\staging\\tools\\nunit\\,c:\\Foo" + Environment.NewLine + + "--lib:c:\\sd\\staging\\tools\\xunit\\,c:\\Foo" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + "--highentropyva-" + Environment.NewLine + "--nocopyfsharpcore") cmd - [] + [] member public this.TestReferencePathWithSpaces() = let tool = new FSharp.Build.Fsc() - let path = "c:\\program files;c:\\sd\\staging\\tools\\nunit;c:\\Foo" + let path = "c:\\program files;c:\\sd\\staging\\tools\\xunit;c:\\Foo" tool.ReferencePath <- path AssertEqual path tool.ReferencePath let cmd = tool.InternalGenerateResponseFileCommands() printfn "cmd=\"%s\"" cmd AssertEqual ("--optimize+" + Environment.NewLine + - "--lib:c:\\program files,c:\\sd\\staging\\tools\\nunit,c:\\Foo" + Environment.NewLine + + "--lib:c:\\program files,c:\\sd\\staging\\tools\\xunit,c:\\Foo" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + "--highentropyva-" + Environment.NewLine + "--nocopyfsharpcore") cmd - [] + [] member public this.TestResources() = let tool = new FSharp.Build.Fsc() tool.Resources <- [| MakeTaskItem "Foo.resources" |] @@ -419,7 +408,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestSources() = let tool = new FSharp.Build.Fsc() let src = "foo.fs" @@ -438,7 +427,7 @@ type Build() = cmd () - [] + [] member public this.TestTargetType1() = let tool = new FSharp.Build.Fsc() tool.TargetType <- "Library" @@ -453,7 +442,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestTargetType2() = let tool = new FSharp.Build.Fsc() tool.TargetType <- "Winexe" @@ -468,7 +457,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestTargetType3() = let tool = new FSharp.Build.Fsc() tool.TargetType <- "Module" @@ -483,7 +472,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestUtf8Output() = let tool = new FSharp.Build.Fsc() tool.Utf8Output <- true @@ -497,7 +486,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestWin32Res() = let tool = new FSharp.Build.Fsc() tool.Win32ResourceFile <- "foo.res" @@ -511,7 +500,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestWin32Manifest() = let tool = new FSharp.Build.Fsc() tool.Win32ManifestFile <- "foo.manifest" @@ -525,7 +514,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestHighEntropyVA() = let tool = new FSharp.Build.Fsc() tool.HighEntropyVA <- true @@ -538,7 +527,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestSubsystemVersion() = let tool = new FSharp.Build.Fsc() tool.SubsystemVersion <- "6.02" @@ -552,7 +541,7 @@ type Build() = "--nocopyfsharpcore") cmd - [] + [] member public this.TestAllCombo() = let tool = new FSharp.Build.Fsc() tool.CodePage <- "65001" @@ -668,7 +657,7 @@ type Build() = let expectedSources = [| "foo.fs"; "C:\\Program Files\\spaces.fs" |] AssertEqual expectedSources hostObject.Sources - [] + [] member public this.``DisabledWarnings build property``() = let tool = new FSharp.Build.Fsc() tool.DisabledWarnings <- " diff --git a/vsintegration/tests/UnitTests/Tests.InternalCollections.fs b/vsintegration/tests/UnitTests/Tests.InternalCollections.fs index 55a4bb1f34e..835eebcd771 100644 --- a/vsintegration/tests/UnitTests/Tests.InternalCollections.fs +++ b/vsintegration/tests/UnitTests/Tests.InternalCollections.fs @@ -4,11 +4,10 @@ namespace Tests.Compiler.InternalCollections open System open System.IO -open NUnit.Framework +open Xunit open Internal.Utilities.Collections -[] type MruCache = new() = { } @@ -23,23 +22,23 @@ type MruCache = member private rb.NumToStringBox n = box (rb.NumToString n) #if DISABLED_OLD_UNITTESTS - [] + [] member public rb.Basic() = let m = new MruCache(3, (fun (x,y) -> x = y)) let s = m.Get(5) - Assert.IsTrue("Five"=s) + Assert.True("Five"=s) let s = m.Get(6) - Assert.IsTrue("Six"=s) + Assert.True("Six"=s) let s = m.Get(7) - Assert.IsTrue("Seven"=s) + Assert.True("Seven"=s) let s = m.Get(8) - Assert.IsTrue("Eight"=s) + Assert.True("Eight"=s) let (i,s) = Option.get m.MostRecent - Assert.AreEqual(8,i) - Assert.IsTrue("Eight"=s) + Assert.Equal(8,i) + Assert.True("Eight"=s) () - [] + [] member public rb.MostRecentOfEmpty() = let m = new MruCache(3, rb.NumToString, (fun (x,y) -> x = y)) match m.MostRecent with @@ -47,21 +46,21 @@ type MruCache = | None->() - [] + [] member public rb.SetAlternate() = let m = new MruCache(3, rb.NumToString, (fun (x,y) -> x = y)) m.SetAlternate(2,"Banana") let (i,s) = Option.get m.MostRecent - Assert.AreEqual(2,i) - Assert.IsTrue("Banana"=s) + Assert.Equal(2,i) + Assert.True("Banana"=s) member private rb.AddBanana(m:MruCache) = let banana = new obj() m.SetAlternate(2,banana) let s = m.Get(2) - Assert.AreEqual(banana,s) + Assert.Equal(banana,s) - [] + [] member public rb.CacheDepthIsHonored() = let m = new MruCache(3, rb.NumToStringBox, (fun (x,y) -> x = y)) rb.AddBanana(m) // Separate function to keep 'banana' out of registers @@ -70,9 +69,9 @@ type MruCache = let _ = m.Get(5) GC.Collect() let s = m.Get(2) - Assert.IsTrue("Two"=downcast s) + Assert.True("Two"=downcast s) - [] + [] member public rb.SubsumptionIsHonored() = let PairToString (s,n) = rb.NumToString n let AreSameForSubsumption((s1,n1),(s2,n2)) = n1=n2 @@ -80,13 +79,13 @@ type MruCache = let m = new MruCache(3, PairToString, (fun (x,y) -> x = y), areSimilar=AreSameForSubsumption) m.SetAlternate(("x",2),"Banana") let s = m.Get (("x",2)) - Assert.IsTrue("Banana"=s, "Check1") + Assert.True("Banana"=s, "Check1") let s = m.Get (("y",2)) - Assert.IsTrue("Two"=s, "Check2") + Assert.True("Two"=s, "Check2") let s = m.Get (("x",2)) - Assert.IsTrue("Two"=s, "Check3") // Not banana because it was subsumed + Assert.True("Two"=s, "Check3") // Not banana because it was subsumed - [] + [] member public rb.OnDiscardIsHonored() = let AreSameForSubsumption((s1,n1),(s2,n2)) = s1=s2 @@ -95,27 +94,26 @@ type MruCache = let m = new MruCache(compute=fst, areSimilar=(fun (x,y) -> x = y), areSimilar=AreSameForSubsumption, keepStrongly=2, keepMax=2, onDiscard=(fun s -> discarded := s :: !discarded)) m.SetAlternate(("x",1),"Banana") // no discard printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = [], "Check1") + Assert.True(discarded.Value = [], "Check1") m.SetAlternate(("x",2),"Apple") // forces discard of x --> Banana printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = ["Banana"], "Check2") + Assert.True(discarded.Value = ["Banana"], "Check2") let s = m.Get (("x",3)) printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = ["Apple"; "Banana"], "Check3") + Assert.True(discarded.Value = ["Apple"; "Banana"], "Check3") let s = m.Get (("y",4)) printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = ["Apple"; "Banana"], "Check4") + Assert.True(discarded.Value = ["Apple"; "Banana"], "Check4") let s = m.Get (("z",5)) // forces discard of x --> Bananas printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = ["x"; "Apple";"Banana"], "Check5") + Assert.True(discarded.Value = ["x"; "Apple";"Banana"], "Check5") let s = m.Get (("w",6)) // forces discard of y printfn "discarded = %A" discarded.Value - Assert.IsTrue(discarded.Value = ["y";"x";"Apple";"Banana"], "Check6") + Assert.True(discarded.Value = ["y";"x";"Apple";"Banana"], "Check6") #endif type AccessToken() = class end -[] type AgedLookup() = let mutable hold197 : byte [] = null let mutable hold198 : byte [] = null @@ -127,17 +125,17 @@ type AgedLookup() = let AssertCached(i,o:byte array) = match al.TryPeekKeyValue(atok,i) with - | Some(_,x) -> Assert.IsTrue(obj.ReferenceEquals(o,x), sprintf "Object in cache (%d) does not agree with expectation (%d)" x.[0] i) - | None -> Assert.IsTrue(false, "Object fell out of cache") + | Some(_,x) -> Assert.True(obj.ReferenceEquals(o,x), sprintf "Object in cache (%d) does not agree with expectation (%d)" x.[0] i) + | None -> Assert.True(false, "Object fell out of cache") let AssertExistsInCached(i) = match al.TryPeekKeyValue(atok,i) with | Some _ -> () - | None -> Assert.IsTrue(false, "Object fell out of cache") + | None -> Assert.True(false, "Object fell out of cache") let AssertNotCached(i) = match al.TryPeekKeyValue(atok,i) with - | Some _ -> Assert.IsTrue(false, "Expected key to have fallen out of cache") + | Some _ -> Assert.True(false, "Expected key to have fallen out of cache") | None -> () let f() = @@ -215,7 +213,7 @@ type AgedLookup() = GC.Collect() - [] member public rb.WeakRef0() = WeakRefTest 0 - [] member public rb.WeakRef1() = WeakRefTest 1 - [] member public rb.WeakRef2() = WeakRefTest 2 - [] member public rb.WeakRef3() = WeakRefTest 3 + [] member public rb.WeakRef0() = WeakRefTest 0 + [] member public rb.WeakRef1() = WeakRefTest 1 + [] member public rb.WeakRef2() = WeakRefTest 2 + [] member public rb.WeakRef3() = WeakRefTest 3 diff --git a/vsintegration/tests/UnitTests/Tests.Powerpack.fs b/vsintegration/tests/UnitTests/Tests.Powerpack.fs deleted file mode 100644 index 7ea87328bc4..00000000000 --- a/vsintegration/tests/UnitTests/Tests.Powerpack.fs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace UnitTests.Tests.PowerPack - -open NUnit.Framework -open System -open System.IO -open System.Diagnostics -open FSharp.Build -open Microsoft.Build.Framework -open Microsoft.Build.Utilities -open UnitTests.TestLib.Utils.FilesystemHelpers - -[] -type FsLexTests() = - - [] - member this.Setup() = () - - [] - member this.TearDown() = () - - [] - member public this.TestCodePage() = - let tool = new FSharp.Build.FsLex() - tool.CodePage <- "65001" - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("--codepage 65001 ", cmd) - - [] - member public this.TestOutputFile() = - let tool = new FSharp.Build.FsLex() - tool.OutputFile <- "result.fs" - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("-o result.fs ", cmd) - - [] - member public this.TestUnicode() = - let tool = new FSharp.Build.FsLex() - tool.Unicode <- true - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("--unicode ", cmd) - - [] - member public this.TestUnicodeNegCase() = - let tool = new FSharp.Build.FsLex() - tool.Unicode <- false - let cmd = tool.InternalGenerateCommandLineCommands() - // Verify Unicode flag not specified - Assert.AreEqual("", cmd) - -[] -type FsYaccTests() = - - [] - member this.Setup() = () - - [] - member this.TearDown() = () - - [] - member public this.TestCodePage() = - let tool = new FSharp.Build.FsYacc() - tool.CodePage <- "65001" - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("--codepage 65001", cmd) - - [] - member public this.TestOutputFile() = - let tool = new FSharp.Build.FsYacc() - tool.OutputFile <- "result.fs" - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("-o result.fs", cmd) - - [] - member public this.TestMLCompatibility() = - let tool = new FSharp.Build.FsYacc() - tool.MLCompatibility <- true - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("--ml-compatibility", cmd) - - [] - member public this.TestMLCompatibilityFalse() = - let tool = new FSharp.Build.FsYacc() - tool.MLCompatibility <- false - let cmd = tool.InternalGenerateCommandLineCommands() - Assert.AreEqual("", cmd) \ No newline at end of file diff --git a/vsintegration/tests/UnitTests/Tests.TaskReporter.fs b/vsintegration/tests/UnitTests/Tests.TaskReporter.fs index fb5e57bb446..d644a6c3237 100644 --- a/vsintegration/tests/UnitTests/Tests.TaskReporter.fs +++ b/vsintegration/tests/UnitTests/Tests.TaskReporter.fs @@ -2,7 +2,7 @@ namespace Tests.LanguageService.ErrorList -open NUnit.Framework +open Xunit open System open System.IO open System.Diagnostics @@ -20,7 +20,6 @@ open Salsa.VsMocks type TextSpan = Microsoft.VisualStudio.TextManager.Interop.TextSpan type DocumentTask = Microsoft.VisualStudio.FSharp.LanguageService.DocumentTask -[] type TaskReporterTests() = static let err(line) : 'a = printfn "err() called on line %s with %s" line System.Environment.StackTrace @@ -94,7 +93,7 @@ type TaskReporterTests() = // One File Tests // For the next two, add tasks to the task list more than once to ensure that // hashing is occurring correctly - [] + [] member public this.``ErrorList.LanguageServiceErrorsProperlyCoalesced``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -114,7 +113,7 @@ type TaskReporterTests() = - [] + [] member public this.``ErrorList.ProjectSystemErrorsProperlyCoalesced``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -134,7 +133,7 @@ type TaskReporterTests() = () /// Test for multiple identical errors being properly coalesced in the error list (bug 2151) - [] + [] member public this.``ErrorList.ErrorsProperlyCoalesced``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -153,7 +152,7 @@ type TaskReporterTests() = () // modify the span, and check to see if we have two tasks now instead of one - [] + [] member public this.``ErrorList.ProjectSystemErrorsProperlyCoalesced2``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -175,7 +174,7 @@ type TaskReporterTests() = () /// Ensure that text line markers are only created when a task is output to the task list - [] + [] member public this.``ErrorList.TextLineMarkersCreatedOnce``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -212,7 +211,7 @@ type TaskReporterTests() = // both files open // errors in each file, build - no duplicates - [] + [] member public this.``ErrorList.TwoFilesBothOpen``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -238,7 +237,7 @@ type TaskReporterTests() = // file open, one file closed // - error in closed file - [] + [] member public this.``ErrorList.TwoFilesOneOpenErrorInOpen``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -268,7 +267,7 @@ type TaskReporterTests() = () // all files open - build, then fix - no errors left - [] + [] member public this.``ErrorList.TwoFilesCorrectError``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -314,7 +313,7 @@ type TaskReporterTests() = // Make sure a 'typecheck' is treated as a background task - [] + [] member public this.``ErrorList.BackgroundTaskIsClassified``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) @@ -342,7 +341,7 @@ type TaskReporterTests() = // Make sure a 'ilxgen' is treated as a build task - [] + [] member public this.``ErrorList.BuildTaskIsClassified``() = use errorReporter = CreateErrorReporter() let mutable span = new TextSpan(iStartLine = 1, iEndLine = 1, iStartIndex = 1, iEndIndex = 2) diff --git a/vsintegration/tests/UnitTests/Tests.Watson.fs b/vsintegration/tests/UnitTests/Tests.Watson.fs index 35ccf0f4d03..e5c19d5e22d 100644 --- a/vsintegration/tests/UnitTests/Tests.Watson.fs +++ b/vsintegration/tests/UnitTests/Tests.Watson.fs @@ -11,7 +11,7 @@ open FSharp.Compiler.CodeAnalysis open Internal.Utilities.Library open FSharp.Compiler.CompilerConfig open FSharp.Compiler.Driver -open NUnit.Framework +open Xunit open System.IO type Check = @@ -51,122 +51,121 @@ type Check = FileSystem.FileDeleteShim("watson-test.fs") -[] module WatsonTests = - [] + [] let FscOutOfMemory() = Check.FscLevelException("fsc-oom") - [] + [] let FscArgumentNull() = Check.FscLevelException("fsc-an") - [] + [] let FscInvalidOperation() = Check.FscLevelException("fsc-invop") // As of .NET 4.0 some exception types cannot be caught. As a result, we cannot test this case. I did visually confirm a Watson report is sent, though. -// [] +// [] // let FscAccessViolation() = Check.FscLevelException("fsc-ac") - [] + [] let FscArgumentOutOfRange() = Check.FscLevelException("fsc-aor") - [] + [] let FscDivideByZero() = Check.FscLevelException("fsc-dv0") - [] + [] let FscNotFiniteNumber() = Check.FscLevelException("fsc-nfn") - [] + [] let FscOverflow() = Check.FscLevelException("fsc-oe") - [] + [] let FscArrayTypeMismatch() = Check.FscLevelException("fsc-atmm") - [] + [] let FscBadImageFormat() = Check.FscLevelException("fsc-bif") - [] + [] let FscKeyNotFound() = Check.FscLevelException("fsc-knf") - [] + [] let FscIndexOutOfRange() = Check.FscLevelException("fsc-ior") - [] + [] let FscInvalidCast() = Check.FscLevelException("fsc-ic") - [] + [] let FscInvalidProgram() = Check.FscLevelException("fsc-ip") - [] + [] let FscMemberAccess() = Check.FscLevelException("fsc-ma") - [] + [] let FscNotImplemented() = Check.FscLevelException("fsc-ni") - [] + [] let FscNullReference() = Check.FscLevelException("fsc-nr") - [] + [] let FscOperationCancelled() = Check.FscLevelException("fsc-oc") - //[] + //[] //let FscFailure() = Check.FscLevelException("fsc-fail") - [] + [] let TypeCheckOutOfMemory() = Check.FscLevelException("tc-oom") - [] + [] let TypeCheckArgumentNull() = Check.FscLevelException("tc-an") - [] + [] let TypeCheckInvalidOperation() = Check.FscLevelException("tc-invop") // As of .NET 4.0 some exception types cannot be caught. As a result, we cannot test this case. I did visually confirm a Watson report is sent, though. -// [] +// [] // let TypeCheckAccessViolation() = Check.FscLevelException("tc-ac") - [] + [] let TypeCheckArgumentOutOfRange() = Check.FscLevelException("tc-aor") - [] + [] let TypeCheckDivideByZero() = Check.FscLevelException("tc-dv0") - [] + [] let TypeCheckNotFiniteNumber() = Check.FscLevelException("tc-nfn") - [] + [] let TypeCheckOverflow() = Check.FscLevelException("tc-oe") - [] + [] let TypeCheckArrayTypeMismatch() = Check.FscLevelException("tc-atmm") - [] + [] let TypeCheckBadImageFormat() = Check.FscLevelException("tc-bif") - [] + [] let TypeCheckKeyNotFound() = Check.FscLevelException("tc-knf") - [] + [] let TypeCheckIndexOutOfRange() = Check.FscLevelException("tc-ior") - [] + [] let TypeCheckInvalidCast() = Check.FscLevelException("tc-ic") - [] + [] let TypeCheckInvalidProgram() = Check.FscLevelException("tc-ip") - [] + [] let TypeCheckMemberAccess() = Check.FscLevelException("tc-ma") - [] + [] let TypeCheckNotImplemented() = Check.FscLevelException("tc-ni") - [] + [] let TypeCheckNullReference() = Check.FscLevelException("tc-nr") - [] + [] let TypeCheckOperationCancelled() = Check.FscLevelException("tc-oc") - [] + [] let TypeCheckFailure() = Check.FscLevelException("tc-fail") diff --git a/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs b/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs index 432d72ec018..b11bdd9ef8c 100644 --- a/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs +++ b/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs @@ -3,13 +3,12 @@ namespace Tests.LanguageService open System -open NUnit.Framework +open Xunit open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa open UnitTests.TestLib.Utils -[] type XmlDocComments() = inherit UnitTests.TestLib.LanguageService.LanguageServiceBaseTests(VsOpts = InstalledMSBuildTestFlavour()) @@ -58,31 +57,28 @@ type XmlDocComments() = let project2 = CreateProject(solution, "FSClient") let file1 = AddFileFromTextBlob(project1,"File1.fs", fileContent1) AddProjectReference(project2,project1) - Build(project1) |> fun result -> Assert.IsTrue(result.BuildSucceeded) + Build(project1) |> fun result -> Assert.True(result.BuildSucceeded) let file2 = AddFileFromTextBlob(project2,"File2.fs", fileContent2) let file = OpenFile(project2, "File2.fs") MoveCursorToStartOfMarker(file, marker) GetQuickInfoAtCursor file - [] - [] + [] member this.``MalFormedXML.FromXMLDoc``() = let expected = "XML comment" let tooltip = this.TestMalFormedXML("(*Marker1*)") printfn "%A" tooltip AssertContains(trimnewlines tooltip, trimnewlines expected) - [] - [] + [] member this.``MalFormedXML.FromCurrentProject``() = let expected = "'summary'" let tooltip = this.TestMalFormedXML("(*Marker2*)") printfn "%A" tooltip AssertContains(trimnewlines tooltip, trimnewlines expected) - [] - [] + [] member this.``MalFormedXML.NoXMLComment.Bug5858``() = let notexpected = "summary" let notexpected2 = "param name=" @@ -91,8 +87,7 @@ type XmlDocComments() = AssertNotContains(tooltip, notexpected) AssertNotContains(tooltip, notexpected2) - [] - [] + [] member this.Test() = let fileContent = """ //local custom type value diff --git a/vsintegration/tests/UnitTests/UnusedOpensTests.fs b/vsintegration/tests/UnitTests/UnusedOpensTests.fs index e47b38b46e6..b77d7e257ef 100644 --- a/vsintegration/tests/UnitTests/UnusedOpensTests.fs +++ b/vsintegration/tests/UnitTests/UnusedOpensTests.fs @@ -1,17 +1,14 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -[] + module Tests.ServiceAnalysis.UnusedOpens open System -open NUnit.Framework +open Xunit open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.EditorServices open FSharp.Compiler.Text -/// like "should equal", but validates same-type -let shouldEqual (x: 'a) (y: 'a) = Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y) - let private filePath = "C:\\test.fs" let private projectOptions : FSharpProjectOptions = @@ -43,9 +40,9 @@ let (=>) (source: string) (expectedRanges: ((*line*)int * ((*start column*)int * unusedOpenRanges |> List.map (fun x -> x.StartLine, (x.StartColumn, x.EndColumn)) - |> shouldEqual expectedRanges + |> fun actual -> Assert.Equal<(int * (int * int)) list>(expectedRanges, actual) -[] +[] let ``unused open declaration in top level module``() = """ module TopModule @@ -55,7 +52,7 @@ let _ = DateTime.Now """ => [ 4, (5, 14) ] -[] +[] let ``unused open declaration in namespace``() = """ namespace TopNamespace @@ -66,7 +63,7 @@ module Nested = """ => [ 4, (5, 14) ] -[] +[] let ``unused open declaration in nested module``() = """ namespace TopNamespace @@ -77,7 +74,7 @@ module Nested = """ => [ 5, (9, 18) ] -[] +[] let ``unused open declaration due to partially qualified symbol``() = """ module TopModule @@ -87,7 +84,7 @@ let _ = IO.File.Create "" """ => [ 4, (5, 14) ] -[] +[] let ``unused parent open declaration due to partially qualified symbol``() = """ module TopModule @@ -97,7 +94,7 @@ let _ = File.Create "" """ => [ 3, (5, 11) ] -[] +[] let ``open statement duplication in parent module is unused``() = """ module TopModule @@ -108,7 +105,7 @@ module Nested = """ => [ 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 @@ -120,14 +117,14 @@ 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 @@ -139,7 +136,7 @@ module M2 = """ => [] -[] +[] let ``open a nested module inside another one is not unused, complex hierarchy``() = """ module Top = @@ -153,7 +150,7 @@ module Top = """ => [] -[] +[] let ``open a nested module inside another one is not unused, even more complex hierarchy``() = """ module Top = @@ -169,7 +166,7 @@ module Top = """ => [] -[] +[] let ``opening auto open module after it's parent module was opened should be marked as unused``() = """ module NormalModule = @@ -188,7 +185,7 @@ 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 = @@ -207,7 +204,7 @@ let _ = Class() """ => [ 13, (5, 52) ] -[] +[] let ``open declaration is not marked as unused if there is a shortened attribute symbol from it``() = """ open System @@ -216,7 +213,7 @@ type Class() = class end """ => [] -[] +[] let ``open declaration is not marked as unused if an extension property is used``() = """ module Module = @@ -227,7 +224,7 @@ let _ = "a long string".ExtensionProperty """ => [] -[] +[] let ``open declaration is marked as unused if an extension property is not used``() = """ module Module = @@ -238,7 +235,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 @@ -251,7 +248,7 @@ let _ = x.ExtensionMethod() """ => [] -[] +[] let ``open declaration is marked as unused if an extension method is not used``() = """ type Class() = class end @@ -263,7 +260,7 @@ 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 = @@ -273,7 +270,7 @@ type Site (x: Class -> unit) = class end """ => [] -[] +[] let ``open declaration is marked as unused if nothing from it is used``() = """ module M = @@ -283,7 +280,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 = @@ -295,7 +292,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 = @@ -307,7 +304,7 @@ 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 @@ -317,7 +314,7 @@ module M = """ => [4, (9, 15) ] -[] +[] let ``either of two open declarations are not marked as unused if symbols from both of them are used``() = """ module M1 = @@ -332,7 +329,7 @@ let _ = func2() """ => [] -[] +[] let ``open module with ModuleSuffix attribute value applied is not marked as unused if a symbol declared in it is used``() = """ [] @@ -343,7 +340,7 @@ let _ = func() """ => [] -[] +[] let ``open module all of which symbols are used by qualifier is marked as unused``() = """ module M = @@ -353,7 +350,7 @@ 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 = @@ -363,7 +360,7 @@ let func (arg: Class list) = () """ => [] -[] +[] let ``auto open module``() = """ module Top = @@ -375,7 +372,7 @@ let _ = func() """ => [] -[] +[] let ``auto open module with namespace``() = """ namespace Module1Namespace @@ -390,7 +387,7 @@ module Module3 = """ => [] -[] +[] let ``auto open module in the middle of hierarchy``() = """ namespace Ns @@ -404,7 +401,7 @@ module M2 = """ => [] -[] +[] let ``open declaration is not marked as unused if a delegate defined in it is used``() = """ open System @@ -412,7 +409,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 = @@ -423,7 +420,7 @@ module N = """ => [] -[] +[] 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 @@ -431,7 +428,7 @@ type T = abstract M: [] ?x: int -> unit """ => [] -[] +[] let ``relative module open declaration``() = """ module Top = @@ -443,7 +440,7 @@ let _ = x """ => [] -[] +[] let ``open declaration is used if a symbol defined in it is used in a module top-level do expression``() = """ module Top @@ -453,7 +450,7 @@ File.ReadAllLines "" """ => [] -[] +[] let ``redundant opening a module with ModuleSuffix attribute value is marks as unused``() = """ [] @@ -465,7 +462,7 @@ module M = """ => [ 6, (9, 33) ] -[] +[] let ``redundant opening a module is marks as unused``() = """ module InternalModuleWithSuffix = @@ -476,7 +473,7 @@ module M = """ => [ 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 = @@ -486,7 +483,7 @@ 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 = @@ -496,7 +493,7 @@ let _ = DU.Case1 """ => [] -[] +[] let ``type with different DisplayName``() = """ open Microsoft.FSharp.Quotations @@ -504,7 +501,7 @@ let _ = Expr.Coerce (<@@ 1 @@>, typeof) """ => [] -[] +[] let ``auto open module with ModuleSuffix attribute value``() = """ module Top = @@ -517,7 +514,7 @@ module Module1 = """ => [] -[] +[] let ``a type which has more than one DisplayName causes the namespace it's defined in to be not marked as unused``() = """ open System @@ -525,7 +522,7 @@ let _ = IntPtr.Zero """ => [] -[] +[] let ``usage of an operator makes the module it's defined in to be not marked as unused``() = """ module M = @@ -535,7 +532,7 @@ let _ = 1 ++| 2 """ => [] -[] +[] let ``usage of an operator makes the module /with Module suffix/ it's defined in to be not marked as unused``() = """ [] @@ -546,7 +543,7 @@ 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 = @@ -558,7 +555,7 @@ let _ = match obj() with """ => [] -[] +[] let ``a function from printf family prevents Printf module from marking as unused``() = """ open Microsoft.FSharp.Core.Printf @@ -567,7 +564,7 @@ let _ = bprintf (StringBuilder()) "%A" 1 """ => [] -[] +[] let ``assembly level attribute prevents namespace in which it's defined to be marked as unused``() = """ open System @@ -576,7 +573,7 @@ open System """ => [] -[] +[] let ``open declaration is not marked as unused if a related type extension is used``() = """ module Module = @@ -586,7 +583,7 @@ module Module = """ => [] -[] +[] let ``open declaration is not marked as unused if a symbol defined in it is used in type do block``() = """ open System.IO.Compression @@ -597,7 +594,7 @@ type OutliningHint() as self = """ => [] -[] +[] let ``should not mark open declaration with global prefix``() = """ module Module = @@ -606,7 +603,7 @@ module Module = """ => [] -[] +[] let ``record fields should be taken into account``() = """ module M1 = @@ -617,7 +614,7 @@ module M2 = """ => [] -[] +[] let ``handle type alias``() = """ module TypeAlias = @@ -628,7 +625,7 @@ module Usage = """ => [] -[] +[] let ``handle override members``() = """ type IInterface = @@ -642,7 +639,7 @@ let f (x: IClass) = (x :> IInterface).Property """ => [] -[] +[] let ``active pattern cases should be taken into account``() = """ module M = @@ -652,7 +649,7 @@ let f (Pattern _) = () """ => [] -[] +[] let ``active patterns applied as a function should be taken into account``() = """ module M = @@ -662,7 +659,7 @@ let _ = (|Pattern|_|) () """ => [] -[] +[] let ``not used active pattern does not make the module in which it's defined to not mark as unused``() = """ module M = @@ -672,7 +669,7 @@ let _ = 1 """ => [ 4, (5, 6) ] -[] +[] let ``type in type parameter constraint should be taken into account``() = """ open System @@ -680,7 +677,7 @@ let f (x: 'a when 'a :> IDisposable) = () """ => [] -[] +[] let ``namespace declaration should never be marked as unused``() = """ namespace Library2 @@ -688,7 +685,7 @@ type T() = class end """ => [] -[] +[] let ``auto open module opened before enclosing one is handled correctly``() = """ module M = @@ -703,7 +700,7 @@ let _ = y """ => [] -[] +[] let ``single relative open declaration opens two independent modules in different parent modules``() = """ module M = @@ -722,7 +719,7 @@ let _ = x """ => [] -[] +[] let ``C# extension methods are taken into account``() = """ open System.Linq @@ -733,7 +730,7 @@ module Test = """ => [] -[] +[] let ``namespace which contains types with C# extension methods is marked as unused if no extension is used``() = """ open System.Linq @@ -743,7 +740,7 @@ module Test = """ => [ 2, (5, 16) ] -[] +[] let ``a type from an auto open module is taken into account``() = """ module M1 = @@ -757,7 +754,7 @@ module M2 = """ => [] -[] +[] let ``unused open declaration in top level rec module``() = """ module rec TopModule @@ -767,7 +764,7 @@ let _ = DateTime.Now """ => [ 4, (5, 14) ] -[] +[] let ``unused open declaration in rec namespace``() = """ namespace rec TopNamespace @@ -778,7 +775,7 @@ module Nested = """ => [ 4, (5, 14) ] -[] +[] let ``unused inner module open declaration in rec module``() = """ module rec TopModule @@ -793,7 +790,7 @@ open Nested """ => [ 10, (5, 11) ] -[] +[] let ``used inner module open declaration in rec module``() = """ module rec TopModule @@ -810,7 +807,7 @@ let _ = f 1 """ => [] -[] +[] let ``used open C# type``() = """ open type System.Console @@ -819,7 +816,7 @@ WriteLine("Hello World") """ => [] -[] +[] let ``unused open C# type``() = """ open type System.Console @@ -828,7 +825,7 @@ printfn "%s" "Hello World" """ => [2, (10, 24)] -[] +[] let ``used open type from module``() = """ module MyModule = @@ -841,7 +838,7 @@ printfn "%A" Thing """ => [] -[] +[] let ``unused open type from module``() = """ module MyModule = diff --git a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj index f99bd68ec58..2a764378864 100644 --- a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj +++ b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj @@ -11,12 +11,12 @@ true true false - nunit + xunit true - + Internal.Utilities.Collections.fsi @@ -68,7 +68,7 @@ {{FSCoreVersion}} $(FSCoreVersion) - + diff --git a/vsintegration/tests/UnitTests/Workspace/WorkspaceTests.fs b/vsintegration/tests/UnitTests/Workspace/WorkspaceTests.fs index f411cfa973e..684ae3a6c84 100644 --- a/vsintegration/tests/UnitTests/Workspace/WorkspaceTests.fs +++ b/vsintegration/tests/UnitTests/Workspace/WorkspaceTests.fs @@ -19,10 +19,9 @@ open Microsoft.CodeAnalysis.Host.Mef open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.Shell open VisualFSharp.UnitTests.Editor -open NUnit.Framework +open Xunit open Microsoft.VisualStudio.FSharp.Editor.CancellableTasks -[] module WorkspaceTests = let compileFileAsDll (workspace: Workspace) filePath outputFilePath = @@ -170,15 +169,15 @@ module WorkspaceTests = let doc = getDocument workspace filePath let parseResults, checkResults = doc.GetFSharpParseAndCheckResultsAsync("assertEmptyDocumentDiagnostics") |> CancellableTask.runSynchronouslyWithoutCancellation - Assert.IsEmpty(parseResults.Diagnostics) - Assert.IsEmpty(checkResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) + Assert.Empty(checkResults.Diagnostics) let assertHasDocumentDiagnostics (workspace: Workspace) (filePath: string) = let doc = getDocument workspace filePath let parseResults, checkResults = doc.GetFSharpParseAndCheckResultsAsync("assertHasDocumentDiagnostics") |> CancellableTask.runSynchronouslyWithoutCancellation - Assert.IsEmpty(parseResults.Diagnostics) - Assert.IsNotEmpty(checkResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) + Assert.NotEmpty(checkResults.Diagnostics) type TestFSharpWorkspaceProjectContext(mainProj: Project) = @@ -286,7 +285,7 @@ module WorkspaceTests = // let proj = workspace.CurrentSolution.GetProject(projInfo.Id) // new TestFSharpWorkspaceProjectContext(proj) :> IFSharpWorkspaceProjectContext -// [] +// [] // let ``Script file opened in misc files workspace will get transferred to normal workspace``() = // use workspace = createWorkspace() // use miscFilesWorkspace = createMiscFileWorkspace() @@ -306,25 +305,25 @@ module WorkspaceTests = // let projInfo = createProjectInfoWithFileOnDisk filePath // addProject miscFilesWorkspace projInfo -// Assert.IsTrue(hasDocument miscFilesWorkspace filePath) -// Assert.IsFalse(hasDocument workspace filePath) +// Assert.True(hasDocument miscFilesWorkspace filePath) +// Assert.False(hasDocument workspace filePath) -// Assert.IsFalse(isDocumentOpen miscFilesWorkspace filePath) +// Assert.False(isDocumentOpen miscFilesWorkspace filePath) // openDocument miscFilesWorkspace filePath // // Although we opened the document, it has been transferred to the other workspace. -// Assert.IsFalse(hasDocument miscFilesWorkspace filePath) -// Assert.IsTrue(hasDocument workspace filePath) +// Assert.False(hasDocument miscFilesWorkspace filePath) +// Assert.True(hasDocument workspace filePath) // // Should not be automatically opened when transferred. -// Assert.IsFalse(isDocumentOpen workspace filePath) +// Assert.False(isDocumentOpen workspace filePath) // assertEmptyDocumentDiagnostics workspace filePath // finally // try File.Delete(filePath) with | _ -> () -// [] +// [] // let ``Script file referencing another script should have no diagnostics``() = // use workspace = createWorkspace() // use miscFilesWorkspace = createMiscFileWorkspace() @@ -359,7 +358,7 @@ module WorkspaceTests = // try File.Delete(filePath1) with | _ -> () // try File.Delete(filePath2) with | _ -> () -// [] +// [] // let ``Script file referencing another script will correctly update when the referenced script file changes``() = // use workspace = createWorkspace() // use miscFilesWorkspace = createMiscFileWorkspace() @@ -408,7 +407,7 @@ module WorkspaceTests = // try File.Delete(filePath1) with | _ -> () // try File.Delete(filePath2) with | _ -> () -// [] +// [] // let ``Script file referencing another script will correctly update when the referenced script file changes with opening in reverse order``() = // use workspace = createWorkspace() // use miscFilesWorkspace = createMiscFileWorkspace() @@ -457,7 +456,7 @@ module WorkspaceTests = // try File.Delete(filePath1) with | _ -> () // try File.Delete(filePath2) with | _ -> () -// [] +// [] // let ``Script file referencing a DLL will correctly update when the referenced DLL file changes``() = // use workspace = createWorkspace() // use miscFilesWorkspace = createMiscFileWorkspace() diff --git a/vsintegration/tests/UnitTests/app.runsettings b/vsintegration/tests/UnitTests/app.runsettings deleted file mode 100644 index 009d9b69776..00000000000 --- a/vsintegration/tests/UnitTests/app.runsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - 1 - - - diff --git a/vsintegration/tests/UnitTests/xunit.runner.json b/vsintegration/tests/UnitTests/xunit.runner.json new file mode 100644 index 00000000000..dc9bc36c8a8 --- /dev/null +++ b/vsintegration/tests/UnitTests/xunit.runner.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", + "shadowCopy": false, + "maxParallelThreads": 1 +} \ No newline at end of file From cd736c495973ba247caaafba59b041f679bb233a Mon Sep 17 00:00:00 2001 From: Petr Date: Tue, 24 Sep 2024 18:03:51 +0200 Subject: [PATCH 11/37] Removing Nunit from utils (#17770) * Migrate last Nunit tests to Xunit * up * up * up * Update TestLib.LanguageService.fs * up * up * up * Remove unused tests * one more * Salsa * up * up * up * Update FsUnit.fs * Up * Update AsyncTests.fs --------- Co-authored-by: Kevin Ransom (msft) --- src/FSharp.Build/Fsc.fs | 4 +- src/FSharp.Build/Fsi.fs | 4 +- .../Graph/CompilationFromCmdlineArgsTests.fs | 16 +- .../Graph/DependencyResolutionTests.fs | 9 +- .../Graph/FileContentMappingTests.fs | 34 +-- .../TypeChecks/Graph/GraphProcessingTests.fs | 10 +- .../TypeChecks/Graph/QueryTrieTests.fs | 18 +- .../TypeChecks/Graph/TrieMappingTests.fs | 112 ++++---- .../TypeChecks/Graph/TypedTreeGraph.fs | 8 +- .../AssemblyReaderShim.fs | 2 +- .../CSharpProjectAnalysis.fs | 8 +- .../ProjectAnalysisTests.fs | 2 +- .../IntConversionsTestGenerator.fsx | 39 ++- tests/FSharp.Test.Utilities/Compiler.fs | 17 +- tests/FSharp.Test.Utilities/CompilerAssert.fs | 36 +-- .../FSharp.Test.Utilities.fsproj | 1 - tests/FSharp.Test.Utilities/ILChecker.fs | 2 +- tests/README.md | 3 +- .../Libraries/Core}/Async/AsyncTests.fs | 22 +- tests/fsharp/FSharpSuite.Tests.fsproj | 1 + tests/fsharp/TypeProviderTests.fs | 2 +- tests/fsharp/nunitConf.fs | 240 ------------------ tests/service/FsUnit.fs | 48 +--- vsintegration/tests/Salsa/SalsaUtils.fs | 14 +- .../tests/Salsa/VisualFSharp.Salsa.fsproj | 2 +- vsintegration/tests/Salsa/salsa.fs | 2 +- .../tests/UnitTests/TestLib.Utils.fs | 2 +- 27 files changed, 195 insertions(+), 463 deletions(-) rename tests/fsharp/{Libraries => Compiler/Libraries/Core}/Async/AsyncTests.fs (88%) delete mode 100644 tests/fsharp/nunitConf.fs diff --git a/src/FSharp.Build/Fsc.fs b/src/FSharp.Build/Fsc.fs index c18b42a3989..25cdbd34195 100644 --- a/src/FSharp.Build/Fsc.fs +++ b/src/FSharp.Build/Fsc.fs @@ -786,10 +786,10 @@ type public Fsc() as this = let builder = generateCommandLineBuilder () builder.GetCapturedArguments() |> String.concat Environment.NewLine - // expose this to internal components (for nunit testing) + // expose this to internal components (for unit testing) member internal fsc.InternalGenerateCommandLineCommands() = fsc.GenerateCommandLineCommands() - // expose this to internal components (for nunit testing) + // expose this to internal components (for unit testing) member internal fsc.InternalGenerateResponseFileCommands() = fsc.GenerateResponseFileCommands() member internal fsc.InternalExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = diff --git a/src/FSharp.Build/Fsi.fs b/src/FSharp.Build/Fsi.fs index dd0ccff9754..4e7bd9c4e0a 100644 --- a/src/FSharp.Build/Fsi.fs +++ b/src/FSharp.Build/Fsi.fs @@ -388,10 +388,10 @@ type public Fsi() as this = let builder = generateCommandLineBuilder () builder.GetCapturedArguments() |> String.concat Environment.NewLine - // expose this to internal components (for nunit testing) + // expose this to internal components (for unit testing) member internal fsi.InternalGenerateCommandLineCommands() = fsi.GenerateCommandLineCommands() - // expose this to internal components (for nunit testing) + // expose this to internal components (for unit testing) member internal fsi.InternalGenerateResponseFileCommands() = fsi.GenerateResponseFileCommands() member internal fsi.InternalExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/CompilationFromCmdlineArgsTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/CompilationFromCmdlineArgsTests.fs index 4525d7286f2..9cfbbb9df80 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/CompilationFromCmdlineArgsTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/CompilationFromCmdlineArgsTests.fs @@ -5,19 +5,19 @@ module CompilationFromCmdlineArgsTests = open System open System.IO open FSharp.Compiler.CodeAnalysis - open NUnit.Framework + open Xunit open CompilationTests // Point to a generated args.txt file. // Use scrape.fsx to generate an args.txt from a binary log file. // The path needs to be absolute. - let localProjects: string list = + let localProjects = [ @"C:\Projects\fantomas\src\Fantomas.Core\Fantomas.Core.args.txt" @"C:\Projects\FsAutoComplete\src\FsAutoComplete\FsAutoComplete.args.txt" @"C:\Projects\fsharp\src\Compiler\FSharp.Compiler.Service.args.txt" @"C:\Projects\fsharp\tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.args.txt" - ] + ] |> Seq.map (fun p -> [| box p |]) let checker = FSharpChecker.Create() @@ -43,16 +43,16 @@ module CompilationFromCmdlineArgsTests = for diag in diagnostics do printfn "%A" diag - Assert.That(exitCode, Is.Zero) + Assert.Equal(exitCode, 0) finally Environment.CurrentDirectory <- oldWorkDir - [] - [] + [] + [] let ``Test sequential type-checking`` (projectArgumentsFilePath: string) = testCompilerFromArgs Method.Sequential projectArgumentsFilePath - [] - [] + [] + [] let ``Test graph-based type-checking`` (projectArgumentsFilePath: string) = testCompilerFromArgs Method.Graph projectArgumentsFilePath diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/DependencyResolutionTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/DependencyResolutionTests.fs index 36a246d6ced..81adc540766 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/DependencyResolutionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/DependencyResolutionTests.fs @@ -1,11 +1,14 @@ module TypeChecks.DependencyResolutionTests open TypeChecks.TestUtils -open NUnit.Framework +open Xunit open FSharp.Compiler.GraphChecking open Scenarios -[] +let scenarios = scenarios |> Seq.map (fun p -> [| box p |]) + +[] +[] let ``Supported scenario`` (scenario: Scenario) = let files = scenario.Files @@ -18,4 +21,4 @@ let ``Supported scenario`` (scenario: Scenario) = for file in scenario.Files do let expectedDeps = file.ExpectedDependencies let actualDeps = set graph.[file.Index] - Assert.AreEqual(expectedDeps, actualDeps, $"Dependencies don't match for {System.IO.Path.GetFileName file.FileName}") + Assert.True((expectedDeps = actualDeps), $"Dependencies don't match for {System.IO.Path.GetFileName file.FileName}") diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/FileContentMappingTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/FileContentMappingTests.fs index 12f171de5fa..070133a3d8d 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/FileContentMappingTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/FileContentMappingTests.fs @@ -1,6 +1,6 @@ module TypeChecks.FileContentMappingTests -open NUnit.Framework +open Xunit open FSharp.Compiler.GraphChecking open TestUtils @@ -35,7 +35,7 @@ let private (|NestedModule|_|) value e = | FileContentEntry.NestedModule(name, nestedContent) -> if name = value then Some(nestedContent) else None | _ -> None -[] +[] let ``Top level module only exposes namespace`` () = let content = getContent @@ -45,10 +45,10 @@ module X.Y.Z """ match content with - | [ TopLevelNamespace "X.Y" [] ] -> Assert.Pass() + | [ TopLevelNamespace "X.Y" [] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") -[] +[] let ``Top level namespace`` () = let content = getContent @@ -58,10 +58,10 @@ namespace X.Y """ match content with - | [ TopLevelNamespace "X.Y" [] ] -> Assert.Pass() + | [ TopLevelNamespace "X.Y" [] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") -[] +[] let ``Open statement in top level module`` () = let content = getContent @@ -73,10 +73,10 @@ open A.B.C """ match content with - | [ TopLevelNamespace "X.Y" [ OpenStatement "A.B.C" ] ] -> Assert.Pass() + | [ TopLevelNamespace "X.Y" [ OpenStatement "A.B.C" ] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") -[] +[] let ``PrefixedIdentifier in type annotation`` () = let content = getContent @@ -88,10 +88,10 @@ let fn (a: A.B.CType) = () """ match content with - | [ TopLevelNamespace "X.Y" [ PrefixedIdentifier "A.B" ] ] -> Assert.Pass() + | [ TopLevelNamespace "X.Y" [ PrefixedIdentifier "A.B" ] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") -[] +[] let ``Nested module`` () = let content = getContent @@ -104,10 +104,10 @@ module Z = """ match content with - | [ TopLevelNamespace "X" [ NestedModule "Z" [] ] ] -> Assert.Pass() + | [ TopLevelNamespace "X" [ NestedModule "Z" [] ] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") -[] +[] let ``Single ident module abbreviation`` () = let content = getContent @@ -119,13 +119,13 @@ module B = C """ match content with - | [ TopLevelNamespace "" [ PrefixedIdentifier "C" ] ] -> Assert.Pass() + | [ TopLevelNamespace "" [ PrefixedIdentifier "C" ] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") module InvalidSyntax = - [] + [] let ``Nested module`` () = let content = getContent @@ -137,11 +137,11 @@ module InvalidSyntax = """ match content with - | [ TopLevelNamespace "" [] ] -> Assert.Pass() + | [ TopLevelNamespace "" [] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") - [] + [] let ``Module above namespace`` () = let content = getContent @@ -153,5 +153,5 @@ module InvalidSyntax = """ match content with - | [ TopLevelNamespace "" [] ] -> Assert.Pass() + | [ TopLevelNamespace "" [] ] -> () | content -> Assert.Fail($"Unexpected content: {content}") diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs index f8a4c8d2d23..675294acf0c 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs @@ -2,9 +2,9 @@ open System.Threading open FSharp.Compiler.GraphChecking.GraphProcessing -open NUnit.Framework +open Xunit -[] +[] let ``When processing a node throws an exception, an exception is raised with the original exception included`` () = let graph = [1, [|2|]; 2, [||]] |> readOnlyDict let work (_processor : int -> ProcessedNode) (_node : NodeInfo) : string = failwith "Work exception" @@ -18,6 +18,6 @@ let ``When processing a node throws an exception, an exception is raised with th CancellationToken.None |> ignore ) - Assert.That(exn.Message, Is.EqualTo("Encountered exception when processing item '2'")) - Assert.That(exn.InnerException, Is.Not.Null) - Assert.That(exn.InnerException.Message, Is.EqualTo("Work exception")) + Assert.Equal(exn.Message, "Encountered exception when processing item '2'") + Assert.NotNull(exn.InnerException) + Assert.Equal(exn.InnerException.Message, "Work exception") diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/QueryTrieTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/QueryTrieTests.fs index 613d77a29ee..524535efa32 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/QueryTrieTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/QueryTrieTests.fs @@ -2,7 +2,7 @@ open System.Collections.Generic open System.Collections.Immutable -open NUnit.Framework +open Xunit open FSharp.Compiler.GraphChecking open FSharp.Compiler.GraphChecking.DependencyResolution @@ -757,24 +757,24 @@ let private fantomasCoreTrie: TrieNode = |] } -[] +[] let ``Query nonexistent node in trie`` () = let result = queryTrie fantomasCoreTrie [ "System"; "System"; "Runtime"; "CompilerServices" ] match result with - | QueryTrieNodeResult.NodeDoesNotExist -> Assert.Pass() + | QueryTrieNodeResult.NodeDoesNotExist -> () | result -> Assert.Fail $"Unexpected result: %A{result}" -[] +[] let ``Query node that does not expose data in trie`` () = let result = queryTrie fantomasCoreTrie [ "Fantomas"; "Core" ] match result with - | QueryTrieNodeResult.NodeDoesNotExposeData -> Assert.Pass() + | QueryTrieNodeResult.NodeDoesNotExposeData -> () | result -> Assert.Fail $"Unexpected result: %A{result}" -[] +[] let ``Query module node that exposes one file`` () = let result = queryTrie fantomasCoreTrie [ "Fantomas"; "Core"; "ISourceTextExtensions" ] @@ -782,10 +782,10 @@ let ``Query module node that exposes one file`` () = match result with | QueryTrieNodeResult.NodeExposesData file -> let file = Seq.exactlyOne file - Assert.AreEqual(indexOf "ISourceTextExtensions.fs", file) + Assert.Equal(indexOf "ISourceTextExtensions.fs", file) | result -> Assert.Fail $"Unexpected result: %A{result}" -[] +[] let ``ProcessOpenStatement full path match`` () = let state = FileContentQueryState.Create Set.empty @@ -794,4 +794,4 @@ let ``ProcessOpenStatement full path match`` () = processOpenPath fantomasCoreTrie [ "Fantomas"; "Core"; "AstExtensions" ] state let dep = Seq.exactlyOne result.FoundDependencies - Assert.AreEqual(indexOf "AstExtensions.fsi", dep) + Assert.Equal(indexOf "AstExtensions.fsi", dep) diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TrieMappingTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TrieMappingTests.fs index 6ad29818a2a..2a3d7b608ea 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TrieMappingTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TrieMappingTests.fs @@ -1,6 +1,6 @@ module TypeChecks.TrieMappingTests -open NUnit.Framework +open Xunit open FSharp.Compiler.GraphChecking open TestUtils @@ -8,7 +8,7 @@ let private noDependencies = Set.empty let private getLastTrie files = TrieMapping.mkTrie files |> Array.last |> snd -[] +[] let ``Basic trie`` () = let sampleFiles = [| @@ -49,22 +49,22 @@ type C = { CX: int; CY: int } | current -> Assert.Fail($"mkTrie should always return a TrieNodeInfo.Root, got {current}") let xNode = trie.Children.["X"] - Assert.AreEqual(1, xNode.Children.Count) + Assert.Equal(1, xNode.Children.Count) Assert.True(Seq.isEmpty xNode.Files) let yNode = xNode.Children["Y"] - Assert.AreEqual(2, yNode.Children.Count) - Assert.AreEqual(set [| 2 |], yNode.Files) + Assert.Equal(2, yNode.Children.Count) + Assert.Equal>(set [| 2 |], yNode.Files) let aNode = yNode.Children["A"] - Assert.AreEqual(0, aNode.Children.Count) - Assert.AreEqual(set [| 0 |], aNode.Files) + Assert.Equal(0, aNode.Children.Count) + Assert.Equal>(set [| 0 |], aNode.Files) let bNode = yNode.Children["B"] - Assert.AreEqual(0, bNode.Children.Count) - Assert.AreEqual(set [| 1 |], bNode.Files) + Assert.Equal(0, bNode.Children.Count) + Assert.Equal>(set [| 1 |], bNode.Files) -[] +[] let ``Toplevel AutoOpen module with prefixed namespace`` () = let trie = getLastTrie @@ -87,11 +87,11 @@ let a = 0 // Assert that both A and B expose file index 0 let aNode = trie.Children.["A"] - Assert.AreEqual(set [| 0 |], aNode.Files) + Assert.Equal>(set [| 0 |], aNode.Files) let bNode = aNode.Children.["B"] - Assert.AreEqual(set [| 0 |], bNode.Files) + Assert.Equal>(set [| 0 |], bNode.Files) -[] +[] let ``Toplevel AutoOpen module with multi prefixed namespace`` () = let trie = getLastTrie @@ -114,13 +114,13 @@ let a = 0 // Assert that B and C expose file index 0, namespace A should not. let aNode = trie.Children.["A"] - Assert.AreEqual(noDependencies, aNode.Files) + Assert.Equal>(noDependencies, aNode.Files) let bNode = aNode.Children.["B"] - Assert.AreEqual(set [| 0 |], bNode.Files) + Assert.Equal>(set [| 0 |], bNode.Files) let cNode = bNode.Children.["C"] - Assert.AreEqual(set [| 0 |], cNode.Files) + Assert.Equal>(set [| 0 |], cNode.Files) -[] +[] let ``Global namespace should link files to the root node`` () = let trie = getLastTrie @@ -159,9 +159,9 @@ type B = { Y : int } } |] - Assert.AreEqual(set [| 0; 1 |], trie.Files) + Assert.Equal>(set [| 0; 1 |], trie.Files) -[] +[] let ``Module with a single ident and AutoOpen attribute should link files to root`` () = let trie = getLastTrie @@ -202,10 +202,10 @@ type B = { Y : int } } |] - Assert.AreEqual(set [| 0; 1 |], trie.Files) - Assert.AreEqual(0, trie.Children.Count) + Assert.Equal>(set [| 0; 1 |], trie.Files) + Assert.Equal(0, trie.Children.Count) -[] +[] let ``Module with AutoOpen attribute and two ident should expose file at two levels`` () = let trie = getLastTrie @@ -226,13 +226,13 @@ type A = { A : int } } |] - Assert.AreEqual(noDependencies, trie.Files) + Assert.Equal>(noDependencies, trie.Files) let xNode = trie.Children.["X"] - Assert.AreEqual(set [| 0 |], xNode.Files) + Assert.Equal>(set [| 0 |], xNode.Files) let yNode = xNode.Children.["Y"] - Assert.AreEqual(set [| 0 |], yNode.Files) + Assert.Equal>(set [| 0 |], yNode.Files) -[] +[] let ``Module with AutoOpen attribute and three ident should expose file at last two levels`` () = let trie = getLastTrie @@ -253,15 +253,15 @@ type A = { A : int } } |] - Assert.AreEqual(noDependencies, trie.Files) + Assert.Equal>(noDependencies, trie.Files) let xNode = trie.Children.["X"] - Assert.AreEqual(noDependencies, xNode.Files) + Assert.Equal>(noDependencies, xNode.Files) let yNode = xNode.Children.["Y"] - Assert.AreEqual(set [| 0 |], yNode.Files) + Assert.Equal>(set [| 0 |], yNode.Files) let zNode = yNode.Children.["Z"] - Assert.AreEqual(set [| 0 |], zNode.Files) + Assert.Equal>(set [| 0 |], zNode.Files) -[] +[] let ``Nested AutoOpen module in namespace will expose the file to the namespace node`` () = let trie = getLastTrie @@ -284,15 +284,15 @@ module Z = } |] - Assert.AreEqual(noDependencies, trie.Files) + Assert.Equal>(noDependencies, trie.Files) let xNode = trie.Children.["X"] - Assert.AreEqual(noDependencies, xNode.Files) + Assert.Equal>(noDependencies, xNode.Files) let yNode = xNode.Children.["Y"] - Assert.AreEqual(set [| 0 |], yNode.Files) + Assert.Equal>(set [| 0 |], yNode.Files) let zNode = yNode.Children.["Z"] - Assert.AreEqual(set [| 0 |], zNode.Files) + Assert.Equal>(set [| 0 |], zNode.Files) -[] +[] let ``Two modules with the same name, only the first file exposes the index`` () = let trie = getLastTrie @@ -325,11 +325,11 @@ let _ = () } |] - Assert.AreEqual(1, trie.Children.Count) + Assert.Equal(1, trie.Children.Count) let aNode = trie.Children.["A"] - Assert.AreEqual(set [| 0 |], aNode.Files) + Assert.Equal>(set [| 0 |], aNode.Files) -[] +[] let ``Two nested modules with the same name, in named namespace`` () = let trie = getLastTrie @@ -352,11 +352,11 @@ module ``module`` = } |] - Assert.AreEqual(1, trie.Children.Count) + Assert.Equal(1, trie.Children.Count) let node = trie.Children.["N"] - Assert.AreEqual(1, node.Children.Count) + Assert.Equal(1, node.Children.Count) -[] +[] let ``Two nested modules with the same name, in namespace global`` () = let trie = getLastTrie @@ -380,9 +380,9 @@ module ``module`` = |] // namespace global leads to a Root entry, no further processing will be done. - Assert.AreEqual(set [| 0 |], trie.Files) + Assert.Equal>(set [| 0 |], trie.Files) -[] +[] let ``Two nested modules with the same name, in anonymous module`` () = let trie = getLastTrie @@ -403,10 +403,10 @@ module ``module`` = } |] - Assert.AreEqual(1, trie.Children.Count) + Assert.Equal(1, trie.Children.Count) Assert.True(trie.Children.ContainsKey("module")) -[] +[] let ``Two nested modules with the same name, in nested module`` () = let trie = getLastTrie @@ -432,10 +432,10 @@ module B = |] let bNode = trie.Children["A"].Children["B"] - Assert.AreEqual(1, bNode.Children.Count) + Assert.Equal(1, bNode.Children.Count) Assert.True(bNode.Children.ContainsKey("module")) -[] +[] let ``Two nested modules with the same name, in nested module in signature file`` () = let trie = getLastTrie @@ -459,10 +459,10 @@ module B = |] let bNode = trie.Children["A"].Children["B"] - Assert.AreEqual(1, bNode.Children.Count) + Assert.Equal(1, bNode.Children.Count) Assert.True(bNode.Children.ContainsKey("module")) -[] +[] let ``Two namespaces with the same name in the same implementation file`` () = let trie = getLastTrie @@ -486,9 +486,9 @@ module C = begin end |] let aNode = trie.Children["A"] - Assert.AreEqual(2, aNode.Children.Count) + Assert.Equal(2, aNode.Children.Count) -[] +[] let ``Two namespaces with the same name in the same signature file`` () = let trie = getLastTrie @@ -512,9 +512,9 @@ module C = begin end |] let aNode = trie.Children["A"] - Assert.AreEqual(2, aNode.Children.Count) + Assert.Equal(2, aNode.Children.Count) -[] +[] let ``Tries are built up incrementally`` () = let trie = TrieMapping.mkTrie @@ -542,12 +542,12 @@ let ``Tries are built up incrementally`` () = |] for idx, t in trie do - Assert.AreEqual(idx + 1, t.Children.Count) + Assert.Equal(idx + 1, t.Children.Count) module InvalidSyntax = - [] + [] let ``Unnamed module`` () = let trie = getLastTrie diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TypedTreeGraph.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TypedTreeGraph.fs index c4680870efc..dc89f4f9a4c 100644 --- a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TypedTreeGraph.fs +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/TypedTreeGraph.fs @@ -7,7 +7,7 @@ open System.IO open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Text open FSharp.Compiler.Symbols -open NUnit.Framework +open Xunit open FSharp.Compiler.GraphChecking open TypeChecks.TestUtils @@ -100,8 +100,8 @@ let graphFromTypedTree (checker: FSharpChecker) (projectOptions: FSharpProjectOp return files, graph } -[] -[] +[] +[] let ``Create Graph from typed tree`` (projectArgumentsFilePath: string) = let previousDir = Environment.CurrentDirectory @@ -181,7 +181,7 @@ let ``Create Graph from typed tree`` (projectArgumentsFilePath: string) = let isSuperSet = Set.isSuperset depsFromHeuristic depsFromTypedTree let delta = Set.difference depsFromTypedTree depsFromHeuristic - Assert.IsTrue( + Assert.True( isSuperSet, $"""{relativePath fileName} did not contain a superset of the typed tree dependencies: {source} is missing dependencies: %A{depNames delta}.""" diff --git a/tests/FSharp.Compiler.Service.Tests/AssemblyReaderShim.fs b/tests/FSharp.Compiler.Service.Tests/AssemblyReaderShim.fs index a38210a6fe4..ebe2c3dd61d 100644 --- a/tests/FSharp.Compiler.Service.Tests/AssemblyReaderShim.fs +++ b/tests/FSharp.Compiler.Service.Tests/AssemblyReaderShim.fs @@ -23,4 +23,4 @@ let x = 123 let fileName, options = mkTestFileAndOptions source [| |] checker.ParseAndCheckFileInProject(fileName, 0, SourceText.ofString source, options) |> Async.RunImmediate |> ignore - gotRequest |> should be True + gotRequest |> Assert.True diff --git a/tests/FSharp.Compiler.Service.Tests/CSharpProjectAnalysis.fs b/tests/FSharp.Compiler.Service.Tests/CSharpProjectAnalysis.fs index a2f4c122591..aa4cc9af679 100644 --- a/tests/FSharp.Compiler.Service.Tests/CSharpProjectAnalysis.fs +++ b/tests/FSharp.Compiler.Service.Tests/CSharpProjectAnalysis.fs @@ -144,8 +144,8 @@ let _ = CSharpClass(0) match (ctor :?> FSharpMemberOrFunctionOrValue).DeclaringEntity with | Some e -> let members = e.MembersFunctionsAndValues - Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsConstructor) members |> should be True - Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsEffectivelySameAs ctor) members |> should be True + Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsConstructor) members |> Assert.True + Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsEffectivelySameAs ctor) members |> Assert.True | None -> failwith "Expected Some for DeclaringEntity" let getEntitiesUses source = @@ -172,7 +172,7 @@ let (s2: FSharp.Compiler.Service.Tests.String) = null |> List.filter (fun entity -> entity.LogicalName = "String") match stringSymbols with - | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False + | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> Assert.False | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith [] @@ -189,5 +189,5 @@ open FSharp.Compiler.Service.Tests.Linq |> List.filter (fun entity -> entity.LogicalName = "Linq") match stringSymbols with - | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False + | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> Assert.False | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith diff --git a/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs b/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs index 237c49d5794..92ca4a07091 100644 --- a/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs @@ -5813,7 +5813,7 @@ let ``References from #r nuget are included in script project options`` () = |> Seq.choose (fun f -> f.FileName |> Option.map Path.GetFileName) |> Seq.distinct printfn "%s" (assemblyNames |> String.concat "\n") - assemblyNames |> should contain "Dapper.dll" + Assert.Contains("Dapper.dll", assemblyNames) module internal EmptyProject = let base2 = getTemporaryFileName () diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/IntConversionsTestGenerator.fsx b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/IntConversionsTestGenerator.fsx index d30d3bb324e..42f7bf98b6d 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/IntConversionsTestGenerator.fsx +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/IntConversionsTestGenerator.fsx @@ -45,7 +45,7 @@ do // This file is automatically generated by IntConversionsTestGenerator.fsx namespace FSharp.Core.UnitTests open System -open NUnit.Framework +open XUnit open FSharp.Core.UnitTests.LibraryTestFx module UInt8 = @@ -56,7 +56,6 @@ module Int8 = let MinValue = SByte.MinValue let MaxValue = SByte.MaxValue -[] type IntConversionsGenerated() = " @@ -70,7 +69,7 @@ type IntConversionsGenerated() = // -1 converted to unsigned types. Should become MaxValues let signedToUnsignedGenerator target = signedInts |> List.iter (fun source-> - prn "[]" + prn "[]" prn "member this.``%s.m1.To.%s`` () =" source.alias target.alias shift () prn "let i : %s = -1%s" source.alias source.suffix @@ -82,7 +81,7 @@ type IntConversionsGenerated() = // -1 converted to signed types. Should stay -1. let signedToSignedGenerator target = signedInts |> List.iter (fun source-> - prn "[]" + prn "[]" prn "member this.``%s.m1.To.%s`` () =" source.alias target.alias shift () prn "let minus1 : %s = -1%s" target.alias target.suffix @@ -96,7 +95,7 @@ type IntConversionsGenerated() = let unsignedToWiderGenerator target = unsignedInts |> List.filter (fun source -> source.width < target.width) |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "let sourceMaxValue : %s = %s%s" target.alias (maxValueAsHexLiteral source) target.suffix @@ -109,7 +108,7 @@ type IntConversionsGenerated() = let unsignedToNarrowerSignedGenerator target = unsignedInts |> List.filter (fun source -> source.width >= target.width) |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "Assert.AreEqual (-1%s, %s %s.MaxValue)" target.suffix target.alias source.name @@ -121,7 +120,7 @@ type IntConversionsGenerated() = let unsignedToNarrowerUnsignedGenerator target = unsignedInts |> List.filter (fun source -> source.width >= target.width) |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "Assert.AreEqual (%s.MaxValue, %s %s.MaxValue)" target.name target.alias source.name @@ -131,7 +130,7 @@ type IntConversionsGenerated() = // -1 to signed nativeint stays -1 signedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.m1.To.nativeint`` () =" source.alias shift () prn "Assert.AreEqual (-1n, nativeint -1%s)" source.suffix @@ -140,7 +139,7 @@ type IntConversionsGenerated() = // unsigned MaxValues to signed nativeint stay same for narrower types, become -1 for wider types unsignedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.MaxValue.To.nativeint`` () =" source.alias shift () prn "if sizeof > sizeof<%s> then" source.alias @@ -162,7 +161,7 @@ type IntConversionsGenerated() = // -1 to unsigned nativeint should become MaxValue signedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.m1.To.unativeint`` () =" source.alias shift () prn "Assert.AreEqual (this.UnativeintMaxValue, unativeint -1%s)" source.suffix @@ -171,7 +170,7 @@ type IntConversionsGenerated() = // unsigned MaxValues to unsigned nativeint stay same for narrower types, become MaxValue for wider types unsignedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``%s.m1.To.unativeint`` () =" source.alias shift () prn "if sizeof > sizeof<%s> then" source.alias @@ -188,7 +187,7 @@ type IntConversionsGenerated() = // -1 converted to unsigned types. Should throw let checkedSignedToUnsignedGenerator target = signedInts |> List.iter (fun source-> - prn "[]" + prn "[]" prn "member this.``Checked.%s.m1.To.%s`` () =" source.alias target.alias shift () prn "let i : %s = -1%s" source.alias source.suffix @@ -200,7 +199,7 @@ type IntConversionsGenerated() = // -1 converted to signed types. Should stay -1. let signedToSignedGenerator target = signedInts |> List.iter (fun source-> - prn "[]" + prn "[]" prn "member this.``Checked.%s.m1.To.%s`` () =" source.alias target.alias shift () prn "let minus1 : %s = -1%s" target.alias target.suffix @@ -214,7 +213,7 @@ type IntConversionsGenerated() = let checkedUnsignedToWiderGenerator target = unsignedInts |> List.filter (fun source -> source.width < target.width) |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "let sourceMaxValue : %s = %s%s" target.alias (maxValueAsHexLiteral source) target.suffix @@ -227,7 +226,7 @@ type IntConversionsGenerated() = let checkedUnsignedToNarrowerSignedGenerator target = unsignedInts |> List.filter (fun source -> source.width >= target.width && target.alias <> "int8") |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "CheckThrowsExn (fun () -> Checked.%s %s.MaxValue |> ignore)" target.alias source.name @@ -239,7 +238,7 @@ type IntConversionsGenerated() = let checkedUnsignedToNarrowerUnsignedGenerator target = unsignedInts |> List.filter (fun source -> source.width > target.width) |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.MaxValue.To.%s`` () =" source.alias target.alias shift () prn "CheckThrowsExn (fun () -> Checked.%s %s.MaxValue |> ignore)" target.alias source.name @@ -249,7 +248,7 @@ type IntConversionsGenerated() = // -1 to signed nativeint stays -1 signedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.m1.To.nativeint`` () =" source.alias shift () prn "Assert.AreEqual (-1n, Checked.nativeint -1%s)" source.suffix @@ -258,7 +257,7 @@ type IntConversionsGenerated() = // unsigned MaxValues to signed nativeint stay same for narrower types, throw for wider types unsignedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.MaxValue.To.nativeint`` () =" source.alias shift () prn "if sizeof > sizeof<%s> then" source.alias @@ -272,7 +271,7 @@ type IntConversionsGenerated() = // -1 to unsigned nativeint should throw signedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.m1.To.unativeint`` () =" source.alias shift () prn "CheckThrowsExn (fun () -> Checked.unativeint -1%s |> ignore)" source.suffix @@ -281,7 +280,7 @@ type IntConversionsGenerated() = // unsigned MaxValues to unsigned nativeint stay same for narrower types, throw for wider types unsignedInts |> List.iter (fun source -> - prn "[]" + prn "[]" prn "member this.``Checked.%s.MaxValue.To.unativeint`` () =" source.alias shift () prn "if sizeof >= sizeof<%s> then" source.alias diff --git a/tests/FSharp.Test.Utilities/Compiler.fs b/tests/FSharp.Test.Utilities/Compiler.fs index 19c3793d64e..f535bc21c5a 100644 --- a/tests/FSharp.Test.Utilities/Compiler.fs +++ b/tests/FSharp.Test.Utilities/Compiler.fs @@ -12,7 +12,7 @@ open FSharp.Test.Utilities open FSharp.Test.ScriptHelpers open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.CSharp -open NUnit.Framework +open Xunit open System open System.Collections.Immutable open System.IO @@ -1129,7 +1129,7 @@ Actual: fOnFail() updateBaseLineIfEnvironmentSaysSo baseline createBaselineErrors baseline actual - Assert.AreEqual(expected, actual, convenienceBaselineInstructions baseline expected actual) + Assert.True((expected = actual), convenienceBaselineInstructions baseline expected actual) elif FileSystem.FileExistsShim baseline.FilePath then FileSystem.FileDeleteShim baseline.FilePath @@ -1162,7 +1162,7 @@ Actual: createBaselineErrors bsl.FSBaseline errorsActual updateBaseLineIfEnvironmentSaysSo bsl.FSBaseline let errorMsg = (convenienceBaselineInstructions bsl.FSBaseline errorsExpectedBaseLine errorsActual) - Assert.AreEqual(errorsExpectedBaseLine, errorsActual, errorMsg) + Assert.True((errorsExpectedBaseLine = errorsActual), errorMsg) elif FileSystem.FileExistsShim(bsl.FSBaseline.FilePath) then FileSystem.FileDeleteShim(bsl.FSBaseline.FilePath) @@ -1494,7 +1494,7 @@ Actual: let inline checkEqual k a b = if a <> b then - Assert.AreEqual(a, b, $"%s{what}: Mismatch in %s{k}, expected '%A{a}', got '%A{b}'.\nAll errors:\n%s{sourceErrorsAsStr}\nExpected errors:\n%s{expectedErrorsAsStr}") + failwith $"%s{what}: Mismatch in %s{k}, expected '%A{a}', got '%A{b}'.\nAll errors:\n%s{sourceErrorsAsStr}\nExpected errors:\n%s{expectedErrorsAsStr}" // For lists longer than 100 errors: expectedErrors |> List.iter System.Diagnostics.Debug.WriteLine @@ -1504,8 +1504,7 @@ Actual: (sourceErrors, expectedErrors) ||> List.iter2 (fun actual expected -> - - Assert.AreEqual(expected, actual, $"Mismatched error message:\nExpecting: {expected}\nActual: {actual}\n")) + Assert.Equal(expected, actual)) let adjust (adjust: int) (result: CompilationResult) : CompilationResult = match result with @@ -1624,7 +1623,7 @@ Actual: match Assert.shouldBeSameMultilineStringSets expectedContent actualErrors with | None -> () - | Some diff -> Assert.That(diff, Is.Empty, path) + | Some diff -> Assert.True(String.IsNullOrEmpty(diff), path) result @@ -1707,7 +1706,7 @@ Actual: | None -> failwith "Execution output is missing, cannot check exit code." | Some o -> match o with - | ExecutionOutput e -> Assert.AreEqual(e.ExitCode, expectedExitCode, sprintf "Exit code was expected to be: %A, but got %A." expectedExitCode e.ExitCode) + | ExecutionOutput e -> Assert.Equal(expectedExitCode, e.ExitCode) | _ -> failwith "Cannot check exit code on this run result." result @@ -1744,7 +1743,7 @@ Actual: let private assertEvalOutput (selector: FsiValue -> 'T) (value: 'T) (result: CompilationResult) : CompilationResult = match result.RunOutput with | None -> failwith "Execution output is missing cannot check value." - | Some (EvalOutput (Ok (Some e))) -> Assert.AreEqual(value, (selector e)) + | Some (EvalOutput (Ok (Some e))) -> Assert.Equal<'T>(value, (selector e)) | Some (EvalOutput (Ok None )) -> failwith "Cannot assert value of evaluation, since it is None." | Some (EvalOutput (Result.Error ex)) -> raise ex | Some _ -> failwith "Only 'eval' output is supported." diff --git a/tests/FSharp.Test.Utilities/CompilerAssert.fs b/tests/FSharp.Test.Utilities/CompilerAssert.fs index 0713d5fa8d2..fc2875d8955 100644 --- a/tests/FSharp.Test.Utilities/CompilerAssert.fs +++ b/tests/FSharp.Test.Utilities/CompilerAssert.fs @@ -21,7 +21,7 @@ open System.Runtime.Loader open FSharp.Test.Utilities open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.CSharp -open NUnit.Framework +open Xunit open TestFramework open System.Collections.Immutable @@ -149,12 +149,12 @@ type TestCompilation = let diagnostics = c.GetDiagnostics () if not diagnostics.IsEmpty then - NUnit.Framework.Assert.Fail ("CSharp source diagnostics:\n" + (diagnostics |> Seq.map (fun x -> x.GetMessage () + "\n") |> Seq.reduce (+))) + Assert.Fail ("CSharp source diagnostics:\n" + (diagnostics |> Seq.map (fun x -> x.GetMessage () + "\n") |> Seq.reduce (+))) | TestCompilation.IL (_, result) -> let errors, _ = result.Value if errors.Length > 0 then - NUnit.Framework.Assert.Fail ("IL source errors: " + errors) + Assert.Fail ("IL source errors: " + errors) member this.EmitAsFile (outputPath: string) = match this with @@ -484,7 +484,7 @@ module rec CompilerAssertHelpers = let checkEqual k a b = if a <> b then - Assert.AreEqual(a, b, sprintf $"Mismatch in %s{k}, expected '%A{a}', got '%A{b}'.\nAll errors:\n%s{errorsAsStr}") + failwithf $"Mismatch in %s{k}, expected '%A{a}', got '%A{b}'.\nAll errors:\n%s{errorsAsStr}" checkEqual "Errors" (Array.length expectedErrors) errors.Length @@ -771,18 +771,18 @@ Updated automatically, please check diffs in your pull request, changes must be exn |> Option.iter raise) static member ExecutionHasOutput(cmpl: Compilation, expectedOutput: string) = - CompilerAssert.Execute(cmpl, newProcess = true, onOutput = (fun output -> Assert.AreEqual(expectedOutput, output, sprintf "'%s' = '%s'" expectedOutput output))) + CompilerAssert.Execute(cmpl, newProcess = true, onOutput = (fun output -> Assert.Equal(expectedOutput, output))) static member Pass (source: string) = let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, defaultProjectOptions TargetFramework.Current) |> Async.RunImmediate - Assert.IsEmpty(parseResults.Diagnostics, sprintf "Parse errors: %A" parseResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) match fileAnswer with | FSharpCheckFileAnswer.Aborted -> Assert.Fail("Type Checker Aborted") | FSharpCheckFileAnswer.Succeeded(typeCheckResults) -> - Assert.IsEmpty(typeCheckResults.Diagnostics, sprintf "Type Check errors: %A" typeCheckResults.Diagnostics) + Assert.Empty(typeCheckResults.Diagnostics) static member PassWithOptions options (source: string) = let defaultOptions = defaultProjectOptions TargetFramework.Current @@ -790,13 +790,13 @@ Updated automatically, please check diffs in your pull request, changes must be let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, options) |> Async.RunImmediate - Assert.IsEmpty(parseResults.Diagnostics, sprintf "Parse errors: %A" parseResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) match fileAnswer with | FSharpCheckFileAnswer.Aborted -> Assert.Fail("Type Checker Aborted") | FSharpCheckFileAnswer.Succeeded(typeCheckResults) -> - Assert.IsEmpty(typeCheckResults.Diagnostics, sprintf "Type Check errors: %A" typeCheckResults.Diagnostics) + Assert.Empty(typeCheckResults.Diagnostics) static member TypeCheckWithErrorsAndOptionsAgainstBaseLine options (sourceDirectory:string) (sourceFile: string) = let absoluteSourceFile = System.IO.Path.Combine(sourceDirectory, sourceFile) @@ -809,7 +809,7 @@ Updated automatically, please check diffs in your pull request, changes must be { defaultOptions with OtherOptions = Array.append options defaultOptions.OtherOptions; SourceFiles = [|sourceFile|] }) |> Async.RunImmediate - Assert.IsEmpty(parseResults.Diagnostics, sprintf "Parse errors: %A" parseResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) match fileAnswer with | FSharpCheckFileAnswer.Aborted -> Assert.Fail("Type Checker Aborted") @@ -827,7 +827,7 @@ Updated automatically, please check diffs in your pull request, changes must be |> String.concat "\n" File.WriteAllText(Path.ChangeExtension(absoluteSourceFile,"err"), errorsActual) - Assert.AreEqual(errorsExpectedBaseLine.Replace("\r\n","\n"), errorsActual.Replace("\r\n","\n")) + Assert.Equal(errorsExpectedBaseLine.Replace("\r\n","\n"), errorsActual.Replace("\r\n","\n")) static member TypeCheckWithOptionsAndName options name (source: string) = let errors = @@ -895,7 +895,7 @@ Updated automatically, please check diffs in your pull request, changes must be static member TypeCheck(options, name, source: string) = let parseResults, checkResults = CompilerAssert.ParseAndTypeCheck(options, name, source) - Assert.IsEmpty(parseResults.Diagnostics, sprintf "Parse errors: %A" parseResults.Diagnostics) + Assert.Empty(parseResults.Diagnostics) checkResults @@ -1044,7 +1044,7 @@ Updated automatically, please check diffs in your pull request, changes must be else (expectedErrorMessages, errorMessages) ||> Seq.iter2 (fun expectedErrorMessage errorMessage -> - Assert.AreEqual(expectedErrorMessage, errorMessage) + Assert.Equal(expectedErrorMessage, errorMessage) ) static member RunScript source expectedErrorMessages = @@ -1069,13 +1069,13 @@ Updated automatically, please check diffs in your pull request, changes must be |> Array.distinctBy (fun e -> e.Severity, e.ErrorNumber, e.StartLine, e.StartColumn, e.EndLine, e.EndColumn, e.Message) printfn $"diagnostics: %A{[| for e in errors -> e.Severity, e.ErrorNumber, e.StartLine, e.StartColumn, e.EndLine, e.EndColumn, e.Message |]}" - Assert.AreEqual(Array.length expectedParseErrors, errors.Length, sprintf "Parse errors: %A" parseResults.Diagnostics) + Assert.True((Array.length expectedParseErrors = errors.Length), sprintf "Parse errors: %A" parseResults.Diagnostics) Array.zip errors expectedParseErrors |> Array.iter (fun (info, expectedError) -> let (expectedSeverity: FSharpDiagnosticSeverity, expectedErrorNumber: int, expectedErrorRange: int * int * int * int, expectedErrorMsg: string) = expectedError - Assert.AreEqual(expectedSeverity, info.Severity) - Assert.AreEqual(expectedErrorNumber, info.ErrorNumber, "expectedErrorNumber") - Assert.AreEqual(expectedErrorRange, (info.StartLine, info.StartColumn + 1, info.EndLine, info.EndColumn + 1), "expectedErrorRange") - Assert.AreEqual(expectedErrorMsg, info.Message, "expectedErrorMsg") + Assert.Equal(expectedSeverity, info.Severity) + Assert.Equal(expectedErrorNumber, info.ErrorNumber) + Assert.Equal(expectedErrorRange, (info.StartLine, info.StartColumn + 1, info.EndLine, info.EndColumn + 1)) + Assert.Equal(expectedErrorMsg, info.Message) ) diff --git a/tests/FSharp.Test.Utilities/FSharp.Test.Utilities.fsproj b/tests/FSharp.Test.Utilities/FSharp.Test.Utilities.fsproj index 3700eda8514..7ccc5306751 100644 --- a/tests/FSharp.Test.Utilities/FSharp.Test.Utilities.fsproj +++ b/tests/FSharp.Test.Utilities/FSharp.Test.Utilities.fsproj @@ -62,7 +62,6 @@ - diff --git a/tests/FSharp.Test.Utilities/ILChecker.fs b/tests/FSharp.Test.Utilities/ILChecker.fs index 15579833bcd..4474ef01c10 100644 --- a/tests/FSharp.Test.Utilities/ILChecker.fs +++ b/tests/FSharp.Test.Utilities/ILChecker.fs @@ -6,7 +6,7 @@ open System open System.IO open System.Text.RegularExpressions -open NUnit.Framework +open Xunit open TestFramework [] diff --git a/tests/README.md b/tests/README.md index 8f36be0195a..40c9a35b177 100644 --- a/tests/README.md +++ b/tests/README.md @@ -19,7 +19,7 @@ ## Framework for testing -The following test frameworks and libraries will be used for new test projects **[xUnit Test Framework](https://xunit.net/), [FluentAssertions](https://fluentassertions.com/) (+ [FsUnit](https://fsprojects.github.io/FsUnit/) and [FsCheck](https://github.com/fscheck/FsCheck) when needed)**. All existing NUnit test suites will be migrated to xUnit. +The following test frameworks and libraries will be used for new test projects **[xUnit Test Framework](https://xunit.net/), [FluentAssertions](https://fluentassertions.com/) (+ [FsUnit](https://fsprojects.github.io/FsUnit/) and [FsCheck](https://github.com/fscheck/FsCheck) when needed)**. **Justification:** @@ -93,7 +93,6 @@ Existing FSharpQA and Cambridge need to be migrated to corresponding test projec ## Next steps -* [**In Progress**] Migrate existing `NUnit` tests to xUnit. * Clean up CompilerAssert. * Make PEVerify tests work in netcore/non-windows environment. * Start migration of existing (namely, FSharpQA and Cambridge) suites to xUnit-based projects. diff --git a/tests/fsharp/Libraries/Async/AsyncTests.fs b/tests/fsharp/Compiler/Libraries/Core/Async/AsyncTests.fs similarity index 88% rename from tests/fsharp/Libraries/Async/AsyncTests.fs rename to tests/fsharp/Compiler/Libraries/Core/Async/AsyncTests.fs index 04a82a97160..708e7e58e2e 100644 --- a/tests/fsharp/Libraries/Async/AsyncTests.fs +++ b/tests/fsharp/Compiler/Libraries/Core/Async/AsyncTests.fs @@ -1,14 +1,14 @@ -namespace FSharp.Libraries.UnitTests +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -open System -open NUnit.Framework -open FSharp.Compiler.UnitTests +namespace FSharp.Compiler.UnitTests + +open Xunit +open FSharp.Test -[] module AsyncTests = // Regression for FSHARP1.0:5969 // Async.StartChild: error when wait async is executed more than once - [] + [] let ``Execute Async multiple times``() = CompilerAssert.CompileExeAndRun """ @@ -30,7 +30,7 @@ exit 0 // Regression for FSHARP1.0:5970 // Async.StartChild: race in implementation of ResultCell in FSharp.Core - [] + [] let ``Joining StartChild``() = CompilerAssert.CompileExeAndRun """ @@ -59,7 +59,7 @@ exit 0 """ // Regression test for FSHARP1.0:6086 - [] + [] let ``Mailbox Async dot not StackOverflow``() = CompilerAssert.CompileExeAndRun """ @@ -132,7 +132,8 @@ exit 0 """ // Regression for FSHARP1.0:5971 - [] + + [] let ``StartChild do not throw ObjectDisposedException``() = CompilerAssert.CompileExeAndRun """ @@ -144,8 +145,7 @@ printfn "%A" (b |> Async.RunSynchronously |> Async.RunSynchronously) exit 0 """ - - [] + [] let ``StartChild test Trampoline HijackLimit``() = CompilerAssert.CompileExeAndRun """ diff --git a/tests/fsharp/FSharpSuite.Tests.fsproj b/tests/fsharp/FSharpSuite.Tests.fsproj index 5bd5feda50a..36f26235ac1 100644 --- a/tests/fsharp/FSharpSuite.Tests.fsproj +++ b/tests/fsharp/FSharpSuite.Tests.fsproj @@ -76,6 +76,7 @@ + diff --git a/tests/fsharp/TypeProviderTests.fs b/tests/fsharp/TypeProviderTests.fs index 04b82f1c818..ba3d43037e6 100644 --- a/tests/fsharp/TypeProviderTests.fs +++ b/tests/fsharp/TypeProviderTests.fs @@ -2,7 +2,7 @@ #if INTERACTIVE //#r @"../../release/net40/bin/FSharp.Compiler.dll" -#r @"../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" +#r @"../../packages/xunit.assert/2.9.0/lib/net6.0/xunit.assert.dll" #load "../../src/scripts/scriptlib.fsx" #load "../FSharp.Test.Utilities/TestFramework.fs" #load "single-test.fs" diff --git a/tests/fsharp/nunitConf.fs b/tests/fsharp/nunitConf.fs deleted file mode 100644 index 1397b3ed778..00000000000 --- a/tests/fsharp/nunitConf.fs +++ /dev/null @@ -1,240 +0,0 @@ -module NUnitConf - -open System -open System.IO -open NUnit.Framework - -open TestConfig -open PlatformHelpers -open FSharpTestSuiteTypes - -let checkResult result = - match result with - | CmdResult.ErrorLevel (msg1, err) -> Assert.Fail (sprintf "%s. ERRORLEVEL %d" msg1 err) - | CmdResult.Success -> () - -let checkErrorLevel1 result = - match result with - | CmdResult.ErrorLevel (_,1) -> () - | CmdResult.Success | CmdResult.ErrorLevel _ -> Assert.Fail (sprintf "Command passed unexpectedly") - -let envVars () = - System.Environment.GetEnvironmentVariables () - |> Seq.cast - |> Seq.map (fun d -> d.Key :?> string, d.Value :?> string) - |> Map.ofSeq - -let initializeSuite () = - -#if DEBUG - let configurationName = "debug" -#else - let configurationName = "release" -#endif - let env = envVars () - - let cfg = - let c = config configurationName env - let usedEnvVars = c.EnvironmentVariables |> Map.add "FSC" c.FSC - { c with EnvironmentVariables = usedEnvVars } - - logConfig cfg - - cfg - - -let suiteHelpers = lazy (initializeSuite ()) - -[] -type public InitializeSuiteAttribute () = - inherit TestActionAttribute() - - override x.BeforeTest details = - if details.IsSuite - then suiteHelpers.Force() |> ignore - - override x.AfterTest _details = - () - - override x.Targets = ActionTargets.Test ||| ActionTargets.Suite - - -[] -[] -() - -let fsharpSuiteDirectory = __SOURCE_DIRECTORY__ - -let testConfig testDir = - let cfg = suiteHelpers.Value - let dir = Path.GetFullPath(fsharpSuiteDirectory/testDir) - log "------------------ %s ---------------" dir - log "cd %s" dir - { cfg with Directory = dir} - -[] -type FileGuard(path: string) = - let remove path = if File.Exists(path) then Commands.rm (Path.GetTempPath()) path - do if not (Path.IsPathRooted(path)) then failwithf "path '%s' must be absolute" path - do remove path - member x.Path = path - member x.Exists = x.Path |> File.Exists - member x.CheckExists() = - if not x.Exists then - failwith (sprintf "exit code 0 but %s file doesn't exists" (x.Path |> Path.GetFileName)) - - interface IDisposable with - member x.Dispose () = remove path - - -type RedirectToType = - | Overwrite of FilePath - | Append of FilePath - -type RedirectTo = - | Inherit - | Output of RedirectToType - | OutputAndError of RedirectToType * RedirectToType - | OutputAndErrorToSameFile of RedirectToType - | Error of RedirectToType - -type RedirectFrom = - | RedirectInput of FilePath - -type RedirectInfo = - { Output : RedirectTo - Input : RedirectFrom option } - - -module Command = - - let logExec _dir path args redirect = - let inF = - function - | None -> "" - | Some(RedirectInput l) -> sprintf " <%s" l - let redirectType = function Overwrite x -> sprintf ">%s" x | Append x -> sprintf ">>%s" x - let outF = - function - | Inherit -> "" - | Output r-> sprintf " 1%s" (redirectType r) - | OutputAndError (r1, r2) -> sprintf " 1%s 2%s" (redirectType r1) (redirectType r2) - | OutputAndErrorToSameFile r -> sprintf " 1%s 2>1" (redirectType r) - | Error r -> sprintf " 2%s" (redirectType r) - sprintf "%s%s%s%s" path (match args with "" -> "" | x -> " " + x) (inF redirect.Input) (outF redirect.Output) - - let exec dir envVars redirect path args = - let { Output = o; Input = i} = redirect - - let inputWriter sources (writer: StreamWriter) = - let pipeFile name = async { - let path = Commands.getfullpath dir name - use reader = File.OpenRead (path) - use ms = new MemoryStream() - do! reader.CopyToAsync (ms) |> (Async.AwaitIAsyncResult >> Async.Ignore) - ms.Position <- 0L - try - do! ms.CopyToAsync(writer.BaseStream) |> (Async.AwaitIAsyncResult >> Async.Ignore) - do! writer.FlushAsync() |> (Async.AwaitIAsyncResult >> Async.Ignore) - with - | :? System.IO.IOException -> //input closed is ok if process is closed - () - } - sources |> pipeFile |> Async.RunSynchronously - - let inF fCont cmdArgs = - match i with - | None -> fCont cmdArgs - | Some(RedirectInput l) -> fCont { cmdArgs with RedirectInput = Some (inputWriter l) } - - let openWrite rt = - let fullpath = Commands.getfullpath dir - match rt with - | Append p -> File.AppendText( p |> fullpath) - | Overwrite p -> new StreamWriter(new FileStream(p |> fullpath, FileMode.Create)) - - let outF fCont cmdArgs = - match o with - | RedirectTo.Inherit -> - use toLog = redirectToLog () - fCont { cmdArgs with RedirectOutput = Some (toLog.Post); RedirectError = Some (toLog.Post) } - | Output r -> - use writer = openWrite r - use outFile = redirectTo writer - use toLog = redirectToLog () - fCont { cmdArgs with RedirectOutput = Some (outFile.Post); RedirectError = Some (toLog.Post) } - | OutputAndError (r1,r2) -> - use writer1 = openWrite r1 - use writer2 = openWrite r2 - use outFile1 = redirectTo writer1 - use outFile2 = redirectTo writer2 - fCont { cmdArgs with RedirectOutput = Some (outFile1.Post); RedirectError = Some (outFile2.Post) } - | OutputAndErrorToSameFile r -> - use writer = openWrite r - use outFile = redirectTo writer - fCont { cmdArgs with RedirectOutput = Some (outFile.Post); RedirectError = Some (outFile.Post) } - | Error r -> - use writer = openWrite r - use outFile = redirectTo writer - use toLog = redirectToLog () - fCont { cmdArgs with RedirectOutput = Some (toLog.Post); RedirectError = Some (outFile.Post) } - - let exec cmdArgs = - log "%s" (logExec dir path args redirect) - Process.exec cmdArgs dir envVars path args - - { RedirectOutput = None; RedirectError = None; RedirectInput = None } - |> (outF (inF exec)) - -let alwaysSuccess _ = () - -let execArgs = { Output = Inherit; Input = None; } -let execAppend cfg stdoutPath stderrPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = OutputAndError(Append(stdoutPath), Append(stderrPath)) } p >> checkResult -let execAppendIgnoreExitCode cfg stdoutPath stderrPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = OutputAndError(Append(stdoutPath), Append(stderrPath)) } p >> alwaysSuccess -let exec cfg p = Command.exec cfg.Directory cfg.EnvironmentVariables execArgs p >> checkResult -let execExpectFail cfg p = Command.exec cfg.Directory cfg.EnvironmentVariables execArgs p >> checkErrorLevel1 -let execIn cfg workDir p = Command.exec workDir cfg.EnvironmentVariables execArgs p >> checkResult -let execBothToOut cfg workDir outFile p = Command.exec workDir cfg.EnvironmentVariables { execArgs with Output = OutputAndErrorToSameFile(Overwrite(outFile)) } p >> checkResult -let execAppendOutIgnoreExitCode cfg workDir outFile p = Command.exec workDir cfg.EnvironmentVariables { execArgs with Output = Output(Append(outFile)) } p >> alwaysSuccess -let execAppendErrExpectFail cfg errPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = Error(Overwrite(errPath)) } p -let execStdin cfg l p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = Inherit; Input = Some(RedirectInput(l)) } p >> checkResult -let execStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = OutputAndError(Append(stdoutPath), Append(stderrPath)); Input = Some(RedirectInput(stdinPath)) } p >> alwaysSuccess - -let fsc cfg arg = Printf.ksprintf (Commands.fsc cfg.Directory (exec cfg) cfg.FSC) arg -let fscIn cfg workDir arg = Printf.ksprintf (Commands.fsc workDir (execIn cfg workDir) cfg.FSC) arg -let fscAppend cfg stdoutPath stderrPath arg = Printf.ksprintf (Commands.fsc cfg.Directory (execAppend cfg stdoutPath stderrPath) cfg.FSC) arg -let fscAppendIgnoreExitCode cfg stdoutPath stderrPath arg = Printf.ksprintf (Commands.fsc cfg.Directory (execAppendIgnoreExitCode cfg stdoutPath stderrPath) cfg.FSC) arg -let fscBothToOut cfg out arg = Printf.ksprintf (Commands.fsc cfg.Directory (execBothToOut cfg cfg.Directory out) cfg.FSC) arg - -let fscAppendErrExpectFail cfg errPath arg = Printf.ksprintf (fun flags sources -> Commands.fsc cfg.Directory (execAppendErrExpectFail cfg errPath) cfg.FSC flags sources |> checkErrorLevel1) arg - -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 fsiExpectFail cfg = Printf.ksprintf (Commands.fsi (execExpectFail cfg) cfg.FSI) -let fsiAppendIgnoreExitCode cfg stdoutPath stderrPath = Printf.ksprintf (Commands.fsi (execAppendIgnoreExitCode cfg stdoutPath stderrPath) cfg.FSI) -let fileguard cfg = (Commands.getfullpath cfg.Directory) >> (fun x -> new FileGuard(x)) -let getfullpath cfg = Commands.getfullpath cfg.Directory -let fileExists cfg = Commands.fileExists cfg.Directory >> Option.isSome -let fsiStdin cfg stdinPath = Printf.ksprintf (Commands.fsi (execStdin cfg stdinPath) cfg.FSI) -let fsiStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath = Printf.ksprintf (Commands.fsi (execStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath) cfg.FSI) -let rm cfg x = Commands.rm cfg.Directory x -let mkdir cfg = Commands.mkdir_p cfg.Directory -let copy_y cfg f = Commands.copy_y cfg.Directory f >> checkResult - -let fsdiff cfg a b = - let out = new ResizeArray() - let redirectOutputToFile path args = - log "%s %s" path args - use toLog = redirectToLog () - Process.exec { RedirectOutput = Some (function null -> () | s -> out.Add(s)); RedirectError = Some toLog.Post; RedirectInput = None; } cfg.Directory cfg.EnvironmentVariables path args - do (Commands.fsdiff redirectOutputToFile cfg.FSDIFF a b) |> (fun _ -> ()) - out.ToArray() |> List.ofArray - -let requireENCulture () = - match System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName with - | "en" -> true - | _ -> false diff --git a/tests/service/FsUnit.fs b/tests/service/FsUnit.fs index e5b0962449c..729ecbc9144 100644 --- a/tests/service/FsUnit.fs +++ b/tests/service/FsUnit.fs @@ -1,23 +1,23 @@ module FsUnit open System.Diagnostics -open NUnit.Framework -open NUnit.Framework.Constraints +open Xunit [] -let should (f : 'a -> #Constraint) x (y : obj) = - let c = f x +let should (f: 'a -> objnull -> unit) x (y: obj) = let y = match y with - | :? (unit -> unit) -> box (TestDelegate(y :?> unit -> unit)) + | :? (unit -> unit) -> box (fun () -> (y :?> unit -> unit)) | _ -> y - Assert.That(y, c) + f x y -let equal x = EqualConstraint(x) +/// Note, xunit does check types by default. +/// These are artifacts of nunit and not necessary now, just used in many places. +let equal (expected: 'a) (actual: 'a) = + Assert.Equal<'a>(expected, actual) -/// like "should equal", but validates same-type let shouldEqual (x: 'a) (y: 'a) = - Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y) + Assert.Equal<'a>(x, y) /// Same as 'shouldEqual' but goes pairwise over the collections. Lengths must be equal. let shouldPairwiseEqual (x: seq<_>) (y: seq<_>) = @@ -35,32 +35,4 @@ let shouldPairwiseEqual (x: seq<_>) (y: seq<_>) = while ex.MoveNext() do countx <- countx + 1 while ey.MoveNext() do county <- county + 1 if countx <> county then - Assert.Fail("Collections are of unequal lengths, expected length {0}, actual length is {1}.", countx, county) - -let notEqual x = NotConstraint(EqualConstraint(x)) - -let contain x = ContainsConstraint(x) - -let haveLength n = Has.Length.EqualTo(n) - -let haveCount n = Has.Count.EqualTo(n) - -let endWith (s:string) = EndsWithConstraint(s) - -let startWith (s:string) = StartsWithConstraint(s) - -let be = id - -let Null = NullConstraint() - -let Empty = EmptyConstraint() - -let EmptyString = EmptyStringConstraint() - -let True = TrueConstraint() - -let False = FalseConstraint() - -let sameAs x = SameAsConstraint(x) - -let throw = Throws.TypeOf \ No newline at end of file + Assert.Fail($"Collections are of unequal lengths, expected length {countx}, actual length is {county}.") diff --git a/vsintegration/tests/Salsa/SalsaUtils.fs b/vsintegration/tests/Salsa/SalsaUtils.fs index 1e6caca05d9..4b00dcc6b89 100644 --- a/vsintegration/tests/Salsa/SalsaUtils.fs +++ b/vsintegration/tests/Salsa/SalsaUtils.fs @@ -9,7 +9,7 @@ open Microsoft.VisualStudio.FSharp.LanguageService open Microsoft.VisualStudio.TextManager.Interop open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.EditorServices -open NUnit.Framework +open Xunit open Salsa.Salsa @@ -208,7 +208,7 @@ module internal VsOpsUtils = let AssertCompListIsEmpty (completions : CompletionItem[]) = if not (Array.isEmpty completions) then printfn "Expected empty completion list but got: %A" (completions |> Array.map (fun (CompletionItem(nm, _, _, _, _)) -> nm)) - Assert.IsTrue(Array.isEmpty completions, "Expected empty completion list but got some items") + Assert.True(Array.isEmpty completions, "Expected empty completion list but got some items") /// Verify that the given completion list contains a member with the given name let AssertCompListContains(completions : CompletionItem[], membername) = @@ -263,7 +263,7 @@ module internal VsOpsUtils = // Check that the marker is unique, otherwise we can't determine where to put the '.' let markerLines = orgFileContents |> Seq.filter (fun line -> line.Contains(marker)) |> Seq.length if markerLines = 0 then Assert.Fail("Unable to find marker in source code.") - if markerLines > 1 then Assert.Fail <| sprintf "Found marker [%s] multiple times in source file." marker + if markerLines > 1 then Assert.Fail(sprintf "Found marker [%s] multiple times in source file." marker) // Replace marker with "." let replaceMarker = @@ -310,11 +310,11 @@ module internal VsOpsUtils = -> match GetIdentifierAtCursor file with | None -> Assert.Fail ("No identifier at cursor. This indicates a bug in GotoDefinition.") | Some (id, _) -> // Are we on the identifier we expect? - Assert.AreEqual (toFind, id) + Assert.Equal (toFind, id) // Do the lines of code match what we expect? // - Eliminate white space to eliminate trivial errors // - +1 to adjust for 1-index line numbers - Assert.AreEqual ( + Assert.Equal ( expLine.Trim(), (span.iStartLine |> (+) 1 |> GetLineNumber (OpenFileViaOpenFile(file.VS, actFile))).Trim () ) @@ -327,8 +327,8 @@ module internal VsOpsUtils = // Error cases | (Some (x,_), None) - -> Assert.Fail <| sprintf "Expected to find the definition of '%s' but GotoDefn failed." x + -> Assert.Fail(sprintf "Expected to find the definition of '%s' but GotoDefn failed." x) | (None, Some (_,file)) - -> Assert.Fail <| sprintf "Expected GotoDefn to fail, but it went to a definition in file %s" file + -> Assert.Fail(sprintf "Expected GotoDefn to fail, but it went to a definition in file %s" file) diff --git a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj index 6b060d58780..353e08336a6 100644 --- a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj +++ b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj @@ -66,7 +66,7 @@ - + diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index ea12fea391f..6ac626f9fcb 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -1476,7 +1476,7 @@ module internal Salsa = vs.LanguageService <- ls vs :> VisualStudio with e -> - // Need to just print the error because NUnit has not fully initialized the exception at this point. + // Need to just print the error because the framework has not fully initialized the exception at this point. printf "Error in createSimple: %A" e reraise() diff --git a/vsintegration/tests/UnitTests/TestLib.Utils.fs b/vsintegration/tests/UnitTests/TestLib.Utils.fs index 8072604ca2b..49a5bfdf08a 100644 --- a/vsintegration/tests/UnitTests/TestLib.Utils.fs +++ b/vsintegration/tests/UnitTests/TestLib.Utils.fs @@ -4,7 +4,7 @@ namespace UnitTests.TestLib.Utils open System open System.IO -open NUnit.Framework +open Xunit open Microsoft.VisualStudio module Asserts = From 6cdcc3c33ca162988f3f90033f891bc265b9a3bc Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Wed, 25 Sep 2024 12:24:12 +0100 Subject: [PATCH 12/37] Better error reporting for `CE` `do!` (#17779) * Better error reporting for `CE` do bang * Use SynExpr.DoBang * update surface area * format code * release notes * update tests * Remove no intended case --- docs/release-notes/.FSharp.Compiler.Service/9.0.200.md | 1 + .../Checking/Expressions/CheckComputationExpressions.fs | 6 +++--- src/Compiler/Checking/Expressions/CheckExpressions.fs | 4 ++-- .../Checking/Expressions/CheckSequenceExpressions.fs | 2 +- src/Compiler/Driver/GraphChecking/FileContentMapping.fs | 2 +- src/Compiler/Service/FSharpParseFileResults.fs | 2 +- src/Compiler/Service/ServiceInterfaceStubGenerator.fs | 6 +++--- src/Compiler/Service/ServiceStructure.fs | 2 +- src/Compiler/SyntaxTree/SyntaxTree.fs | 2 +- src/Compiler/SyntaxTree/SyntaxTree.fsi | 2 +- src/Compiler/SyntaxTree/SyntaxTreeOps.fs | 2 +- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 3 +++ src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 8 ++++++++ src/Compiler/pars.fsy | 9 ++++++--- .../Language/ComputationExpressionTests.fs | 4 ++-- ....Compiler.Service.SurfaceArea.netstandard20.debug.bsl | 8 +++++++- ...ompiler.Service.SurfaceArea.netstandard20.release.bsl | 8 +++++++- tests/fsharp/typecheck/sigs/neg61.bsl | 2 +- .../SynExprDoContainsTheRangeOfTheDoKeyword.fs.bsl | 4 +++- 19 files changed, 53 insertions(+), 24 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index ce187cb8421..5ef93105656 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -8,5 +8,6 @@ * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) * Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) +* Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779)) ### Breaking Changes diff --git a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs index 5d9f3562ed9..d328f6a310a 100644 --- a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs @@ -1592,7 +1592,7 @@ let rec TryTranslateComputationExpression if ceenv.isQuery && not (innerComp1.IsArbExprAndThusAlreadyReportedError) then match innerComp1 with | SynExpr.JoinIn _ -> () - | SynExpr.DoBang(range = m) -> errorR (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), m)) + | SynExpr.DoBang(trivia = { DoBangKeyword = m }) -> errorR (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), m)) | _ -> errorR (Error(FSComp.SR.tcUnrecognizedQueryOperator (), innerComp1.RangeOfFirstPortion)) match @@ -1657,7 +1657,7 @@ let rec TryTranslateComputationExpression | None -> // "do! expr; cexpr" is treated as { let! () = expr in cexpr } match innerComp1 with - | SynExpr.DoBang(rhsExpr, m) -> + | SynExpr.DoBang(expr = rhsExpr; range = m) -> let sp = match sp with | DebugPointAtSequential.SuppressExpr -> DebugPointAtBinding.NoneAtDo @@ -2867,7 +2867,7 @@ and TranslateComputationExpression (ceenv: ComputationExpressionContext<'a>) fir // This only occurs in final position in a sequence match comp with // "do! expr;" in final position is treated as { let! () = expr in return () } when Return is provided (and no Zero with Default attribute is available) or as { let! () = expr in zero } otherwise - | SynExpr.DoBang(rhsExpr, m) -> + | SynExpr.DoBang(expr = rhsExpr; trivia = { DoBangKeyword = m }) -> let mUnit = rhsExpr.Range let rhsExpr = mkSourceExpr rhsExpr ceenv.sourceMethInfo ceenv.builderValName diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index 615e4251893..d0f758967de 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -6003,10 +6003,10 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE | SynExpr.ImplicitZero m -> error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) - | SynExpr.DoBang (_, m) + | SynExpr.DoBang (trivia = { DoBangKeyword = m }) | SynExpr.MatchBang (range = m) | SynExpr.WhileBang (range = m) - | SynExpr.LetOrUseBang (range = m) -> + | SynExpr.LetOrUseBang (trivia = { LetOrUseBangKeyword = m }) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) | SynExpr.IndexFromEnd (rightExpr, m) -> diff --git a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs index 31be49131ab..b627eef2922 100644 --- a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs @@ -168,7 +168,7 @@ let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallT | SynExpr.ImplicitZero m -> Some(mkSeqEmpty cenv env m genOuterTy, tpenv) - | SynExpr.DoBang(_rhsExpr, m) -> error (Error(FSComp.SR.tcDoBangIllegalInSequenceExpression (), m)) + | SynExpr.DoBang(trivia = { DoBangKeyword = m }) -> error (Error(FSComp.SR.tcDoBangIllegalInSequenceExpression (), m)) | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m, _) -> let env1 = diff --git a/src/Compiler/Driver/GraphChecking/FileContentMapping.fs b/src/Compiler/Driver/GraphChecking/FileContentMapping.fs index c1f6ce8ddb4..5fd190b1995 100644 --- a/src/Compiler/Driver/GraphChecking/FileContentMapping.fs +++ b/src/Compiler/Driver/GraphChecking/FileContentMapping.fs @@ -523,7 +523,7 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list = visit expr (fun exprNodes -> [ yield! exprNodes; yield! List.collect visitSynMatchClause clauses ] |> continuation) - | SynExpr.DoBang(expr, _) -> visit expr continuation + | SynExpr.DoBang(expr = expr) -> visit expr continuation | SynExpr.WhileBang(whileExpr = whileExpr; doExpr = doExpr) -> visit whileExpr (fun whileNodes -> visit doExpr (fun doNodes -> whileNodes @ doNodes |> continuation)) | SynExpr.LibraryOnlyILAssembly(typeArgs = typeArgs; args = args; retTy = retTy) -> diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs index 34958588b79..d00b5fe7934 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/Compiler/Service/FSharpParseFileResults.fs @@ -578,7 +578,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! walkExpr false e | SynExpr.YieldOrReturnFrom(_, e, _) - | SynExpr.DoBang(e, _) -> + | SynExpr.DoBang(expr = e) -> yield! checkRange e.Range yield! walkExpr false e diff --git a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs index d691e002c0a..f0ddc777b14 100644 --- a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs +++ b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs @@ -952,9 +952,9 @@ module InterfaceStubGenerator = | SynExpr.Null _range | SynExpr.ImplicitZero _range -> None - | SynExpr.YieldOrReturn(_, synExpr, _range) - | SynExpr.YieldOrReturnFrom(_, synExpr, _range) - | SynExpr.DoBang(synExpr, _range) -> walkExpr synExpr + | SynExpr.YieldOrReturn(expr = synExpr) + | SynExpr.YieldOrReturnFrom(expr = synExpr) + | SynExpr.DoBang(expr = synExpr) -> walkExpr synExpr | SynExpr.LetOrUseBang(rhs = synExpr1; andBangs = synExprAndBangs; body = synExpr2) -> [ diff --git a/src/Compiler/Service/ServiceStructure.fs b/src/Compiler/Service/ServiceStructure.fs index 1d0f7c7f8ec..6ca45aa6961 100644 --- a/src/Compiler/Service/ServiceStructure.fs +++ b/src/Compiler/Service/ServiceStructure.fs @@ -254,7 +254,7 @@ module Structure = rcheck Scope.YieldOrReturnBang Collapse.Below r r parseExpr e - | SynExpr.DoBang(e, r) -> + | SynExpr.DoBang(expr = e; range = r) -> rcheck Scope.Do Collapse.Below r <| Range.modStart 3 r parseExpr e diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index 962188c2f21..f97fe05234d 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -726,7 +726,7 @@ type SynExpr = range: range * trivia: SynExprMatchBangTrivia - | DoBang of expr: SynExpr * range: range + | DoBang of expr: SynExpr * range: range * trivia: SynExprDoBangTrivia | WhileBang of whileDebugPoint: DebugPointAtWhile * whileExpr: SynExpr * doExpr: SynExpr * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index f2c75d8dfac..99138631957 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -909,7 +909,7 @@ type SynExpr = /// F# syntax: do! expr /// Computation expressions only - | DoBang of expr: SynExpr * range: range + | DoBang of expr: SynExpr * range: range * trivia: SynExprDoBangTrivia /// F# syntax: 'while! ... do ...' | WhileBang of whileDebugPoint: DebugPointAtWhile * whileExpr: SynExpr * doExpr: SynExpr * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs index dc08afd6368..680986ea503 100644 --- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs +++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs @@ -885,7 +885,7 @@ let rec synExprContainsError inpExpr = | SynExpr.TraitCall(_, _, e, _) | SynExpr.YieldOrReturn(_, e, _) | SynExpr.YieldOrReturnFrom(_, e, _) - | SynExpr.DoBang(e, _) + | SynExpr.DoBang(e, _, _) | SynExpr.Fixed(e, _) | SynExpr.DebugPoint(_, _, e) | SynExpr.Paren(e, _, _, _) -> walkExpr e diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index bbc5f8ea0ce..7e03572719e 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -117,6 +117,9 @@ type SynExprMatchBangTrivia = WithKeyword: range } +[] +type SynExprDoBangTrivia = { DoBangKeyword: range } + [] type SynExprAnonRecdTrivia = { OpeningBraceRange: range } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 08f8228c3bc..3c678a72679 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -169,6 +169,14 @@ type SynExprMatchBangTrivia = WithKeyword: range } +/// Represents additional information for SynExpr.DoBang +[] +type SynExprDoBangTrivia = + { + /// The syntax range of the `do!` keyword + DoBangKeyword: range + } + /// Represents additional information for SynExpr.AnonRecd [] type SynExprAnonRecdTrivia = diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index c930398b24b..656b75c39ff 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4442,11 +4442,14 @@ declExpr: | DO_BANG typedSequentialExpr IN opt_OBLOCKSEP typedSequentialExprBlock %prec expr_let { let spBind = DebugPointAtBinding.NoneAtDo - let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = Range.Zero; EqualsRange = None } - SynExpr.LetOrUseBang(spBind, false, true, SynPat.Const(SynConst.Unit, $2.Range), $2, [], $5, unionRanges (rhs parseState 1) $5.Range, trivia) } + let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) $5.Range + SynExpr.DoBang($2, m, trivia) } | ODO_BANG typedSequentialExprBlock hardwhiteDefnBindingsTerminator %prec expr_let - { SynExpr.DoBang($2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) $2.Range + SynExpr.DoBang($2, m, trivia) } | FIXED declExpr { SynExpr.Fixed($2, (unionRanges (rhs parseState 1) $2.Range)) } diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 8333657e699..027ad51ee4c 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -330,7 +330,7 @@ query { |> typecheck |> shouldFail |> withDiagnostics [ - (Error 3143, Line 3, Col 5, Line 3, Col 20, "'let!', 'use!' and 'do!' expressions may not be used in queries") + (Error 3143, Line 3, Col 5, Line 3, Col 8, "'let!', 'use!' and 'do!' expressions may not be used in queries") ] [] @@ -392,7 +392,7 @@ query { |> typecheck |> shouldFail |> withDiagnostics [ - (Error 3143, Line 4, Col 5, Line 4, Col 20, "'let!', 'use!' and 'do!' expressions may not be used in queries") + (Error 3143, Line 4, Col 5, Line 4, Col 8, "'let!', 'use!' and 'do!' expressions may not be used in queries") ] [] diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index c41cdbbea96..a53af559138 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -7606,7 +7606,13 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.C FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr+DoBang: FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+DoBang: FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia trivia +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia) +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: FSharp.Compiler.Text.Range DoBangKeyword +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: FSharp.Compiler.Text.Range get_DoBangKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedSet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index c41cdbbea96..a53af559138 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -7606,7 +7606,13 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.C FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr+DoBang: FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+DoBang: FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia trivia +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia) +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: FSharp.Compiler.Text.Range DoBangKeyword +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: FSharp.Compiler.Text.Range get_DoBangKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprDoBangTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedSet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 8a8bd79e168..91291a6cb94 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -61,7 +61,7 @@ neg61.fs(92,13,92,70): typecheck error FS3142: 'use' expressions may not be used neg61.fs(97,13,97,17): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries -neg61.fs(102,13,102,28): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries +neg61.fs(102,13,102,16): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries neg61.fs(107,13,107,21): typecheck error FS3144: 'return' and 'return!' may not be used in queries diff --git a/tests/service/data/SyntaxTree/Expression/SynExprDoContainsTheRangeOfTheDoKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprDoContainsTheRangeOfTheDoKeyword.fs.bsl index e33ddf8bde9..4b3437c248d 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprDoContainsTheRangeOfTheDoKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprDoContainsTheRangeOfTheDoKeyword.fs.bsl @@ -14,7 +14,9 @@ ImplFile Named (SynIdent (a, None), false, None, (2,4--2,5)), None, Sequential (SuppressNeither, true, Do (Ident foobar, (3,4--4,14)), - DoBang (Ident foobarBang, (5,4--6,18)), (3,4--6,18), + DoBang + (Ident foobarBang, (5,4--6,18), + { DoBangKeyword = (5,4--5,7) }), (3,4--6,18), { SeparatorRange = None }), (2,4--2,5), NoneAtLet, { LeadingKeyword = Let (2,0--2,3) InlineKeyword = None From 28124975958064de555ef521b59f302fd160a8be Mon Sep 17 00:00:00 2001 From: Petr Date: Thu, 26 Sep 2024 17:54:14 +0200 Subject: [PATCH 13/37] Clean up FsUnit (#17781) --- .../Signatures/HashConstraintTests.fs | 3 +- .../Signatures/MemberTests.fs | 6 ++-- .../Signatures/ModuleOrNamespaceTests.fs | 19 +++++------ .../Signatures/NestedTypeTests.fs | 4 +-- .../Signatures/RecordTests.fs | 5 ++- .../Signatures/TestHelpers.fs | 13 +++---- .../Signatures/TypeTests.fs | 14 ++++---- .../ExprTests.fs | 22 ++++++------ .../ProjectAnalysisTests.fs | 2 +- .../FSharp.Compiler.Service.Tests/Symbols.fs | 18 +++++----- tests/service/FsUnit.fs | 34 +------------------ 11 files changed, 48 insertions(+), 92 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/HashConstraintTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/HashConstraintTests.fs index beb33a8bac5..ac624ec19a7 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/HashConstraintTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/HashConstraintTests.fs @@ -21,8 +21,7 @@ let noa<'n when 'n :> Node> (n: 'n option) = | Some n -> [| n :> Node |] """ |> printSignatures - |> should - equal + |> assertEqualIgnoreLineEnding """ module Foo diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/MemberTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/MemberTests.fs index 2452a900881..3475535249a 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/MemberTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/MemberTests.fs @@ -15,8 +15,7 @@ type Foo() = member f.X with internal get (key1, key2) = true and public set (key1, key2) value = () """ |> printSignatures - |> should - equal + |> assertEqualIgnoreLineEnding """ module Foo @@ -38,8 +37,7 @@ type Foo() = member f.Y with public get () = 'y' and internal set y = ignore y """ |> printSignatures - |> should - equal + |> assertEqualIgnoreLineEnding """ module Foo diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/ModuleOrNamespaceTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/ModuleOrNamespaceTests.fs index d4d9d408df9..413e4a7fdf9 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/ModuleOrNamespaceTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/ModuleOrNamespaceTests.fs @@ -20,8 +20,7 @@ type Map<'t,'v> = """ |> printSignatures |> prependNewline - |> should - equal + |> assertEqualIgnoreLineEnding """ namespace Foo.Types @@ -43,8 +42,7 @@ type Foo = """ |> printSignatures |> prependNewline - |> should - equal + |> assertEqualIgnoreLineEnding """ namespace Hey.There @@ -101,8 +99,7 @@ module internal CodePrinter = id""" |> printSignatures |> prependNewline - |> should - equal + |> assertEqualIgnoreLineEnding """ namespace Fantomas.Core @@ -156,7 +153,7 @@ open System.Runtime.CompilerServices do () """ |> printSignatures - |> should equal "namespace System" + |> assertEqualIgnoreLineEnding "namespace System" [] let ``Empty module`` () = @@ -167,7 +164,7 @@ module Foobar do () """ |> printSignatures - |> should equal "module Foobar" + |> assertEqualIgnoreLineEnding "module Foobar" [] let ``Two empty namespaces`` () = @@ -183,7 +180,7 @@ do () """ |> printSignatures |> prependNewline - |> should equal """ + |> assertEqualIgnoreLineEnding """ namespace Foo namespace Bar""" @@ -196,7 +193,7 @@ namespace rec Foobar do () """ |> printSignatures - |> should equal "namespace Foobar" + |> assertEqualIgnoreLineEnding "namespace Foobar" [] let ``Attribute on nested module`` () = @@ -211,7 +208,7 @@ module Area = """ |> printSignatures |> prependNewline - |> should equal """ + |> assertEqualIgnoreLineEnding """ namespace MyApp.Types [ (4))>] diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/NestedTypeTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/NestedTypeTests.fs index 669faca6d5f..4dfce060679 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/NestedTypeTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/NestedTypeTests.fs @@ -35,7 +35,7 @@ let f (g: Upper.Lower) = g.Meh() """ |> withReferences [ CSLib ] |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Sample @@ -74,7 +74,7 @@ let f (g: Root.Foo withReferences [ CSLib ] |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Sample diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/RecordTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/RecordTests.fs index 27c5159a3f3..cb5ec18da97 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/RecordTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/RecordTests.fs @@ -19,8 +19,7 @@ type PullActions = } """ |> printSignaturesWith 80 - |> should - equal + |> assertEqualIgnoreLineEnding """ module SignatureFileGeneration.MyModule @@ -63,7 +62,7 @@ type SomeTypeName = """ |> printSignatures |> prependNewline - |> should equal + |> assertEqualIgnoreLineEnding """ namespace MyApp.Types diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TestHelpers.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/TestHelpers.fs index 8f3d1019ae0..b778cb3d783 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/TestHelpers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TestHelpers.fs @@ -1,20 +1,15 @@ module Signatures.TestHelpers open System -open FsUnit +open Xunit open FSharp.Test.Compiler let prependNewline v = String.Concat("\n", v) -let equal x = - let x = - match box x with - | :? String as s -> s.Replace("\r\n", "\n") |> box - | x -> x - - equal x +let assertEqualIgnoreLineEnding (x: string) (y: string) = + Assert.Equal(x, y, ignoreLineEndingDifferences = true) let assertSingleSignatureBinding implementation signature = FSharp $"module A\n\n{implementation}" |> printSignatures - |> should equal $"\nmodule A\n\n{signature}" + |> assertEqualIgnoreLineEnding $"\nmodule A\n\n{signature}" diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs b/tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs index 1494c465af9..d066d74dd9a 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs @@ -44,7 +44,7 @@ and FormatSelectionRange = """ |> printSignatures |> prependNewline - |> should equal + |> assertEqualIgnoreLineEnding """ namespace Foo.Types @@ -87,7 +87,7 @@ type List<'E> with member this.X = this.Head """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Extensions type List<'E> with @@ -104,7 +104,7 @@ type Map<'K, 'V when 'K: comparison> with member m.X (t: 'T) (k: 'K) = Some k, ({| n = [|k|] |}, 0) """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Extensions type Map<'K,'V when 'K: comparison> with @@ -126,7 +126,7 @@ type ConcurrentDictionary<'key, 'value> with | _ -> None """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Extensions type System.Collections.Concurrent.ConcurrentDictionary<'key,'value> with @@ -161,7 +161,7 @@ type DataItem< ^input> with DataItem.Create< ^input>(stringValue, friendlyStringValue, item) """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Extensions @@ -237,7 +237,7 @@ type Foo = member x.Bar with get () = 5 and set v = ignore v """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Lib @@ -254,7 +254,7 @@ type Foo = member x.Bar with get (a:int) = 5 and set (a:int) v = ignore v """ |> printSignatures - |> should equal + |> assertEqualIgnoreLineEnding """ module Lib diff --git a/tests/FSharp.Compiler.Service.Tests/ExprTests.fs b/tests/FSharp.Compiler.Service.Tests/ExprTests.fs index 3a7cf3eb68d..c8870dd700e 100644 --- a/tests/FSharp.Compiler.Service.Tests/ExprTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/ExprTests.fs @@ -788,12 +788,12 @@ let ``Test Unoptimized Declarations Project1`` useTransparentCompiler = printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> Utils.filterHack - |> shouldPairwiseEqual (Utils.filterHack expected) + |> shouldEqual (Utils.filterHack expected) printDeclarations None (List.ofSeq file2.Declarations) |> Seq.toList |> Utils.filterHack - |> shouldPairwiseEqual (Utils.filterHack expected2) + |> shouldEqual (Utils.filterHack expected2) () @@ -930,12 +930,12 @@ let ``Test Optimized Declarations Project1`` useTransparentCompiler = printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> Utils.filterHack - |> shouldPairwiseEqual (Utils.filterHack expected) + |> shouldEqual (Utils.filterHack expected) printDeclarations None (List.ofSeq file2.Declarations) |> Seq.toList |> Utils.filterHack - |> shouldPairwiseEqual (Utils.filterHack expected2) + |> shouldEqual (Utils.filterHack expected2) () @@ -1045,11 +1045,11 @@ let testOperators dnName fsName excludedTests expectedUnoptimized expectedOptimi // fail test on first line that fails, show difference in output window resultUnoptFiltered - |> shouldPairwiseEqual expectedUnoptFiltered + |> shouldEqual expectedUnoptFiltered // fail test on first line that fails, show difference in output window resultOptFiltered - |> shouldPairwiseEqual expectedOptFiltered + |> shouldEqual expectedOptFiltered end [] @@ -3134,7 +3134,7 @@ let BigSequenceExpression(outFileOpt,docFileOpt,baseAddressOpt) = let createOptions() = createProjectOptions dirName [fileSource1] [] #if !NETFRAMEWORK && DEBUG -[] +[] #else [] [] @@ -3263,7 +3263,7 @@ let ``Test ProjectForWitnesses1`` useTransparentCompiler = |> Seq.toList printfn "actual:\n\n%A" actual actual - |> shouldPairwiseEqual expected + |> shouldEqual expected [] @@ -3380,7 +3380,7 @@ let ``Test ProjectForWitnesses2`` useTransparentCompiler = |> Seq.toList printfn "actual:\n\n%A" actual actual - |> shouldPairwiseEqual expected + |> shouldEqual expected //--------------------------------------------------------------------------------------------------------- // This project is for witness arguments, testing for https://github.com/dotnet/fsharp/issues/10364 @@ -3437,7 +3437,7 @@ let ``Test ProjectForWitnesses3`` useTransparentCompiler = |> Seq.toList printfn "actual:\n\n%A" actual actual - |> shouldPairwiseEqual expected + |> shouldEqual expected [] [] @@ -3532,7 +3532,7 @@ let ``Test ProjectForWitnesses4 GetWitnessPassingInfo`` useTransparentCompiler = |> Seq.toList printfn "actual:\n\n%A" actual actual - |> shouldPairwiseEqual expected + |> shouldEqual expected module internal ProjectForNoWarnHashDirective = diff --git a/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs b/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs index 92ca4a07091..78d03ac8a9b 100644 --- a/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/ProjectAnalysisTests.fs @@ -713,7 +713,7 @@ let ``Test project2 all symbols in signature`` () = "field x"; "field y"; "GenericClass`1"; "generic parameter T"; "member .ctor"; "member GenericMethod"; "generic parameter U"] |> List.sort - shouldPairwiseEqual e r + shouldEqual e r [] let ``Test project2 all uses of all signature symbols`` () = diff --git a/tests/FSharp.Compiler.Service.Tests/Symbols.fs b/tests/FSharp.Compiler.Service.Tests/Symbols.fs index c63dca9f6de..e0082fcde30 100644 --- a/tests/FSharp.Compiler.Service.Tests/Symbols.fs +++ b/tests/FSharp.Compiler.Service.Tests/Symbols.fs @@ -68,7 +68,7 @@ extern int private c() |> List.zip decls |> List.iter (fun (actual, expected) -> match actual with - | SynModuleDecl.Let (_, [SynBinding (accessibility = access)], _) -> Option.map string access |> should equal expected + | SynModuleDecl.Let (_, [SynBinding (accessibility = access)], _) -> Option.map string access |> shouldEqual expected | decl -> failwithf "unexpected decl: %O" decl) [ "a", (true, false, false, false) @@ -79,7 +79,7 @@ extern int private c() | :? FSharpMemberOrFunctionOrValue as mfv -> let access = mfv.Accessibility (access.IsPublic, access.IsProtected, access.IsInternal, access.IsPrivate) - |> should equal expected + |> shouldEqual expected | _ -> failwithf "Couldn't get mfv: %s" name) [] @@ -289,7 +289,7 @@ type E = Ns1.Ns2.T match symbolUse.Symbol with | :? FSharpEntity as entity -> entity.AbbreviatedType.Format(symbolUse.DisplayContext) - |> should equal expectedPrintedType + |> shouldEqual expectedPrintedType | _ -> failwithf "Couldn't get entity: %s" symbolName) @@ -388,7 +388,7 @@ let tester: int folks = Cons(1, Nil) match symbolUse.Symbol with | :? FSharpMemberOrFunctionOrValue as v -> v.FullType.Format (symbolUse.DisplayContext.WithPrefixGenericParameters()) - |> should equal prefixForm + |> shouldEqual prefixForm | _ -> failwithf "Couldn't get member: %s" entity [] @@ -406,7 +406,7 @@ let tester: Folks = Cons(1, Nil) match symbolUse.Symbol with | :? FSharpMemberOrFunctionOrValue as v -> v.FullType.Format (symbolUse.DisplayContext.WithSuffixGenericParameters()) - |> should equal suffixForm + |> shouldEqual suffixForm | _ -> failwithf "Couldn't get member: %s" entity [] @@ -431,7 +431,7 @@ let tester2: int Group = [] match symbolUse.Symbol with | :? FSharpMemberOrFunctionOrValue as v -> v.FullType.Format symbolUse.DisplayContext - |> should equal expectedTypeFormat + |> shouldEqual expectedTypeFormat | _ -> failwithf "Couldn't get member: %s" entityName ) @@ -497,10 +497,10 @@ let f2 b1 b2 b3 b4 b5 = | :? FSharpMemberOrFunctionOrValue as mfv -> match symbolTypes.TryGetValue(mfv.DisplayName) with | true, Some expectedType -> - mfv.FullType.TypeDefinition.DisplayName |> should equal expectedType + mfv.FullType.TypeDefinition.DisplayName |> shouldEqual expectedType | true, None -> - mfv.FullType.IsGenericParameter |> should equal true - mfv.FullType.AllInterfaces.Count |> should equal 0 + mfv.FullType.IsGenericParameter |> shouldEqual true + mfv.FullType.AllInterfaces.Count |> shouldEqual 0 | _ -> () | _ -> () diff --git a/tests/service/FsUnit.fs b/tests/service/FsUnit.fs index 729ecbc9144..e17be411776 100644 --- a/tests/service/FsUnit.fs +++ b/tests/service/FsUnit.fs @@ -1,38 +1,6 @@ module FsUnit -open System.Diagnostics open Xunit -[] -let should (f: 'a -> objnull -> unit) x (y: obj) = - let y = - match y with - | :? (unit -> unit) -> box (fun () -> (y :?> unit -> unit)) - | _ -> y - f x y - -/// Note, xunit does check types by default. -/// These are artifacts of nunit and not necessary now, just used in many places. -let equal (expected: 'a) (actual: 'a) = - Assert.Equal<'a>(expected, actual) - let shouldEqual (x: 'a) (y: 'a) = - Assert.Equal<'a>(x, y) - -/// Same as 'shouldEqual' but goes pairwise over the collections. Lengths must be equal. -let shouldPairwiseEqual (x: seq<_>) (y: seq<_>) = - // using enumerators, because Seq.iter2 allows different lengths silently - let ex = x.GetEnumerator() - let ey = y.GetEnumerator() - let mutable countx = 0 - let mutable county = 0 - while ex.MoveNext() do - countx <- countx + 1 - if ey.MoveNext() then - county <- county + 1 - ey.Current |> shouldEqual ex.Current - - while ex.MoveNext() do countx <- countx + 1 - while ey.MoveNext() do county <- county + 1 - if countx <> county then - Assert.Fail($"Collections are of unequal lengths, expected length {countx}, actual length is {county}.") + Assert.Equal<'a>(x, y) \ No newline at end of file From 67793bf7c809dfde3e883f21e97410b8ceebbd8f Mon Sep 17 00:00:00 2001 From: Petr Date: Thu, 26 Sep 2024 18:04:17 +0200 Subject: [PATCH 14/37] Eradicate Nunit (#17782) --- Directory.Build.targets | 8 +------- azure-pipelines-PR.yml | 6 +++--- azure-pipelines.yml | 2 +- eng/Build.ps1 | 4 ++-- eng/Versions.props | 5 +---- eng/build.sh | 2 +- .../BasicProvider.Tests/BasicProvider.Tests.fsproj | 3 +-- .../ComboProvider.Tests/ComboProvider.Tests.fsproj | 3 +-- tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj | 5 ----- 9 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index c43425cc369..c6603ea43be 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -10,16 +10,10 @@ $(ArtifactsDir)/bin/fsyacc/$(Configuration)/$(FSharpNetCoreProductDefaultTargetFramework)/$(NETCoreSdkPortableRuntimeIdentifier)/fsyacc.dll - - - - - - - + diff --git a/eng/build.sh b/eng/build.sh index 90260cbfa4f..da10ebfc4f0 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -214,7 +214,7 @@ function Test() { projectname=$(basename -- "$testproject") projectname="${projectname%.*}" testlogpath="$artifacts_dir/TestResults/$configuration/${projectname}_$targetframework.xml" - args="test \"$testproject\" --no-restore --no-build -c $configuration -f $targetframework --test-adapter-path . --logger \"nunit;LogFilePath=$testlogpath\" --blame --results-directory $artifacts_dir/TestResults/$configuration -p:vstestusemsbuildoutput=false" + args="test \"$testproject\" --no-restore --no-build -c $configuration -f $targetframework --test-adapter-path . --logger \"xunit;LogFilePath=$testlogpath\" --blame --results-directory $artifacts_dir/TestResults/$configuration -p:vstestusemsbuildoutput=false" "$DOTNET_INSTALL_DIR/dotnet" $args || exit $? } diff --git a/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj b/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj index 98144131089..4e4aef01856 100644 --- a/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj +++ b/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj @@ -7,6 +7,7 @@ false NO_GENERATIVE $(FSharpCoreShippedPackageVersionValue) + xunit @@ -21,8 +22,6 @@ - - diff --git a/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj b/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj index b884948e8b8..d4d410bacd4 100644 --- a/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj +++ b/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj @@ -7,6 +7,7 @@ false $(FSharpCoreShippedPackageVersionValue) NO_GENERATIVE + xunit @@ -18,8 +19,6 @@ - - diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj index 93143ca4103..2ba4f6f837d 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj +++ b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj @@ -25,11 +25,6 @@ true - - $(DefineConstants);XUNIT - $(DefineConstants);NUNIT - - From 50542ca6a72393ff4be5057ab963c0aac25c7087 Mon Sep 17 00:00:00 2001 From: Petr Date: Thu, 26 Sep 2024 19:18:30 +0200 Subject: [PATCH 15/37] Remove a bunch of dead test data (#17771) * Remove stuff * up --- .../Dir1/OutputDir1/FSharp.Core.dll | Bin 1506120 -> 0 bytes .../data/DifferingOutputDir/Dir1/Test1.fsproj | 63 -------------- .../Dir2/OutputDir2/FSharp.Core.dll | Bin 1506120 -> 0 bytes .../data/DifferingOutputDir/Dir2/Test2.fsproj | 69 --------------- tests/service/data/FsAndFsiFiles.fsproj | 63 -------------- tests/service/data/Malformed.fsproj | 1 - .../ConsoleApplication1.fsproj | 79 ------------------ .../ConsoleApplication2.fsproj | 71 ---------------- .../ConsoleApplication3.csproj | 66 --------------- tests/service/data/ScriptProject/BaseLib1.fs | 3 - tests/service/data/ScriptProject/BaseLib2.fs | 3 - tests/service/data/ScriptProject/Lib1.fsx | 2 - tests/service/data/ScriptProject/Lib2.fsx | 2 - tests/service/data/ScriptProject/Lib3.fs | 3 - tests/service/data/ScriptProject/Lib4.fs | 3 - tests/service/data/ScriptProject/Lib5.fsx | 2 - tests/service/data/ScriptProject/Main1.fsx | 4 - tests/service/data/ScriptProject/Main2.fsx | 6 -- tests/service/data/ScriptProject/Main3.fsx | 4 - tests/service/data/ScriptProject/Main4.fsx | 6 -- tests/service/data/ScriptProject/MainBad.fsx | 2 - tests/service/data/Space in name.fsproj | 67 --------------- tests/service/data/Test1.fsproj | 61 -------------- tests/service/data/Test2.fsproj | 68 --------------- tests/service/data/Test3.fsproj | 62 -------------- tests/service/data/ToolsVersion12.fsproj | 58 ------------- tests/service/data/testscript.fsx | 1 - 27 files changed, 769 deletions(-) delete mode 100644 tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll delete mode 100644 tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj delete mode 100644 tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll delete mode 100644 tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj delete mode 100644 tests/service/data/FsAndFsiFiles.fsproj delete mode 100644 tests/service/data/Malformed.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj delete mode 100644 tests/service/data/ScriptProject/BaseLib1.fs delete mode 100644 tests/service/data/ScriptProject/BaseLib2.fs delete mode 100644 tests/service/data/ScriptProject/Lib1.fsx delete mode 100644 tests/service/data/ScriptProject/Lib2.fsx delete mode 100644 tests/service/data/ScriptProject/Lib3.fs delete mode 100644 tests/service/data/ScriptProject/Lib4.fs delete mode 100644 tests/service/data/ScriptProject/Lib5.fsx delete mode 100644 tests/service/data/ScriptProject/Main1.fsx delete mode 100644 tests/service/data/ScriptProject/Main2.fsx delete mode 100644 tests/service/data/ScriptProject/Main3.fsx delete mode 100644 tests/service/data/ScriptProject/Main4.fsx delete mode 100644 tests/service/data/ScriptProject/MainBad.fsx delete mode 100644 tests/service/data/Space in name.fsproj delete mode 100644 tests/service/data/Test1.fsproj delete mode 100644 tests/service/data/Test2.fsproj delete mode 100644 tests/service/data/Test3.fsproj delete mode 100644 tests/service/data/ToolsVersion12.fsproj delete mode 100644 tests/service/data/testscript.fsx diff --git a/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll deleted file mode 100644 index ae969cedb0c4830b4430a00441dbd39f319caed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506120 zcmd3P34k0$)qkgZrsvw3-Og-glMUp8gl2a(kc1-}AcXtAuY{X$27w7XS%eI`Mg$ZH zQ4tVCxdVuRhf}jBA9czpl_irF9y_V8|CC9KPMNg*Ui(ctxpK_0)ARZ4`kM9LJ2=knqde!) zo6kPLNPE^POwNr;JIbgL6meJs%v`Ru_slKkh)T5;dS?r zblVEq`q`3p#UFKZouqT-w3Kt%F|AHUu#R)_1tsSs)KNR&GL0Jvbh#BU%(~N@E~ns> zx_0%-c`qF0INd!Sq8<28@H;wgWt=2*y@4?(R+r;Uaom~?I@27tqk`J=f$xgab`2Y@ z;|C24KOI#3azpvm<%8KwJ{?>;d1K>zI_T8#ML`W;9aQ?DuxneswXwl)Y3g+8RJu%a z+)`zdl25y9biLl=W4(27SbGd7dpP`HRHvx_36SF^2G%7=4xpJOx~LP;sDAMa(o9$q z0Dq6oV=^-*1|||D2c{4d5(DcAOb(!=iYJp9K1^i7%*XI_$Ms63%BHl8gcB;f8Ssf@ zdwXRgWi!M}rIMF0aq25Vz=L55Cciq{qthdjbRDdxPmSq1SWll8({-?(zJa3e3jPdM zP-)qfcaL($cR9t46G*H7tfm(tom(2%Pyr~%ShoUY1$q>iPSA&zym$aMFy&x=mXl>- zZieAo-hhq}Pv#L`M~J7G2(Kf=Q*MOU5#qI2#oy9_3P$O5gz2eqgx3+-kZ_ zb!CKCQyI$FK?i;;by``d{Ca{Lvj6Uy;8xKjvRz$n{}k65-@e-Ga)6tpaqAfz{i+q^ zb{!{hvwlAbWv`=qREa*9biM}~#*)Bs!J_v@#5@MR%q+!Rkh3ymy<$tyVj*&VYF3|; zU!LVIp&l)sfPA?BB*!l%(lxZ_Y%!Tp&<_$pGVoWohft@x%UwckiYZUQw9XWyYH0b{ zVkStdKo;3DK^ECOX7f`EFiKI)vOA^=<=7VWvJ#~6tJ^DR*ICvl%XSZ7mSt1atQ7G| z7Ew~OoGY4?Gv_yyvn7?Db&M`&k1A*0mvR;px@5^9p^MnGguX7}(4y6qER~j$8SQlO zP?nTafua~5RXvrDD`o5T$(6E`?mA=hD^sFHi__W3uD>>n!xg9zB2l{H(7n zp6^hJGs?UPFGwt(+AKM23;zobKwVbQA=0q4>#fGFV$dsS(0-af>-R4Iuh}zUd(4{c ziK$69e4`|OQd&Jq`9#852?bk>9eck(-RTFP5xuiP)^cz7dwm0-zaOdX4pZ9xt{vTS zhad@m^)01+?dGY#S9VWZ-VkJvIyH>WnCnRUjm%umx@bfdj6qrY{~R~OaFa!+&eq0$ zK)j$U#e zIE)g4>oPd@OPJGOuBrMZ63X7#?iRnF`Aioj{V-G{3NCPWHVsIPjtEBPMD<`p%Z4g;!ao!HGC(m%at6fI_)5-9KrVje|a|;4e8|3 zBRFxtjmZw3fc-^Zj?OR$=T zJ&=e|FpwzYU?36S;XqA_0sY8c&S`FM$}({!H)^h{qaCvVq4~#DG|VejL*=BUW?~v)ZBPLmgMLHf)!P+* ziSI1CX+)uPusZ)?mtp0Z3WW*Oo*(YcOHm0AwuaYYPTL zOjl<)GhXS^+s_8nD1!T3bIs z0r-@xTH2cZ1kW{1$2JdbX;S1LufqkTUwWRtAa=3(rALUY_Z>FL`S^D(Np<~FTD2Oh z8QFuC7zKlsG7bhS@f{9UrWM(PmDmJ>m9h;6D{&kSR;CffgOxT(L3ci_K|y&mOA4RiW+&<2oKkIij}v5#bN zcR-_*KQm6SkGu!}+$FQo0mc2~K1e)5KiON?PwtDv#gY2SIY?f#`pNy6VWfU?3udtT z$^DsO_rhCZV!qoFeYdZ#=v+1jn`y7it}vc&;8=hzV3?-VioAV2u5OGL_4r= z5y-ws<5^2w5)X_0DQ~ViFO4ZR1Gjs-&a&`2>g^oV#2nNuH9SLaqu%j%T>BAOUIMat6 zZQ)EGc8rD7eOUEa3pZZ(YoY+>Ab5yy%BDS(H^&oDGZ|&ZEj>y?&AAms?z4I)O1NFUux2KEFwSUTR2V#$2Vp;i%RyPoQY+ z=Zg@ApPxt+{7@kMT;o5c@dD}R8h?_;3#6ZG{K*Y9ldJk4Aex~I{FerXP_oZ*U|e8oq?JtUq?Sp z=x84wX8`TvbU@QS&aiN%eJr(brhU{boM|6tS~$}_1}vOzAJst%w~lTzqSOd&hIF(U z0;|oSvmCa~pgpn8e1gJIe){t6fE%keL#k>s8+j`kp?6PlwEzL!jECrb-E|XkZ zlHHERDL;?f(K02RvbQj@r5%;Me$l`$PZ}yyx2#UZ&Dyb`eKrH1a@416AbrY2#bc;_ z#t&fuJE*ms8Da;cg=%}Bq`JE8orN&k-lvE{+Y`vPr}1ZNyg;@+jXy`@1+wjFJf0PV zk3hCPjsLX93uN2V_|Is(z`5=^27jK$3yj;``9!l#GN6=&onrb0hR#4ul&+&MH*^MS zqI?}4Q$WR^ftnPej=sXs8K_BN>gb;}bOvfts5<)R44r|R6b|%0H~c)}s0OIb&1`7L z!xB(J_NcM%LOSMN+35Ta=4RnV!j1bfHD+Y}F(;v9<-8f4sWU6`qoee8p}Pc~jvMYg z%HAfFjYLh^X;{jRpyX2JOe*{W#5>(?$+34D;Z||G*ac}3r!S%tayE_hIKkr+*r=>u zKGYA_f%o>fB|PwoQWW6F!SG^;;Wo1nMXxwGYn)vYg=eAA+i=chwW)zQ(-SjWS{2H~AM-_Vs znCMDob-l_}fQ(bS2TX9UbX|5{@R5{*fz+9+crH>r+Z4|NMc<&fo~XEv5w6L~jlc@|CPh98fAgGEF#vqEMQz0h3Uui6Wgons!h~XFDbT6eWMOkzb(dw<-}8r9p?% zppdBC2D~Krx=L`W(V^4mkgVL!Gzq2(Cy5sQeN5#Cez`O7xyb}g??57`C8;KBUGD^r zx(afNXv;eNHbp^ShQDKlziWl>vch*;;qU1%`ibu|I0ZeA1i&xuOBIIxF&p^p#V#B@ z^;jeezgfj0=Lw@0Kb1!LTqcu;CB1Z1RPzdG?9V^rWhBdYXz*(m2iC zSKJeI+$9TBsfjNAXCv@~U#e&Q@-)-eN$#ANYJM~Vtt)!|y+lY3E z<~k)<;<&RxohZYC2hUuE_Zq$l(Q)TU$4S!9j8(}ouG8k2_rQpLJv zePoYvnEm-|yX<59km$HRe{13#P(s@r!z9{AlO9S;;8_mquLl?_9!8CC+UySzd3tGc9?;Mqn<>G zr)hHfAWceG4!btQjyv+L2UNjWuH#I(#J3Le!u3$u9066))Sk03?}sgx_+p3UjSkLR zKoIt}1me8dxlUgXhC#RT6X+DK58-{i92S4dD1V?g{o`QhxmQ&F-NX;JbEVIclVtD% z^jk*J)U2s4rn&Hgw6e5i`gjS4n#C=J8((qp(MxDA_?aj%z4~*&We+l9e7kc{q8JZr zzW`p!h5oDhkmTSvsqrZ1fzf%Fhe5@>iaAg=v;iVGPZErshxKzc%Ds;%w;XL^(R(p% zM#EN8Jv3GwVhcD{;me1_%^;Z;Aw@r1j#NylpxuqRZb(ZltFY)w7G4g+ML;^eDJ{saZ{sWR#TI< zMqk^{*u1U>k}3i?WvVFCm*@d9pT2$`}O;l|kAV<$N(pLxW(uI|W)CV00=UA?@y< zNSS)i+e#}lOEo-E0S!-}tewh8QXZ{5OXAsGK{_ESKnTH-I{$tF*dFZcbFm`7c z&q{7Mm4g%e2w%qVgP2~Uv;L&Nd5$x~@7oGpO4ry6kH$QIYN>AlV%JN!W3;onvSG8k)lJt~yR`I{E;R;EGdd@nZ;X-!=s=0< zy&6#rf#PrS(|ZUoDxOPO=r>V*6>m}IR4%$$we);SSv}!v>pRuoKztt_-4<7Vi%^i1 zzE;A0D3-=1nqe~*64Q5;6w@b~tZNu~{~>Xh1=ovH<;v?~B^t$ic>NWpd;_Bqi`<8) z^2VmQ#TSrwGU*w9_=K1$vmoP!8=&q(Jmp{!NhM4x zTvwvpnusuxz=aTu+0`eJd*wP4b!TWkTkV02FDG=5HpA1d!&^sBoH* zrlRJ?fb4EGG ze>U7lpO^iV1l5s#&UM~K7C7TS2oeMTR17f3A%b%q!Q2t0`?b<2&8CzHgyts^S=7cB#K&Q7(1id7!l9OT}cWV*w|6L2~A-bddCe z8Mw6oq{1f$@Ux0zePZRTastu`IdN z@(Y@1lUlK;C4C`9=8K6^(N9Aia`$J>$^<_4POqcTVrq0M%zz6(mg?lF4s!)Q)Pb^8 zYu3X-B7-Rz4e5tHFhQL$q1yy!P|U{uc?{xWS8Z0`4W}cE7*~8MO6&9NrJdIGeNPfs zSQAK$_9{}Dk73pU!|W5JTIJV6=P0$aku3-Bi3yeu32cW<@9BgaBO&?F4>|zZzI5`e z7vjWhmanVKkW|gn6m*)II!(%9pTAh~iB*Hus96r>VvbZh&q>C%7@0R#A!KbV>5Lts zBhJHTeXeS4%0yhhnp`hGmYhh2Or0tu!p(%^aOKAN2r2jGlIpkyo6QEc8XyS_$9kR= z>!ixdg2H;E$%SW$bZVxZhqQgMZA>-HK_a9rB1g^-+W}fsJ*CB4R5&H!>KIVF=3t_! zs(K62v9Vsa6s+UmJx1F_G&UJ-Yhj)4+uK{78JFsB!`LE^;@Kco`8x!(Px~GIPfznh9LkXPf+;@+_Eu;A zqn&Y3%^8n6fqu^E(9!GvG}=2Bfll;uj-_o&D%KqDbU}wiF@*=b_Ha9BQA|FA^-U$4 zOE1|VZOIOj`DezZhoffXVPe!e)M=X2K1YT)gvUAa7AXBVPLI>N)1J4%4mH}dQz^&; zR^7Q&|3%Ooi_94;#yYdFM1fNM>E>aQVTSu)I(1?>|`}Oa~u$? zkoIsqerZZ9yQnnfiS;yjt{uR!qHK^Urk(C50>wn3Qh6A~SH;F#MKDU%GD-&RqQLJRs9@R7*XF`Q9rN5#>kJ9p$|{sd|*-SZb#>^>y(d2{mD)+B6>@cfXUWvQTQi;i8#InJyTkL(WM9!bO4^l~xM)j@ z+C9x_)IJ9iJ7X+}VRQvEuI=M}U8yJTiiLX+$M+;UhKxs)k2c~A*!}8w_N&#&;Hf$< z)vtzol8rJC=5bb)wxs*eF)Xf5L5`)^BeCbQGl7F_&Ko8`&LGQ)*PMaPPHNi#y^8eN z(mjTIDLw6H4QziUlGRzl1ZP7wVSv0k!D|_K@m=A|QG5Cs<1z{AXN-&75J&&`jIkL( zVqkNEUonHoC6ofZW9-avVrozK1PwMlJj-5qJ z=6ZFdQ+ZXY@Q5fQWYgZ5;VK;r8)jB)>W$Q>Lwk6n&1+Yux*Jp!Cv?N3q?DUE)!l(} z!-W#Xd|uhRP9v=GcFQRjrQmyb9#cSC3v5J056JGE-JhpXXEYtNa92MV2 znyn*f$B&RtXpug6kY%MuaW-?rIVXib@Z};k$H%OCye#>cIsU{{I-0{r+F%YJh3n_= zi%^jN?i_wI)rYy2J(a?2BPH0(S{sn({S%={MZ917!0KMQeC&Us{x@DrU>~YmwHgP1 zf!Xm2)&rgmSlIAmND-cdAHAyIdm~cdD2KI{e`(MQ_D3k{12HR|F;DWnJnv)C3MM>jV1dZl)-F> zG_taH42BfEZw8FnwTTvNR8f1SM*+JMA&*Sr5$1j0Dw#TIZf$ao`6XETZLltta#sPB} zF`Uy-E%H8J^R65YO5d@lJ~?fG{sD~j!2{M4b*UVIG%D+S=4IKjaOPYreH|>oLo3r* zbTO3thKpgxa%)Ni>O%4$Aa*i_mg`YfuCv_bSpFMT_PCV0h#n zDedl+GhPk72X;@qiEYraX@1ua|0%htH`dLZ%RWS2Sba4z=Td(7Gcx%}a~Y1S6R!F! zHfO@4pc9n7RVlr6xIE$8TCbFYp-lelq^CwE@T`J;BEmZ1?Z`j&LK*lhq^87eS4mYO}sdt{#C{8!w37 z`#OCOAfX$M0t3vmUsT0)F0~8sWGu+oD11vLG;`Xfb=mhOS^FVYTfy58{}t!i73EoD z9cEnPKgevV@G&rPQq?WM6BYUZVqu?Z@AQqe@~d@izVC@r%)2>sYFZB47Ik?)pe|9t zy3kgSW;2_{eL1gs48qF~!~lv0M>}EBUhz+qGYQ-08}0Ni*m|gaG--AW%!?ry_jF-i zvV3CHyztVNZeH$k48OY3Z5Lso&T-(7_2JiSJw4hp_Cbo+Gjgdu$)Y?1@3lbi@gkUV zF{^PfrZj7(%|t4RY-z&_#M8JX5J~?H-MBw_f-0_qw$`kWc;w$2m9FmF;&W8fx@xo~ znQI%abspOP!{&L%>23u*Wj3eUEl#^ywUY`@lq&2K z2D*-xe;gf@>SDhT)wU~5vLzjU3>ot2@Faj@V%4qaE~GD$Roat*#MIcYoPq#)+`xCZ ziDmkqAfY>;j6msrm@ll58J0c6Dw-Nyb1@Jwk@KLt981YsnQuhOs9psZVzT9X;cL2v zl|vi9x=L&myV1jOcH_A+X7tQbQL$2sveJ`vR!WPN;K{;5S;-Gy)l!XLQSLXP^ELk) za>bkTUTLF52jx|H1DI_<(woar|YJ2GOpW`8$bLt7&Y`; za}2+sURy)%M;Y&wJaxb2N9VN)%Bp^pYb?X) zHGKW#aM*^EP*rM~NAEa1pSXc<9s7-pOdKa<2pu{ISabjOfvW0kI7ajN^?KHyTO$^e z){O5}mLQnxqHkk(_ZtQ^=n<&Z_lIml!TUEtN-Gh<+fPZohgq4CE|BH_J{A zbM+dt^I70@&HEjV8)TZX7qW~~ONr&*1ncW1(ve(#r-{fw9xg%G8FAqLGM2*CpJFep z#;t+X)Uk!c@^1~#n0yaz!ngB7@tr!ZkX-)l;iYg+lIFU@5dFu01UXYX3;y!&3@?>3 zPirD`o&T83spAW&<=-7%1C~1>3r8zChL|g$T^zw2L$C4&&d~nBwZoI)2w$VG#tzoE z6Pm!p%_>WgEbCWl04?d|cO$FnS-*v?DAlv3S1ihBu{K1 zROL)?kg>Y%c**YqoZ$n5j#6g+#s&U%ET|43DSdkoaH$ODcnrzrF{m#Ca^E*n$mmGbiIF(Oe4u=3mGDQmK$bc3kxsWO2gf57^F4I6-2? zqK;W(SA8EPlv#)$eiFh~GLGYN?as2Z5Or4lz|divPf?pZI?r>_2!s5}dr0d?;|Wpu z-Mmw@ayF8b5eO2MbC@3!nHFc+xd^fk;JVmRfVZfAf>k2N)yn%0Qd+rPfLkL0ZwY-G z!0GDHPUK1R)fahUF6M_Hhg3W|M{HJ}jsp8upM$lG>Sw@YCAuNb_3Qes^FRQOV^0Y> z-KKOR7JXONZ}%$ai+rRZA3W1#SE2(WpXt@>Ab;6U`M7WPoH_?3igWq>U%_~cW8d;_ z%JoRt1stZG5$*sAfPv;-x;x;c`nj8XT z(=)jP$}$~pS0vyYFD#8Za-P68j4BI`mPnZ}Jx)q-aCrtxg#`8~aN7J1D2j%yY}tD? z%fR;rE)o4PyS7yHEfv-4AQrK{aH&}bxKcoB*@L#J^q*+-#|0o#3|W5Fg^0CJcuISo zv!~j+5DnU^Iv4{*=`)e(%RIw=4J%3N4Ze9PBiJ7##C|3XM!yuxS$IkkyaeL?L@WXW zAIEbi}{#nDnX!yK_f7S4B8or?6iyHo& zkp8nj{z+*9sdvjO{cJ7isOiy~?>90_c#K6l0gRkP3r@B$1awb{B5-Nsex8w}G0o>qg z_{o-dGCuqqD3W^eC{Y^c@s=?&_U~Hp9=soZ9tq5WyDqg~H`keTxLm(3I#Mp%0QDtz z6Q&|2OidW(p56k$@3H+Z$6kkCB|9v76tUN3tp)2wm3iUIvjsc?4%L!!l%AV9#hsh# z8FKlZ>F5s~fZvBcUjNtO6qp9&c%CH{Uc@x$QJDq?Z%2_AT+~gf4oO8@A!1q3B6HJb~NiayVIw!d`^1)kf1e|G@ zTYvtjxLGf3o~UH$%Zy$los$D8lkt`NDI?;p-cf#^YCx}pamU_k2%|av3&PMG|1EYx z|HU}_F+uPS5}ocHjTd+@?jX_lcUAuPOn%0hUl0f5P7}BFgOS^uZQEaiGGr*T3r2WSHMj1K-d|5*1NH1}vwaw2p=^5b56DGaHmG*3p zqqzPdf2C>(Ua<@dTZs-8Od>c|1@Ue{Vw?)55bRXJG=dW~I>WHWXBi%^(&QLkM}=D$ zo}j{ch9{~pjz5Q&OvG);l%Gd2U&~=XYL?6o=rr{Fn16wvT*tiqUy&i+`5=RVjfmK*}_dAj%}_& zBrH8$={+$60@C6R5qyJ2kZ!q+W90$2!p5=kItS@uU6K7* zd7XoFwHU|B>l~!Z#W+@8=OA4##l zUQCl9Xsw2}O-z#@Xl;hJZA_COXn~<^7tQ0Uj@> zzjB&A;3S@Gx_#nhQz?$n$9TGNgT4*H|h2vLHUOS<1u<)p7%i<_7xyhRy&FIXBP`FmwiZ__=|8prJFsbIC%7J`xv4hu*P12buH?)QsQ9 z^!bL)08h_0$Xj6O4DkF?1N~q_XMiV`8|a4^Is-M+4r2L-8ae|t(-va-VTR5?&9sM@ zez>7CP%~{JrsJsu8o@pc)J(gG=|>tm12xk&V){{r&OptykC?vD&>5(iHWJg1HgpDR zrk%v}V+@^vnrSOB{a8b1pk~@jOh3-h8K{{y6Vs13bOuxdfq%dr5|@Tz#Z^nP{pSRe zpMjb*7?ob)(s1hhZIMaOK+UwHy7!|`1O<)oW0F!m;}XU8#^+sw=d;0j!2JYci`V~> z8sIwkfLLSll>Fk9&tLR7iF0HcB`3kUrt!Oozfoi6o=*6jJVI1{3q-gGH_&0-BJDih z?l^d+4)8WLxMZtu<2UE@VP3d6oP|Y(mg>KO$vf3|0r3912;ifhdMulF8}tj3OR)SY zm)yuRfXrBTm-c8~I*z-B^SV&ewBpFW>?-{QCg^ zz608dHpe*v|E9O%LQcS?Nypg+`QJxgt$OqojGdsg9j57|sON1q~#|(!l$8{ z?AonZgm>Wz;j4%T`N~&F#|Lc6i*dX4m578_5yQK#C3ZDq0XC_^zam3;4O3i;pG?pe zE`|O<;HkD3QNkL~@`JM7KYZB?&mcd90|ktnIV!wm$0vuEg|_@nm{6Y0i=%_lYUPPN z0d6f?awn}@#C_d-GzYmT3kR^8m2P+~|1!MTzBdgG%S3VA^=98kB`E~=apLOheeFF^ z6r$K3v`h7=&S^|AMmndl^B!WFF-Gh5IQN`8NQsIORlY6{KEe{0+mxqC{n7eT$EbpT zngTTOP1Uz7!Fr%uECnT*G{NUgxlH|<8Zs5xW)CVeIwUVS@66&|u?g?>ea#s}kNV%@Wgt=XKzDSy1oFpBF0>x2V! zLcssz5%?>P#dYgAw$yQ4w{{&{`vlE8m>>hRRSex3oH2qJ?TL@F7!z$-y;uKxIJ=%p z%0!v@pj?q%RRK-w7^=o4YgXeysxhffjd2ZX=w5k}OiYV7ksyt@*zN`S@Oe167fcTS zE{@)=Mu{oG6g4*N%dsJ@W4o<>b0`;);9}cMXSPOwz*l~*+ z)Y)RxKW$rVAkSg{aa;Ui&9?Y4RSSbq9`ru4E!INd0~EMnoh{ye+qQ)@D9(ABl&FPn zC{LTkuDGpqg|EOr8d?Q1nxg2_p;5sw{^Hu z_P+g=l#-J>8TuJebGoNVQF8%IO0*$@pe&EgG(?~~4W;TZotGJZ-(Is-en!1}>hwN{ zI+!M+`zxj0R!VQ(rS-_Ox@EYJuFXT#W_q1AKYw#LZN5&*ba`O6=f8TmG;@-nzLH9= zaSHKs>akIz#w1SwDyFnD-f` z86yt`#Z7E??mdMRGX|m6#m#VkQZ_Nq5K((*#v-PP9x*nxjIb9e(IZCmq@=A8K%{g8o7FvQY^I*@ z%(KQwU4k*#Rco|Boxy(k;gUbS#^lPrN4<*DHtY3zcOu2IFH0T1fL@@ud9Zo!hNN1) z(>pdsL`GN1X9u%;-+2YeZ7aV(#O&JjWV#YRcqrZ6iuD@W4W#7_O=4CR7_;|UkA3=a zy{>wOJWEI=H2h#ZeSHM0`9s$=M)|{csZElPTVrxnC!=46ZA^X~2T>ju4&u3l3mLs{ zyac+ndQso>OYWlkGXla!ZO{F^Srg=^AjzSS^zH z!KN~e4?jUA>!#Mjv;|muqv7p=?=6JOzzT1ET%5-m2JQ)!xcs=`7l2!d_ld@L;k`br zq<#`fc@8ApjoWqM#*&3R_LA+paE2hTuIh!`7+Q5yE4TLe6&B3$ILjN3o(T6>ES-z&<4Q-wJRsCoi+6iHPkEQFzEXEz1(1r{Vsc zaA(EyaL1Jwb5`-~9C-^NJev&?z8?F8?L(fT-|aO$FgS#p7oH>S`>E#q62owT)2Mu` zWBLeALE?pnH zdi9FS<`EVyBJY-X;ithV5q<{0$?(gk#K84G~-Vvml}#D`5CH?G+5 zMQplBg=kC8B!|i)td?oq?<+WN*KP4jMkTrHdf;oQb6iM$ivqVQa2p+gZS@4?+gbdm zMp93%?`u@>>j?7-5XoF)-s||j5?*VGF{4MRmzYx5lZ0!yn5<*IO0r_nVM?Scd^;8l zkiF_3P;dI2jL=MmS#wS3#K}LCio_1r+z}ILKFFX&7QD{<2Gfq`SbZg|X(K<>S zh4XPMDiej@z>m|tb0baZtk_Re?lqP) zJX5|U^1dOyniXW3W=MC06Cts~!B(~x{y2yCFmW=x&B4*|l2FXi@NgYAMs@DG!^yAj zU_;b#&T`-k6b5G?P?1Sx>_f`?*VOk~6tW6hPrFtOg1$>*64}-Fy|}?(OBXXKoJsy_ z5@(Y6!-mOrb~5<9Mcv!0cOh%mR2OE3chkb{1E*2CUwsTESndA?zt!(i#>W-<~tTEEDQKxznz9)?bgiD~Q^;HMFVdT~* zDY5)U-lKI7cqw~P_uavVe{0Fgtx-8oIED9u6FQY`AXIlM^?d&Uo2)fomacjqIA;Bh z%Kd=8l2Z9$r0?367q@c49hA}evTnkwOrd|=z1GSwQ&-da#u=y@iGXKnIH2JmA?|T3 z!TvbH$7DFX!BjYT#YB9uLlVK>$p0f0jC_7f7=KTPXyg+t(^VfJJwB)M6GoX|0;b*J zG`+~31|OZ^gh#+@aIV8^56?$02WOdr4(|dL#8~2ymI#+CgoH1&!bdST=jKSW!oq*n zgcDx)IV=2m6|Q@aKQ2(a7T$JzJ_;drm9top!E{BIa2j|VT?ozCr%+4tWV_XW3?uLKKqHB{eyIFd97_ifO{61ti zzmMQm9|fOwe#o)Ai+1=mqTyrsLH%*wv|$tZg+v+O%aei{4fsrmexqC7AKH_1k7}aD z@$t2U@KQmO7w4sGEKAi#zG|93S^R`wR9vZBJL8v8Q|gv*dcf}>+C~iWI6K&GcMJ^D zlXt5nByJBcXKM7ElbH2ODl2`;t4@jOL&92_bzPem7qLO&j7^TI2b+p9hi$w;+M6KGFPlV z4J2*&6~W^EE!esGJ0SVZ!SG6*b|GYkS0PgUJxJAO`11$+z)Y&F&mz(uUd`kz>vM>P z*Qm^BM_JvTa)e@=KT7&*nS!=hET+0nGBAFo#IKh)+PE98RJ_RhPvm_=9A8GmW87e! zy%F^>=-&Q}gy^RJLeMerJV9yTuLNq2@;3>-fZu@^@x!vP9_WvwMxoB#8qr=yj6qW}W(?xBWv>FwvuFKp zV)ELv4gzm6u!*89!JRAPYp)?qOS(&=n6UObQ29*d4S>4Oi*L#Wk#inS$PX_hlPQS74e%Ya}<}JOtlL>W2fV?!d>4+V!R3D z;ELCh*jn4gb4CxB7P6=#D~38!4h>%UheD9Xx+4wGdX;}7%*M}lxf5{wi>teR;62dY z>ihT|Sj`|_@nQG_hT8`meCq~a6oFfH0YVQy0}1?eaUNDeaL#&u z1-HDw3o#iKfqo@RiJpAa>jC+W5cOogm2a-6SGfsoWes|bUdQO=JKKO)tKvnA;El0O z62264CbaVtl@@B`r9`uqGR(3Mw&wa* zT9K@o`f6^Sb%OCmcV&m5PWMSlb;|ZjN_9Z0m{JOeo_r5;26PzRTn9{Az6v99s^8=# zP~3FM?kw%I8%_ONy^a z3i?eWy(n}%Me6ZAMEw)WV~lYxvHgn$e1vI7(F!*Qv` z6qSjLslJCvSstz>Nj^jlL^@`uOu`TEhnlPs4Z%-Qc#avng2%eb#uQuD4?A+Ix7mG~JyrM-_?5uT6n zjDYbrUEK&tbqh*YH;yBar|!>MZ+Llz)p)RSJ#7`d<=owpuFe!z=OfZ3X3cw<>a04o z8qJ!iYyvvw$f|9~yisZH)>vCvdlKn8l}(vCZcA%SznMv&l(Y0!dOSXh0NWiP;C3o6 zc32MuTyy$w==2F0v!|*$uJ%%OzcL3v+A{BGr8m{}8sLxTy)CFA$88A!SNFW7kw~{C z(*bT}(hCCVnOBeqTkA63025#?XK2VfSM%6f!+D065Hv3#>aZk0xbB`^CI(-o!y~XH z0q<=z&uult1(2fe_Jq_?5@^1XNQWh%4ohN$ue3WeW`sQEfjlPXBex`l+#Sdta7PVs zDqi9{Yq$#`M-uC>WYA&Bq{EUC;d^Xd$OO7DKXhSM>cVWi*FmyCmt7I3PP=Ki zyM}vcxTl7D5mGnFpyf&?9hQtbESYs!80fGtLHHS4Pcnp_aZ}@VPTFi`?;a>aBqMzQB;aUQ7MT9?P-*YrEiiZy3ee`%eY9UtkjzJQy zb}W9wJJ1nUk5gH&pBa9W@#A$Icjbn6S_rOH@gMLj*YTY3CLz|dswe0?a~#Dv5q?Yh z*gdi0r$l`_61Bplsh)^jtNoARw|WwO!tX@VAVX#QuCT!~laAlj5Wl-2{=J6y_f>pX zlm7>ZYsHsFdMpt=`XfE=kxViD<3c|@qTeg@NT>UhjJWLg3t~^hKl~x$N@!g60pU3q z@%&MgCeHWc2p8x3q~tp*%J)E&Cf4_CNpnt=1_wbgK1TZfRHC?hUe{IiGm`#1ravD) zA-08(KBg}h`h^kw=MD7F3jK4We;z;KgAMeHg#Lwyj+5Hp&*vX3T{>MHf4$1ZAmfXZ z^eoQEgT5bfAt8Y$vG5_JpN47iB}kGBA4V*%zc4ooSE*bIY~_pi!T047;bjPv$7PC1 zgfAyjE=dW0$xKf7&z$ZDGSx2uKjIhV^n9?}*|lHI2dOJujoV)zUe^*Ye0d4a9OXH6 z>Ly1gBXxa*MO}Qc5?B9ebs-Ipn0N!E`<@`tlOLU2J*Eft36d?(%*dc*34Xr~UuJs* znl+RPuijvmn~`T7y*Gn?K|QZ^JGfB2=&XXV|z)BVfH60SlSrqRIQ#V_#TZkv=8EUu}c-``7HWmMQ zN_X`dM7yqy+T690=DH}&qexTNtvYeqm6G;`DDAI@r2V$$8$Je7qI#2L_-d5lH;ow@ z(tl0T-x8(&ZDaaam)j)i*O^q>`s0mBExm7-wBLx*J~1S1gC2KChHpk0o@~s}kp50d z|E(zfQ;q2#gfM6)9ud;%J&nB8A0P^s!kC|S_Fx0ypYA4W z_kftJ-Yfa;W4`hP%u9t=EuY&s}Bg~C&c^|KjH7l`{xL)f%k)w?-$Icc|RnW zhl$a=e<_$ph*^c7@b_!U`%%gFYv$9u9}~=Ph|#=%E11WL8OnRE6Yhl8%awv>AXA?I zroucJU9hJjq{^;HfNhw20CHGo%3#I%4@g^k0xVf}i^sF%(HOVqDqUFhL?k9`>j?3b6XA7)cnXg2Izl`(iSRl?yjD%wOh>i_ zo@J!dJgI#EX{%4^FxMXkV3SSRSBFp2@qULN?A!kyzo28m8#FYm@M)*f?Zs9e5h5%tpa2E}+k@rp&6>66tVho|Zm!0<7XLe><_DHSuk z9T{VGkeNA!w}%-fl7dc(`OwzWCRum$TNnj7Yn z0Xa9s>8bF~uu@jOO5T$$mBeUWxPcG1EJ!7x9pd=c^H%t;66X0^5dOx94!^)K`lP?W zs>~!b#Gh}78@fqv=o0T7#9kwGpXv0Cr8!EXT1n=)QO=DnD3k3Qm@j@>1N{CepSh_IG;aG#+4-M{tf5ZnYwge%hcLKz%a*!Gm6l!LLE(yuT{xgAUWDoTx`FY%5f>%T!`|KANgu}~j> zhZl91MQ!2hp|rOzE}W{qhcHa?J^-J6(`Yw16Uuz_W2UUE#*gvi%~O>R5aqYi=@9bm zbb3TFDW07Wx4`&EzqtN93R8vovI-+KS13Q*ATpdkEv6rj>;C2mC< zAL8MM{*4_v=nwzKy`Dqpb^g7k{_k+7x&^j?ma(^Vs&6qUoe}3sV_=(I#J@T!9t2_J z#m6XcYiL&OuX1c|MVj3tO*kRVX=n9TpOeAnw6Bjq`-Y|^9W+d5Z}3cnQ*m4vx0z!p z$MI`P2o8PzjME zysoxdL^y26k5tUIPIU~zGO)hP!4z`XUwj;Jf3fSOP#LwkrC-B6dfBi8KM*J3u?V;5 z@Hm9?PRb2C5lDOCcz{fsE8G8fyEUv5Wo27Ed<9ax@KyY-JdJMp8bXQib^KP>MWS#5 ze!8%Z8sgJE*>Dnm-0(7aXrQ04A5(r7P6lZu&U}r6BYlSsF#`QA()k=Q1)0h?qOcyI zIxmkVat@n_J5v7dt%3g!Nbek+<8mHxj}zjBLBB%|<>O;?72E~m%aQ z&wzq_TS&gn!7Vl1O2fGtZmr=wfis;|I0-gN-oRjebq;Q$>Dy|!orc?MxPyi}3d9tw zax#jHU3U3?Rd@@u#pG!*>VS7C4x!&%PrutS-?^&)&R#ebMM|i8qZcH@S6MvxQ^J`H zJr7d;dj+_m%BCTO8(xV>E>+zCk!pw^mgfdc5x)ey8-4}9)eV961mVSqYL`mP{`^qn zk-tQ_>?Xr*P(sYx)j_cv*)GJ^{HbC!j(z5IfG+Ptq@^4_56)*9aQ=)>%2^zcOt|PA zJg1J6zZ?%3qr#0KBZSMUpXv-Hc_t;RHntD=9V#~Q!aKw$;VdTK1V8xJ^rj|^^O1tz z42ZnOGmK?MCzY;lj$j6#`Irq@?ZuDs32d9e7dr=c)^HaMchzt=4R;sF@_icm946&U z$aU9P7!lXSaS1tdcRO@!Nt8EFhgTz%cX5g$vb7jInUNQphBNoj^y!h(!*5c~=b_UP z)G1NkC0XzbsX{uW9$^bBzy+#7heFa{K4lH&uVciT%z4cirADqo=_mg~bvQ@Y;TEjJ zEu%WzL)X!s8t$dx-Wu+s;l3K~r{Vq@9-!fY8XlzKe1Wtt`}rg7I>(7cm^Z3#9ORgh zlKRHo+p(#WBi0-aEJTixOs%nw&x`ALholnE>aeRh=2u9pMg2A~(N%0S`CqKtt#sYa zW!>V_UAlcP&~eioN`}y>9eOBTi1d|tFlXty)4(c+KFad67cuhWljx}biU76^*md~m zJ0ic74oiN}cUl=`l)yW{93{3@l~u$GgWrYSAQ63ktL_`yRNshim$arT+ld|>&_hmz zx1h&tEwqUX=L`AXuffAJ(u#1%ebtvt$(7v_SYle3UUfwSHtBTlo?g{kk41@`?oEf( zU9y0unh8T{Bnijw#B6XjZf5Bxkq%2AtfoJ$$p634J9rY z{I$ zC^ADEg=!q~p;4<*wBYH+e2}Y<#v=m0bhZP^Sxi1NWl07xew4Hy=k7;woe*CFOL6(H zvLli#UELWZi)=SJX+tvODZ>8>ErnF7kd13JZb^K;XdE+l0xvYBodLRhxnB_PE#p2# zjO1BiF5NtPXq*lQHs)Kv!&f7>x=9qDi*XsK)9H`G(k#k=yF6b6<~XV2mfrgiF67|} zL1DBtniL9+wa-c1aX>dVL2Tph1$0A&-dN6TMhc?0W5>FT~vB}i7@M(bGl1_!SMW)bJ_|uh#Gy4X@SkIt{PaaHWPfXn3QBH);4)4R6-)YZ~67;jJ3prs3B$ zyj{a@Xn2Q)-_-C<4Zo$~w>A8ZhTqljE)DP2@Ov75U&9}0c#nqn3gmuu6*qP8p`df{ zK25t{!yjt+BMpD7;R71}M8ls7RZ-IuyDdP6gC7wC3+-qUD;>sb?#mC+M#XNl8 z=<@Jx9QK${skCGuBw6MQp6GN|>w7c_)K* z_%14{@;F3=hf_>D)-IC{OyKle{Ccr%YSzMYNLI%(9daERUoK0-XJ(&;lxbNMmk*Mq zfT{?J%jcXBl;`2gmMJiam(MwOEN_U*uef|pTg$~>eRFfz^1K+2oaKB(!>8NV)8u_4 zazTIM3>OXY_+zDNe_mB zJKodakFspOawS9W0EeynAX81&+XP?Q!_8LeZjt+;*eAp;e}sJOliUJ?UptBNPv#HR z!am6*K&N80;CYhd6e^XjQ~)xS#rU1oT74h9)0yyHh*ujVhuRr+n58M=nw^-7Q~f|? zd~dk2$g#fas3Cp1Ch;H~kI7q+wwC*Q2 zix-&H5WNfH?Ca=1pAtXol=j!l1xCMiD%>FK?B(LK5u)QC z;6^(nf#%<2{-FEV1zu=bwFWxQ%WPWQ4(hj9ZRKt`j+T3`Yj!m@M}ew_~~zKU2YNO=eS>SQmx31qW} zlu_G9T=NQ_1y9*@D5m;OLT{RBufkukt%w7-=`ewAEW8BfEM~�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - Test1 - False - 11 - - - True - full - False - False - OutputDir1 - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - Test1\bin\Release\ - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll deleted file mode 100644 index ae969cedb0c4830b4430a00441dbd39f319caed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506120 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�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - OutputDir2 - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - Test2\bin\Release\ - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/FsAndFsiFiles.fsproj b/tests/service/data/FsAndFsiFiles.fsproj deleted file mode 100644 index a31365c73f1..00000000000 --- a/tests/service/data/FsAndFsiFiles.fsproj +++ /dev/null @@ -1,63 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - bin\$(Configuration)\ - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - - - - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Malformed.fsproj b/tests/service/data/Malformed.fsproj deleted file mode 100644 index 1079189f2d5..00000000000 --- a/tests/service/data/Malformed.fsproj +++ /dev/null @@ -1 +0,0 @@ -Not even slightly like a project diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj deleted file mode 100644 index 4aef2e13364..00000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj +++ /dev/null @@ -1,79 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 252a5848-1864-43fd-8fde-aab146410dee - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5 - true - ConsoleApplication1 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ConsoleApplication1.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\ConsoleApplication1.xml - true - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - ConsoleApplication2 - {31b31546-8348-4be1-9890-1f17ba70fd21} - True - - - ConsoleApplication3 - {24795688-ce64-4475-a326-3175f1a40f68} - True - - - - 11 - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj deleted file mode 100644 index f70cb6693ad..00000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 31b31546-8348-4be1-9890-1f17ba70fd21 - Exe - ConsoleApplication2 - ConsoleApplication2 - v4.5 - true - ConsoleApplication2 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ConsoleApplication2.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\ConsoleApplication2.xml - true - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - ConsoleApplication3 - {24795688-ce64-4475-a326-3175f1a40f68} - True - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj b/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj deleted file mode 100644 index b285b3505c1..00000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - Debug - AnyCPU - {24795688-CE64-4475-A326-3175F1A40F68} - Exe - Properties - ConsoleApplication3 - ConsoleApplication3 - v4.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib1.fs b/tests/service/data/ScriptProject/BaseLib1.fs deleted file mode 100644 index d3be7d2a54e..00000000000 --- a/tests/service/data/ScriptProject/BaseLib1.fs +++ /dev/null @@ -1,3 +0,0 @@ -module BaseLib1 - -let add2 x = x + 2 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib2.fs b/tests/service/data/ScriptProject/BaseLib2.fs deleted file mode 100644 index 3277193dd5f..00000000000 --- a/tests/service/data/ScriptProject/BaseLib2.fs +++ /dev/null @@ -1,3 +0,0 @@ -module BaseLib2 - -let add10 x = x + 10 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib1.fsx b/tests/service/data/ScriptProject/Lib1.fsx deleted file mode 100644 index 53833dc65c1..00000000000 --- a/tests/service/data/ScriptProject/Lib1.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib1.fs" -let add3 = BaseLib1.add2 >> ((+) 1) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib2.fsx b/tests/service/data/ScriptProject/Lib2.fsx deleted file mode 100644 index 7f6261cf09e..00000000000 --- a/tests/service/data/ScriptProject/Lib2.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib1.fs" -let add4 = BaseLib1.add2 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib3.fs b/tests/service/data/ScriptProject/Lib3.fs deleted file mode 100644 index 8524ace2599..00000000000 --- a/tests/service/data/ScriptProject/Lib3.fs +++ /dev/null @@ -1,3 +0,0 @@ -module Lib3 - -let add6 = ((+) 6) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib4.fs b/tests/service/data/ScriptProject/Lib4.fs deleted file mode 100644 index 108bfbc45db..00000000000 --- a/tests/service/data/ScriptProject/Lib4.fs +++ /dev/null @@ -1,3 +0,0 @@ -module Lib4 - -let add8 = ((+) 8) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib5.fsx b/tests/service/data/ScriptProject/Lib5.fsx deleted file mode 100644 index ec2ecacb183..00000000000 --- a/tests/service/data/ScriptProject/Lib5.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib2.fs" -let add12 = BaseLib2.add10 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main1.fsx b/tests/service/data/ScriptProject/Main1.fsx deleted file mode 100644 index 90086fc76d6..00000000000 --- a/tests/service/data/ScriptProject/Main1.fsx +++ /dev/null @@ -1,4 +0,0 @@ -#load "Lib1.fsx" -#load "Lib2.fsx" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main2.fsx b/tests/service/data/ScriptProject/Main2.fsx deleted file mode 100644 index 906fd5d19ce..00000000000 --- a/tests/service/data/ScriptProject/Main2.fsx +++ /dev/null @@ -1,6 +0,0 @@ -#load "Lib1.fsx" -#load "Lib2.fsx" -#load "Lib3.fs" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" -Lib3.add6 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main3.fsx b/tests/service/data/ScriptProject/Main3.fsx deleted file mode 100644 index 8df731bd958..00000000000 --- a/tests/service/data/ScriptProject/Main3.fsx +++ /dev/null @@ -1,4 +0,0 @@ -#load "Lib3.fs" -#load "Lib4.fs" -Lib3.add6 5 |> printfn "%i" -Lib4.add8 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/Main4.fsx b/tests/service/data/ScriptProject/Main4.fsx deleted file mode 100644 index 6da860748fb..00000000000 --- a/tests/service/data/ScriptProject/Main4.fsx +++ /dev/null @@ -1,6 +0,0 @@ -#load "Lib5.fsx" -#load "Lib1.fsx" -#load "Lib2.fsx" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" -Lib5.add12 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/MainBad.fsx b/tests/service/data/ScriptProject/MainBad.fsx deleted file mode 100644 index 52b4ce4e8a7..00000000000 --- a/tests/service/data/ScriptProject/MainBad.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "Nonexistent1.fsx" -#r "Nonexistent.dll" diff --git a/tests/service/data/Space in name.fsproj b/tests/service/data/Space in name.fsproj deleted file mode 100644 index 36ff02de930..00000000000 --- a/tests/service/data/Space in name.fsproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - Exe - Test2 - Test2 - Test2 - False - ..\..\..\$(Configuration)\net40\bin - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.4.3.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Test1.fsproj b/tests/service/data/Test1.fsproj deleted file mode 100644 index 11917790084..00000000000 --- a/tests/service/data/Test1.fsproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - bin\$(Configuration)\ - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Test2.fsproj b/tests/service/data/Test2.fsproj deleted file mode 100644 index fff033794e4..00000000000 --- a/tests/service/data/Test2.fsproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - ..\..\..\$(Configuration)\net40\bin - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Test3.fsproj b/tests/service/data/Test3.fsproj deleted file mode 100644 index 5ea53f2766c..00000000000 --- a/tests/service/data/Test3.fsproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - ..\..\..\$(Configuration)\net40\bin - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/ToolsVersion12.fsproj b/tests/service/data/ToolsVersion12.fsproj deleted file mode 100644 index 96156711bc4..00000000000 --- a/tests/service/data/ToolsVersion12.fsproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 00000000-0000-0000-0000-000000000002 - Exe - Main - Main - v4.7.2 - Main - - - true - full - false - false - bin - DEBUG;TRACE - 3 - AnyCPU - false - - - pdbonly - true - true - bin - TRACE - 3 - AnyCPU - false - - - - - - - - - - 11 - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/testscript.fsx b/tests/service/data/testscript.fsx deleted file mode 100644 index 3b0c82647f2..00000000000 --- a/tests/service/data/testscript.fsx +++ /dev/null @@ -1 +0,0 @@ -let x = 1 \ No newline at end of file From 340e41e717ac196cead919f4e7e0eff41a628194 Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:18:16 +0200 Subject: [PATCH 16/37] Ensure `frameworkTcImportsCache` mutations are threadsafe (#17795) * ensure all frameworkTcImportsCache mutations are threadsafe * rn * not needed --- docs/release-notes/.FSharp.Compiler.Service/9.0.200.md | 1 + src/Compiler/Service/IncrementalBuild.fs | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index 5ef93105656..d681f5aa1b7 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -1,5 +1,6 @@ ### Fixed +* Ensure `frameworkTcImportsCache` mutations are threadsafe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) ### Added diff --git a/src/Compiler/Service/IncrementalBuild.fs b/src/Compiler/Service/IncrementalBuild.fs index b7560b222c2..6b7f3c4d24d 100644 --- a/src/Compiler/Service/IncrementalBuild.fs +++ b/src/Compiler/Service/IncrementalBuild.fs @@ -507,10 +507,12 @@ type FrameworkImportsCache(size) = let frameworkTcImportsCache = AgedLookup>(size, areSimilar=(fun (x, y) -> x = y)) /// Reduce the size of the cache in low-memory scenarios - member _.Downsize() = frameworkTcImportsCache.Resize(AnyCallerThread, newKeepStrongly=0) + member _.Downsize() = lock gate <| fun () -> + frameworkTcImportsCache.Resize(AnyCallerThread, newKeepStrongly=0) /// Clear the cache - member _.Clear() = frameworkTcImportsCache.Clear AnyCallerThread + member _.Clear() = lock gate <| fun () -> + frameworkTcImportsCache.Clear AnyCallerThread /// This function strips the "System" assemblies from the tcConfig and returns a age-cached TcImports for them. member _.GetNode(tcConfig: TcConfig, frameworkDLLs: AssemblyResolution list, nonFrameworkResolutions: AssemblyResolution list) = From 05cf88673f59c802438b7f6e213bab5cd47946b7 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Thu, 26 Sep 2024 22:21:06 +0200 Subject: [PATCH 17/37] Turn off realsig when building product and proto (#17798) Co-authored-by: Kevin Ransom (msft) --- eng/Build.ps1 | 2 +- eng/build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Build.ps1 b/eng/Build.ps1 index 08a241c0424..483b60b10df 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -71,7 +71,7 @@ param ( [switch]$sourceBuild, [switch]$skipBuild, [switch]$compressAllMetadata, - [switch]$buildnorealsig, + [switch]$buildnorealsig = $true, [switch]$verifypackageshipstatus = $false, [parameter(ValueFromRemainingArguments = $true)][string[]]$properties) diff --git a/eng/build.sh b/eng/build.sh index da10ebfc4f0..c4abb23f6f1 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -71,7 +71,7 @@ skip_analyzers=false skip_build=false prepare_machine=false source_build=false -buildnorealsig=false +buildnorealsig=true properties="" docker=false From 94f9b40a352e7fa82a16aeae8798cfed6001925d Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Fri, 27 Sep 2024 00:07:52 +0200 Subject: [PATCH 18/37] Bugfix for extension methods: Treat System.Private.CoreLib as a system lib for extension method search (#17799) * Treat System.Private.CoreLib as a system lib for extension method search * usessdkrefs is not a valid option for desktop compiler * notes * Revert "notes" This reverts commit dca40aee91a23be6726c4e2325bea34fba4c5cfe. * Release notes back * get rid of looksLikeSystemAssembly in ilread, it is not needed --------- Co-authored-by: Kevin Ransom (msft) --- .../.FSharp.Compiler.Service/9.0.200.md | 2 +- src/Compiler/AbstractIL/ilread.fs | 14 +++----------- .../FSharpScriptTests.fs | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index d681f5aa1b7..c9eab44f27f 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -1,5 +1,5 @@ ### Fixed - +* Fix extension methods support for non-reference system assemblies ([PR #17799](https://github.com/dotnet/fsharp/pull/17799)) * Ensure `frameworkTcImportsCache` mutations are threadsafe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) ### Added diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 7ffa71feeee..5bedfe05752 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -2144,11 +2144,6 @@ and typeDefReader ctxtH : ILTypeDefStored = else let mutable attrIdx = attrsStartIdx - let looksLikeSystemAssembly = - ctxt.fileName.EndsWith("System.Runtime.dll") - || ctxt.fileName.EndsWith("mscorlib.dll") - || ctxt.fileName.EndsWith("netstandard.dll") - while attrIdx <= attrsEndIdx && not containsExtensionMethods do let mutable addr = ctxt.rowAddr TableNames.CustomAttribute attrIdx // skip parentIndex to read typeIndex @@ -2159,12 +2154,9 @@ and typeDefReader ctxtH : ILTypeDefStored = let name = if attrTypeIndex.tag = cat_MethodDef then // the ExtensionAttribute constructor can be cat_MethodDef if the metadata is read from the assembly - // in which the corresponding attribute is defined -- from the system library - if not looksLikeSystemAssembly then - "" - else - let _, (_, nameIdx, namespaceIdx, _, _, _) = seekMethodDefParent ctxt attrCtorIdx - readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) + // in which the corresponding attribute is defined + let _, (_, nameIdx, namespaceIdx, _, _, _) = seekMethodDefParent ctxt attrCtorIdx + readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) else let mutable addr = ctxt.rowAddr TableNames.MemberRef attrCtorIdx let mrpTag = seekReadMemberRefParentIdx ctxt mdv &addr diff --git a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs index 50c354da629..08fa3ec324d 100644 --- a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs +++ b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs @@ -352,6 +352,22 @@ tInput.Length let value = opt.Value Assert.Equal(4L, downcast value.ReflectionValue) + [] // usessdkrefs is not a valid option for desktop compiler + member _.``ML - use assembly with ref dependencies and without refing SMemory``() = + let code = """ +#r "nuget:Microsoft.ML.OnnxTransformer,1.4.0" + +open System +open System.Numerics.Tensors +let inputValues = [| 12.0; 10.0; 17.0; 5.0 |] +let tInput = new DenseTensor(inputValues.AsMemory(), new ReadOnlySpan([|4|])) +tInput.Length +""" + use script = new FSharpScript(additionalArgs=[| "/usesdkrefs-" |]) + let opt = script.Eval(code) |> getValue + let value = opt.Value + Assert.Equal(4L, downcast value.ReflectionValue) + [] member _.``System.Device.Gpio - Ensure we reference the runtime version of the assembly``() = let code = """ From 36b3ba56b83092455c01e90d6c1dbc39699e3375 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 00:46:08 +0100 Subject: [PATCH 19/37] Better error reporting for `CE` `match!` (#17789) * Better error reporting for `CE` `match!` * release notes --- .../.FSharp.Compiler.Service/9.0.200.md | 1 + .../Checking/Expressions/CheckExpressions.fs | 2 +- .../Language/ComputationExpressionTests.fs | 51 +++++++++++++++++++ tests/fsharp/typecheck/sigs/neg104.vsbsl | 4 +- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index c9eab44f27f..24b85706238 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -10,5 +10,6 @@ * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) * Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) * Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779)) +* Better ranges for CE `match!`. ([PR #17789](https://github.com/dotnet/fsharp/pull/17789)) ### Breaking Changes diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index d0f758967de..d2df1aff642 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -6004,7 +6004,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) | SynExpr.DoBang (trivia = { DoBangKeyword = m }) - | SynExpr.MatchBang (range = m) + | SynExpr.MatchBang (trivia = { MatchBangKeyword = m }) | SynExpr.WhileBang (range = m) | SynExpr.LetOrUseBang (trivia = { LetOrUseBangKeyword = m }) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 027ad51ee4c..319d79aa8ea 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -442,4 +442,55 @@ query { |> shouldFail |> withDiagnostics [ (Error 3143, Line 4, Col 5, Line 4, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Bind' method(match!)`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + match! r2 with + | Ok x -> return x + | Error e -> return e + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 23, Col 9, Line 23, Col 15, "This control construct may only be used if the computation expression builder defines a 'Bind' method") + ] + + [] + let ``This construct may only be used within computation expressions(match!)`` () = + Fsx """ +let run r2 r3 = + match! r2 with + | Ok x -> x + | Error e -> e + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 750, Line 3, Col 5, Line 3, Col 11, "This construct may only be used within computation expressions") ] \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg104.vsbsl b/tests/fsharp/typecheck/sigs/neg104.vsbsl index 12c1c451d3e..8a6059aa128 100644 --- a/tests/fsharp/typecheck/sigs/neg104.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg104.vsbsl @@ -19,9 +19,9 @@ neg104.fs(35,19,35,20): parse error FS0010: Unexpected symbol '}' in definition. neg104.fs(36,1,36,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file -neg104.fs(8,9,8,30): typecheck error FS0750: This construct may only be used within computation expressions +neg104.fs(8,9,8,15): typecheck error FS0750: This construct may only be used within computation expressions -neg104.fs(10,9,10,30): typecheck error FS0750: This construct may only be used within computation expressions +neg104.fs(10,9,10,15): typecheck error FS0750: This construct may only be used within computation expressions neg104.fs(20,9,20,15): typecheck error FS0025: Incomplete pattern matches on this expression. From 0a5901fd9c02b4c3b066678a1f7b68ce5939b774 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sat, 28 Sep 2024 11:15:43 -0700 Subject: [PATCH 20/37] Fix 17786 (#17791) --- src/FSharp.Build/Microsoft.FSharp.NetSdk.props | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/FSharp.Build/Microsoft.FSharp.NetSdk.props index 792df8e2356..c4b5228dfd4 100644 --- a/src/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -130,6 +130,18 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and true + + + CompileBefore + + + + CompileAfter + + + + CompileLast + From 86b7584deb10e57492e73c00e62784e9d9455fe7 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Mon, 30 Sep 2024 10:30:30 +0200 Subject: [PATCH 21/37] Respect generic arity in method uniqueness (#17804) --- .../.FSharp.Compiler.Service/9.0.200.md | 3 +++ src/Compiler/AbstractIL/il.fs | 1 + .../FSharpScriptTests.fs | 14 ++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index 24b85706238..b7a5021f6e3 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -1,7 +1,10 @@ ### Fixed + +* Fix internal error when calling 'AddSingleton' and other overloads only differing in generic arity ([PR #17804](https://github.com/dotnet/fsharp/pull/17804)) * Fix extension methods support for non-reference system assemblies ([PR #17799](https://github.com/dotnet/fsharp/pull/17799)) * Ensure `frameworkTcImportsCache` mutations are threadsafe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) + ### Added diff --git a/src/Compiler/AbstractIL/il.fs b/src/Compiler/AbstractIL/il.fs index b10a119fced..3c70f5eb93f 100644 --- a/src/Compiler/AbstractIL/il.fs +++ b/src/Compiler/AbstractIL/il.fs @@ -5700,6 +5700,7 @@ let resolveILMethodRefWithRescope r (td: ILTypeDef) (mref: ILMethodRef) = mref.CallingConv = md.CallingConv && (md.Parameters, argTypes) ||> List.lengthsEqAndForall2 (fun p1 p2 -> r p1.Type = p2) + && md.GenericParams.Length = mref.GenericArity && // REVIEW: this uses equality on ILType. For CMOD_OPTIONAL this is not going to be correct r md.Return.Type = retType) diff --git a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs index 08fa3ec324d..f7587333981 100644 --- a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs +++ b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs @@ -502,3 +502,17 @@ test pfloat "1.234" let opt = script.Eval(code) |> getValue let value = opt.Value Assert.True(true = downcast value.ReflectionValue) + + [] + member _.``Nuget package with method duplicates differing only in generic arity``() = + // regression test for: https://github.com/dotnet/fsharp/issues/17796 + // Was an internal error + let code = """ +#r "nuget: Microsoft.Extensions.DependencyInjection.Abstractions" +open Microsoft.Extensions.DependencyInjection +let add (col:IServiceCollection) = + col.AddSingleton() +""" + use script = new FSharpScript(additionalArgs=[| |]) + let _value,diag = script.Eval(code) + Assert.Empty(diag) From d0d4c0fc3d2a69c9d8300cc214eaaf02fe936b2d Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:15:11 +0200 Subject: [PATCH 22/37] Remove unused `useSyntaxTreeCache` option (#17768) --- docs/builder-caches.md | 13 ------------- .../.FSharp.Compiler.Service/9.0.200.md | 1 + docs/release-notes/.VisualStudio/17.12.md | 1 + src/Compiler/Service/BackgroundCompiler.fs | 6 ++---- src/Compiler/Service/BackgroundCompiler.fsi | 3 +-- src/Compiler/Service/IncrementalBuild.fs | 11 +++-------- src/Compiler/Service/IncrementalBuild.fsi | 3 +-- src/Compiler/Service/TransparentCompiler.fs | 6 ++---- src/Compiler/Service/TransparentCompiler.fsi | 3 +-- src/Compiler/Service/service.fs | 11 ++--------- src/Compiler/Service/service.fsi | 3 --- ...iler.Service.SurfaceArea.netstandard20.debug.bsl | 2 +- ...er.Service.SurfaceArea.netstandard20.release.bsl | 2 +- tests/FSharp.Test.Utilities/ProjectGeneration.fs | 2 -- vsintegration/src/FSharp.Editor/FSharp.Editor.resx | 3 +-- .../LanguageService/LanguageService.fs | 4 ---- .../src/FSharp.Editor/Options/EditorOptions.fs | 2 -- .../src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.de.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.es.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.it.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf | 5 ++--- .../src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf | 5 ++--- .../FSharp.UIResources/AdvancedOptionsControl.xaml | 2 +- .../LanguageServicePerformanceOptionControl.xaml | 5 +---- .../src/FSharp.UIResources/Strings.Designer.cs | 9 --------- vsintegration/src/FSharp.UIResources/Strings.resx | 3 --- .../src/FSharp.UIResources/xlf/Strings.cs.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.de.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.es.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.fr.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.it.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.ja.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.ko.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.pl.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.pt-BR.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.ru.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.tr.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf | 5 ----- .../src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf | 5 ----- 47 files changed, 45 insertions(+), 180 deletions(-) delete mode 100644 docs/builder-caches.md diff --git a/docs/builder-caches.md b/docs/builder-caches.md deleted file mode 100644 index 13a72eb815e..00000000000 --- a/docs/builder-caches.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: IncrementalBuilder caches -category: Language Service Internals -categoryindex: 300 -index: 1300 ---- -# IncrementalBuilder SyntaxTree cache - -Incremental builder keeps in a cache at most one `ParsedInput` for each file it parses. -This behavior can be toggled with `useSyntaxTreeCache` parameter. - -Memory impact of this feature can be in range of tens of MB for larger solutions. This can be inspected in memory profiling tools by searching for `ParsedInput` instances. -When partial checking is enabled, implementation files backed by signature will not be parsed or cached, as expected. diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index b7a5021f6e3..f282c6ae800 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -11,6 +11,7 @@ ### Changed * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) +* Remove non-functional useSyntaxTreeCache option. ([PR #17768](https://github.com/dotnet/fsharp/pull/17768)) * Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) * Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779)) * Better ranges for CE `match!`. ([PR #17789](https://github.com/dotnet/fsharp/pull/17789)) diff --git a/docs/release-notes/.VisualStudio/17.12.md b/docs/release-notes/.VisualStudio/17.12.md index c53417cbf6e..83df7173b2e 100644 --- a/docs/release-notes/.VisualStudio/17.12.md +++ b/docs/release-notes/.VisualStudio/17.12.md @@ -6,6 +6,7 @@ ### Changed * Fix unwanted navigation on hover [PR #17592](https://github.com/dotnet/fsharp/pull/17592)) +* Remove non-functional useSyntaxTreeCache option. ([PR #17768](https://github.com/dotnet/fsharp/pull/17768)) ### Breaking Changes diff --git a/src/Compiler/Service/BackgroundCompiler.fs b/src/Compiler/Service/BackgroundCompiler.fs index a2f5457b1b6..1089f5774e8 100644 --- a/src/Compiler/Service/BackgroundCompiler.fs +++ b/src/Compiler/Service/BackgroundCompiler.fs @@ -266,8 +266,7 @@ type internal BackgroundCompiler parallelReferenceResolution, captureIdentifiersWhenParsing, getSource: (string -> Async) option, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) as self = let beforeFileChecked = Event() @@ -403,8 +402,7 @@ type internal BackgroundCompiler parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) match builderOpt with diff --git a/src/Compiler/Service/BackgroundCompiler.fsi b/src/Compiler/Service/BackgroundCompiler.fsi index 9ca174a5686..d93ece6217b 100644 --- a/src/Compiler/Service/BackgroundCompiler.fsi +++ b/src/Compiler/Service/BackgroundCompiler.fsi @@ -235,8 +235,7 @@ type internal BackgroundCompiler = parallelReferenceResolution: ParallelReferenceResolution * captureIdentifiersWhenParsing: bool * getSource: (string -> Async) option * - useChangeNotifications: bool * - useSyntaxTreeCache: bool -> + useChangeNotifications: bool -> BackgroundCompiler static member ActualCheckFileCount: int diff --git a/src/Compiler/Service/IncrementalBuild.fs b/src/Compiler/Service/IncrementalBuild.fs index 6b7f3c4d24d..29059b4873b 100644 --- a/src/Compiler/Service/IncrementalBuild.fs +++ b/src/Compiler/Service/IncrementalBuild.fs @@ -888,7 +888,6 @@ type IncrementalBuilderInitialState = defaultTimeStamp: DateTime mutable isImportsInvalidated: bool useChangeNotifications: bool - useSyntaxTreeCache: bool } static member Create @@ -910,8 +909,7 @@ type IncrementalBuilderInitialState = #endif allDependencies, defaultTimeStamp: DateTime, - useChangeNotifications: bool, - useSyntaxTreeCache + useChangeNotifications: bool ) = let initialState = @@ -937,7 +935,6 @@ type IncrementalBuilderInitialState = defaultTimeStamp = defaultTimeStamp isImportsInvalidated = false useChangeNotifications = useChangeNotifications - useSyntaxTreeCache = useSyntaxTreeCache } #if !NO_TYPEPROVIDERS importsInvalidatedByTypeProvider.Publish.Add(fun () -> initialState.isImportsInvalidated <- true) @@ -1409,8 +1406,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) = let useSimpleResolutionSwitch = "--simpleresolution" @@ -1652,8 +1648,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc #endif allDependencies, defaultTimeStamp, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) let builder = IncrementalBuilder(initialState, IncrementalBuilderState.Create(initialState)) diff --git a/src/Compiler/Service/IncrementalBuild.fsi b/src/Compiler/Service/IncrementalBuild.fsi index 21b2fb23404..0f8ed5582da 100644 --- a/src/Compiler/Service/IncrementalBuild.fsi +++ b/src/Compiler/Service/IncrementalBuild.fsi @@ -296,8 +296,7 @@ type internal IncrementalBuilder = parallelReferenceResolution: ParallelReferenceResolution * captureIdentifiersWhenParsing: bool * getSource: (string -> Async) option * - useChangeNotifications: bool * - useSyntaxTreeCache: bool -> + useChangeNotifications: bool -> Async /// Generalized Incremental Builder. This is exposed only for unit testing purposes. diff --git a/src/Compiler/Service/TransparentCompiler.fs b/src/Compiler/Service/TransparentCompiler.fs index e3acd1d4c6c..5158ac7f25c 100644 --- a/src/Compiler/Service/TransparentCompiler.fs +++ b/src/Compiler/Service/TransparentCompiler.fs @@ -326,8 +326,7 @@ type internal TransparentCompiler parallelReferenceResolution, captureIdentifiersWhenParsing, getSource: (string -> Async) option, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) as self = let documentSource = @@ -374,8 +373,7 @@ type internal TransparentCompiler parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) :> IBackgroundCompiler diff --git a/src/Compiler/Service/TransparentCompiler.fsi b/src/Compiler/Service/TransparentCompiler.fsi index be1f5ab64fa..7746445c0af 100644 --- a/src/Compiler/Service/TransparentCompiler.fsi +++ b/src/Compiler/Service/TransparentCompiler.fsi @@ -155,8 +155,7 @@ type internal TransparentCompiler = parallelReferenceResolution: ParallelReferenceResolution * captureIdentifiersWhenParsing: bool * getSource: (string -> Async) option * - useChangeNotifications: bool * - useSyntaxTreeCache: bool -> + useChangeNotifications: bool -> TransparentCompiler member FindReferencesInFile: diff --git a/src/Compiler/Service/service.fs b/src/Compiler/Service/service.fs index 2c915870f84..525faf3be3d 100644 --- a/src/Compiler/Service/service.fs +++ b/src/Compiler/Service/service.fs @@ -125,7 +125,6 @@ type FSharpChecker captureIdentifiersWhenParsing, getSource, useChangeNotifications, - useSyntaxTreeCache, useTransparentCompiler ) = @@ -144,8 +143,7 @@ type FSharpChecker parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) :> IBackgroundCompiler else @@ -162,8 +160,7 @@ type FSharpChecker parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) :> IBackgroundCompiler @@ -209,7 +206,6 @@ type FSharpChecker ?parallelReferenceResolution: bool, ?captureIdentifiersWhenParsing: bool, ?documentSource: DocumentSource, - ?useSyntaxTreeCache: bool, ?useTransparentCompiler: bool ) = @@ -238,8 +234,6 @@ type FSharpChecker | Some(DocumentSource.Custom _) -> true | _ -> false - let useSyntaxTreeCache = defaultArg useSyntaxTreeCache true - if keepAssemblyContents && enablePartialTypeChecking then invalidArg "enablePartialTypeChecking" "'keepAssemblyContents' and 'enablePartialTypeChecking' cannot be both enabled." @@ -261,7 +255,6 @@ type FSharpChecker | Some(DocumentSource.Custom f) -> Some f | _ -> None), useChangeNotifications, - useSyntaxTreeCache, useTransparentCompiler ) diff --git a/src/Compiler/Service/service.fsi b/src/Compiler/Service/service.fsi index 0a6c601344c..0e48a0d6360 100644 --- a/src/Compiler/Service/service.fsi +++ b/src/Compiler/Service/service.fsi @@ -38,7 +38,6 @@ type public FSharpChecker = /// Indicates whether to resolve references in parallel. /// When set to true we create a set of all identifiers for each parsed file which can be used to speed up finding references. /// Default: FileSystem. You can use Custom source to provide a function that will return the source for a given file path instead of reading it from the file system. Note that with this option the FSharpChecker will also not monitor the file system for file changes. It will expect to be notified of changes via the NotifyFileChanged method. - /// Default: true. Indicates whether to keep parsing results in a cache. /// Default: false. Indicates whether we use a new experimental background compiler. This does not yet support all features static member Create: ?projectCacheSize: int * @@ -54,8 +53,6 @@ type public FSharpChecker = ?captureIdentifiersWhenParsing: bool * [] ?documentSource: DocumentSource * - [] ?useSyntaxTreeCache: - bool * [] ?useTransparentCompiler: bool -> FSharpChecker diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index a53af559138..da62302304a 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -2138,7 +2138,7 @@ FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] Dependen FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] get_DependencyFiles() FSharp.Compiler.CodeAnalysis.FSharpChecker: Boolean UsesTransparentCompiler FSharp.Compiler.CodeAnalysis.FSharpChecker: Boolean get_UsesTransparentCompiler() -FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) +FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Instance FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker get_Instance() FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpProjectOptions GetProjectOptionsFromCommandLineArgs(System.String, System.String[], Microsoft.FSharp.Core.FSharpOption`1[System.DateTime], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index a53af559138..da62302304a 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -2138,7 +2138,7 @@ FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] Dependen FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] get_DependencyFiles() FSharp.Compiler.CodeAnalysis.FSharpChecker: Boolean UsesTransparentCompiler FSharp.Compiler.CodeAnalysis.FSharpChecker: Boolean get_UsesTransparentCompiler() -FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) +FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Instance FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker get_Instance() FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpProjectOptions GetProjectOptionsFromCommandLineArgs(System.String, System.String[], Microsoft.FSharp.Core.FSharpOption`1[System.DateTime], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean]) diff --git a/tests/FSharp.Test.Utilities/ProjectGeneration.fs b/tests/FSharp.Test.Utilities/ProjectGeneration.fs index c8cc066daa7..78feb049435 100644 --- a/tests/FSharp.Test.Utilities/ProjectGeneration.fs +++ b/tests/FSharp.Test.Utilities/ProjectGeneration.fs @@ -944,7 +944,6 @@ type ProjectWorkflowBuilder ?checker: FSharpChecker, ?useGetSource, ?useChangeNotifications, - ?useSyntaxTreeCache, ?useTransparentCompiler, ?runTimeout, ?autoStart, @@ -973,7 +972,6 @@ type ProjectWorkflowBuilder enablePartialTypeChecking = defaultArg enablePartialTypeChecking true, captureIdentifiersWhenParsing = true, documentSource = (if useGetSource then DocumentSource.Custom getSource else DocumentSource.FileSystem), - useSyntaxTreeCache = defaultArg useSyntaxTreeCache false, useTransparentCompiler = useTransparentCompiler )) diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx index 6678a2d98e3..26b96dcc405 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx @@ -212,8 +212,7 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) +Enable fast find references & rename (restart required) Advanced diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 0e8e5ec4912..18cb516b6a9 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -117,8 +117,6 @@ type internal FSharpWorkspaceServiceFactory [] let enableLiveBuffers = editorOptions.Advanced.IsUseLiveBuffersEnabled - let useSyntaxTreeCache = editorOptions.LanguageServicePerformance.UseSyntaxTreeCache - let enableInMemoryCrossProjectReferences = editorOptions.LanguageServicePerformance.EnableInMemoryCrossProjectReferences @@ -158,7 +156,6 @@ type internal FSharpWorkspaceServiceFactory [] TelemetryEvents.LanguageServiceStarted, [| nameof enableLiveBuffers, enableLiveBuffers - nameof useSyntaxTreeCache, useSyntaxTreeCache nameof enableParallelReferenceResolution, enableParallelReferenceResolution nameof enableInMemoryCrossProjectReferences, enableInMemoryCrossProjectReferences nameof enableFastFindReferences, enableFastFindReferences @@ -199,7 +196,6 @@ type internal FSharpWorkspaceServiceFactory [] })) else DocumentSource.FileSystem), - useSyntaxTreeCache = useSyntaxTreeCache, useTransparentCompiler = useTransparentCompiler ) diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index e178610a614..ef67e6482ba 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -89,7 +89,6 @@ type LanguageServicePerformanceOptions = EnableParallelReferenceResolution: bool EnableFastFindReferencesAndRename: bool EnablePartialTypeChecking: bool - UseSyntaxTreeCache: bool KeepAllBackgroundResolutions: bool KeepAllBackgroundSymbolUses: bool EnableBackgroundItemKeyStoreAndSemanticClassification: bool @@ -104,7 +103,6 @@ type LanguageServicePerformanceOptions = EnableParallelReferenceResolution = false EnableFastFindReferencesAndRename = true EnablePartialTypeChecking = true - UseSyntaxTreeCache = FSharpExperimentalFeaturesEnabledAutomatically KeepAllBackgroundResolutions = false KeepAllBackgroundSymbolUses = false EnableBackgroundItemKeyStoreAndSemanticClassification = true diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf index a3f8a6866da..421cc037111 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Možnosti výkonu pro ukládání do mezipaměti a projekt F#; +Enable fast find references & rename (restart required) + Možnosti výkonu pro ukládání do mezipaměti a projekt F#; Povolit odkazy mezi projekty v paměti; Povolit_částečnou_kontrolu_typu; Možnosti výkonu pro IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf index 3e4406c116a..ff2a415b3a0 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Optionen zur F#-Projekt- und Cacheleistung; +Enable fast find references & rename (restart required) + Optionen zur F#-Projekt- und Cacheleistung; Proj_ektübergreifende Verweise im Arbeitsspeicher aktivieren; Aktivieren der partiellen Typüberprüfung; Optionen zur IntelliSense-Leistung; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf index c5bfa64a6a9..5df84b54acc 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Opciones de rendimiento de almacenamiento en caché y proyectos de F#; +Enable fast find references & rename (restart required) + Opciones de rendimiento de almacenamiento en caché y proyectos de F#; Habilitar referencias entre proyectos en memoria; Enable_partial_type_checking; Opciones de rendimiento de IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf index c005861d9d2..efe15d65037 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Options relatives aux performances de la mise en cache et des projets F#; +Enable fast find references & rename (restart required) + Options relatives aux performances de la mise en cache et des projets F#; Activer les références de projet croisé en mémoire; Enable_partial_type_checking; Options relatives aux performances d’IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf index eb46a794f9a..ca32c029946 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Opzioni per le prestazioni di memorizzazione nella cache e progetti F#; +Enable fast find references & rename (restart required) + Opzioni per le prestazioni di memorizzazione nella cache e progetti F#; _Abilita i riferimenti tra progetti in memoria; Abilita il controllo parziale dei tipi; Opzioni per le prestazioni IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf index 4f7b8bd5bb6..44ca609e1cd 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - F# プロジェクトとキャッシュのパフォーマンス オプション; +Enable fast find references & rename (restart required) + F# プロジェクトとキャッシュのパフォーマンス オプション; メモリ内のプロジェクト間参照を有効にする; Enable_partial_type_checking; IntelliSense のパフォーマンス オプション; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf index 79baefda419..66cfbeed575 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - F# 프로젝트 및 캐싱 성능 옵션; +Enable fast find references & rename (restart required) + F# 프로젝트 및 캐싱 성능 옵션; 메모리 내 크로스 프로젝트 참조 사용; Enable_partial_type_checking; IntelliSense 성능 옵션; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf index 6d450552e60..1675887bd6d 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Opcje wydajności projektu i buforowania języka F#; +Enable fast find references & rename (restart required) + Opcje wydajności projektu i buforowania języka F#; Włącz odwołania między projektami w pamięci; Włącz_częściową_kontrolę_typu; Opcje wydajności funkcji IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf index 7c8333a532d..f6770d970de 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Projeto em F# e opções de desempenho em cache; +Enable fast find references & rename (restart required) + Projeto em F# e opções de desempenho em cache; _Habilitar referências de projeto cruzado na memória; Habilitar verificação parcial de tipo; Opções de desempenho do IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf index d08337f4b20..bc8554237a8 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - Параметры производительности проекта и кэширования F#; +Enable fast find references & rename (restart required) + Параметры производительности проекта и кэширования F#; Включить перекрестные ссылки проектов в памяти; Enable_partial_type_checking; Параметры производительности IntelliSense; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf index f5b0b5efe44..cf2198ba7d3 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - F# Proje ve Önbelleğe Alma Performansı Seçenekleri; +Enable fast find references & rename (restart required) + F# Proje ve Önbelleğe Alma Performansı Seçenekleri; Bellek içi çapraz proje başvurularını etkinleştir; Kısmi_tür_denetlemeyi_etkinleştir; IntelliSense Performans Seçenekleri; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf index 0ef2ccbe69e..16a89acc021 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - F# 项目和缓存性能选项; +Enable fast find references & rename (restart required) + F# 项目和缓存性能选项; 启用内存中跨项目引用; Enable_partial_type_checking; IntelliSense 性能选项; diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf index c415e1e0f18..932d4de3e61 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf @@ -174,9 +174,8 @@ Time until stale results are used (in milliseconds); Parallelization (requires restart); Enable parallel type checking with signature files; Enable parallel reference resolution; -Enable fast find references & rename (restart required); -Cache parsing results (experimental) - F# 專案與快取效能選項; +Enable fast find references & rename (restart required) + F# 專案與快取效能選項; 允許記憶體內跨專案參考; 啟用部分型別檢查; IntelliSense 效能選項; diff --git a/vsintegration/src/FSharp.UIResources/AdvancedOptionsControl.xaml b/vsintegration/src/FSharp.UIResources/AdvancedOptionsControl.xaml index 7374280f296..9ca2756d7d9 100644 --- a/vsintegration/src/FSharp.UIResources/AdvancedOptionsControl.xaml +++ b/vsintegration/src/FSharp.UIResources/AdvancedOptionsControl.xaml @@ -5,7 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="400"> + d:DesignHeight="600" d:DesignWidth="400"> diff --git a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml index a5c5f1c0b6f..8671fe16434 100644 --- a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml @@ -6,7 +6,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="400"> + d:DesignHeight="600" d:DesignWidth="400"> @@ -48,9 +48,6 @@ - diff --git a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs index 816ef8529ab..e0244a62086 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs +++ b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs @@ -636,15 +636,6 @@ public static string Unused_opens_code_fix { } } - /// - /// Looks up a localized string similar to Cache parsing results (experimental). - /// - public static string Use_syntax_tree_cache { - get { - return ResourceManager.GetString("Use_syntax_tree_cache", resourceCulture); - } - } - /// /// Looks up a localized string similar to Use Transparent Compiler (restart required). /// diff --git a/vsintegration/src/FSharp.UIResources/Strings.resx b/vsintegration/src/FSharp.UIResources/Strings.resx index 0320ddffdec..61b3bab1750 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.resx +++ b/vsintegration/src/FSharp.UIResources/Strings.resx @@ -261,9 +261,6 @@ Send additional performance telemetry - - Cache parsing results (experimental) - Enable partial type checking diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf index 95dc810a26a..0c938e3f447 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf @@ -327,11 +327,6 @@ Použít transparentní kompilátor (vyžaduje se restart) - - Cache parsing results (experimental) - Výsledky analýzy mezipaměti (experimentální) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf index 6e201a60236..99bac691cac 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf @@ -327,11 +327,6 @@ Transparenten Compiler verwenden (Neustart erforderlich) - - Cache parsing results (experimental) - Cacheanalyseergebnisse (experimentell) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf index 937fea2e341..5ae03505500 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf @@ -327,11 +327,6 @@ Uso del compilador transparente (es necesario reiniciar) - - Cache parsing results (experimental) - Resultados del análisis de la caché (experimental) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf index dd4be9eef28..283e9d5d0f8 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf @@ -327,11 +327,6 @@ Utiliser Transparent Compiler (redémarrage requis) - - Cache parsing results (experimental) - Résultats de l'analyse du cache (expérimental) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf index e62949f4fdd..9c534e8f8dd 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf @@ -327,11 +327,6 @@ Usa il compilatore Transparent (riavvio necessario) - - Cache parsing results (experimental) - Risultati dell'analisi della cache (sperimentale) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf index 69f5861f1a2..0e0bb91c628 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf @@ -327,11 +327,6 @@ Transparent Compiler を使用する (再起動が必要) - - Cache parsing results (experimental) - キャッシュ解析の結果 (試験段階) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf index 74e14a586c5..0d92ba2bb3a 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf @@ -327,11 +327,6 @@ 투명한 컴파일러 사용(다시 시작해야 함) - - Cache parsing results (experimental) - 캐시 구문 분석 결과(실험적) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf index e2da85eb9c9..16ab9bfc3a1 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf @@ -327,11 +327,6 @@ Użyj kompilatora przezroczystego (wymagane ponowne uruchomienie) - - Cache parsing results (experimental) - Wyniki analizy pamięci podręcznej (eksperymentalne) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf index 21ff767429b..82976646315 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf @@ -327,11 +327,6 @@ Use o Compilador Transparente (é necessário reiniciar) - - Cache parsing results (experimental) - Resultados da análise de cache (experimental) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf index 861bdc7d935..737584669c1 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf @@ -327,11 +327,6 @@ Использовать прозрачный компилятор (требуется перезагрузка) - - Cache parsing results (experimental) - Результаты анализа кэша (экспериментальная функция) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf index b94552de1fe..d6763de0ed5 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf @@ -327,11 +327,6 @@ Saydam Derleyiciyi kullan (yeniden başlatma gereklidir) - - Cache parsing results (experimental) - Ayrıştırma sonuçlarını önbelleğe al (deneysel) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf index 662eee779b1..917893a6b9c 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf @@ -327,11 +327,6 @@ 使用透明编译器(需要重启) - - Cache parsing results (experimental) - 缓存分析结果(实验性) - - \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf index 569cbc1694a..0eeef704704 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf @@ -327,11 +327,6 @@ 使用透明編譯器 (需要重新啟動) - - Cache parsing results (experimental) - 快取剖析結果 (實驗性) - - \ No newline at end of file From aa6fd83d710330c5ff284b45bdf698c9d86b882b Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:16:19 +0200 Subject: [PATCH 23/37] Improve StartWithContinuations test in AsyncType tests (#17767) --- .../Microsoft.FSharp.Control/AsyncType.fs | 82 ++++++------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs index 29d086d0f20..950432ccc8e 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs @@ -11,74 +11,46 @@ open Xunit open System.Threading open System.Threading.Tasks -type RunWithContinuationsTest_WhatToDo = - | Exit - | Cancel - | Throw +module AsyncType = -type AsyncType() = + type ExpectedContinuation = Success | Exception | Cancellation - let ignoreSynchCtx f = - f () + [] + let startWithContinuations() = - [] - let mutable spinloop = true - - let waitASec (t:Task) = - let result = t.Wait(TimeSpan(hours=0,minutes=0,seconds=1)) - Assert.True(result, "Task did not finish after waiting for a second.") + let cont actual expected _ = + if expected <> actual then + failwith $"expected {expected} continuation, but ran {actual}" - [] - member _.StartWithContinuations() = + let onSuccess = cont Success + let onException = cont Exception + let onCancellation = cont Cancellation - let mutable whatToDo = Exit + let expect expected computation = + Async.StartWithContinuations(computation, onSuccess expected, onException expected, onCancellation expected) - let asyncWorkflow() = - async { - let currentState = whatToDo - - // Act - let result = - match currentState with - | Exit -> 1 - | Cancel -> Async.CancelDefaultToken() - sleep(1 * 1000) - 0 - | Throw -> raise <| System.Exception("You asked me to do it!") - - return result - } + async { + Async.CancelDefaultToken() + return () + } |> expect Cancellation - let onSuccess x = - match whatToDo with - | Cancel | Throw - -> Assert.Fail("Expected onSuccess but whatToDo was not Exit", [| whatToDo |]) - | Exit - -> () + async { failwith "computation failed" } |> expect Exception - let onException x = - match whatToDo with - | Exit | Cancel - -> Assert.Fail("Expected onException but whatToDo was not Throw", [| whatToDo |]) - | Throw -> () + async { return () } |> expect Success - let onCancel x = - match whatToDo with - | Exit | Throw - -> Assert.Fail("Expected onCancel but whatToDo was not Cancel", [| whatToDo |]) - | Cancel -> () - // Run it once. - whatToDo <- Exit - Async.StartWithContinuations(asyncWorkflow(), onSuccess, onException, onCancel) - whatToDo <- Cancel - Async.StartWithContinuations(asyncWorkflow(), onSuccess, onException, onCancel) +type AsyncType() = - whatToDo <- Throw - Async.StartWithContinuations(asyncWorkflow(), onSuccess, onException, onCancel) + let ignoreSynchCtx f = + f () - () + [] + let mutable spinloop = true + + let waitASec (t:Task) = + let result = t.Wait(TimeSpan(hours=0,minutes=0,seconds=1)) + Assert.True(result, "Task did not finish after waiting for a second.") [] member _.AsyncRunSynchronouslyReusesThreadPoolThread() = From a902b21387f38a901d50a127cc0b39c5917ca3af Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Mon, 30 Sep 2024 16:16:59 +0200 Subject: [PATCH 24/37] Rendering AllowsRefStruct for type parameters (#17706) --- .../.FSharp.Compiler.Service/9.0.100.md | 3 +- src/Compiler/Checking/ConstraintSolver.fs | 2 + .../Checking/Expressions/CheckExpressions.fs | 1 + src/Compiler/Checking/NicePrint.fs | 15 +++++- src/Compiler/Checking/PostInferenceChecks.fs | 1 + src/Compiler/Checking/SignatureHash.fs | 1 + src/Compiler/Checking/TypeHierarchy.fs | 6 ++- src/Compiler/Checking/TypeRelations.fs | 19 ++++---- src/Compiler/Checking/import.fs | 2 + src/Compiler/TypedTree/TypedTree.fs | 3 ++ src/Compiler/TypedTree/TypedTree.fsi | 3 ++ src/Compiler/TypedTree/TypedTreeOps.fs | 8 +++- src/Compiler/TypedTree/TypedTreePickle.fs | 22 +++++---- .../TooltipTests.fs | 47 ++++++++++++++++++- tests/FSharp.Test.Utilities/Assert.fs | 6 +++ 15 files changed, 113 insertions(+), 26 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md index b98195c81d7..d350b30edbe 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.100.md @@ -35,10 +35,11 @@ * Enable FSharp 9.0 Language Version ([Issue #17497](https://github.com/dotnet/fsharp/issues/17438)), [PR](https://github.com/dotnet/fsharp/pull/17500))) * Enable LanguageFeature.EnforceAttributeTargets in F# 9.0. ([Issue #17514](https://github.com/dotnet/fsharp/issues/17558), [PR #17516](https://github.com/dotnet/fsharp/pull/17558)) * Parser: better recovery for unfinished patterns ([PR #17231](https://github.com/dotnet/fsharp/pull/17231), [PR #17232](https://github.com/dotnet/fsharp/pull/17232))) -* Enable consuming generic arguments defined as `allows ref struct` in C# ([Issue #17597](https://github.com/dotnet/fsharp/issues/17597) +* Enable consuming generic arguments defined as `allows ref struct` in C# ([Issue #17597](https://github.com/dotnet/fsharp/issues/17597), display them in tooltips [PR #17706](https://github.com/dotnet/fsharp/pull/17706)) * Trivia for SynTypeConstraint.WhereTyparNotSupportsNull. ([Issue #17721](https://github.com/dotnet/fsharp/issues/17721), [PR #17745](https://github.com/dotnet/fsharp/pull/17745)) * Trivia for SynType.WithNull. ([Issue #17720](https://github.com/dotnet/fsharp/issues/17720), [PR #17745](https://github.com/dotnet/fsharp/pull/17745)) + ### Changed * Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385)) diff --git a/src/Compiler/Checking/ConstraintSolver.fs b/src/Compiler/Checking/ConstraintSolver.fs index 196a62c3fec..f9ed37fe9ca 100644 --- a/src/Compiler/Checking/ConstraintSolver.fs +++ b/src/Compiler/Checking/ConstraintSolver.fs @@ -1024,6 +1024,7 @@ and SolveTypMeetsTyparConstraints (csenv: ConstraintSolverEnv) ndeep m2 trace ty | TyparConstraint.IsDelegate(aty, bty, m2) -> SolveTypeIsDelegate csenv ndeep m2 trace ty aty bty | TyparConstraint.IsNonNullableStruct m2 -> SolveTypeIsNonNullableValueType csenv ndeep m2 trace ty | TyparConstraint.IsUnmanaged m2 -> SolveTypeIsUnmanaged csenv ndeep m2 trace ty + | TyparConstraint.AllowsRefStruct _ -> CompleteD | TyparConstraint.IsReferenceType m2 -> SolveTypeIsReferenceType csenv ndeep m2 trace ty | TyparConstraint.RequiresDefaultConstructor m2 -> SolveTypeRequiresDefaultConstructor csenv ndeep m2 trace ty | TyparConstraint.SimpleChoice(tys, m2) -> SolveTypeChoice csenv ndeep m2 trace ty tys @@ -2465,6 +2466,7 @@ and CheckConstraintImplication (csenv: ConstraintSolverEnv) tpc1 tpc2 = | TyparConstraint.NotSupportsNull _, TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _, TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | TyparConstraint.SimpleChoice (tys1, _), TyparConstraint.SimpleChoice (tys2, _) -> ListSet.isSubsetOf (typeEquiv g) tys1 tys2 diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index d2df1aff642..f0656173c79 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -5163,6 +5163,7 @@ and TcPatLongIdentActivePatternCase warnOnUpper (cenv: cenv) (env: TcEnv) vFlags | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.DefaultsTo (ty = Unit) + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.MayResolveMember _ -> true // Any other kind of constraint is incompatible with unit. diff --git a/src/Compiler/Checking/NicePrint.fs b/src/Compiler/Checking/NicePrint.fs index ccb99f12139..812837a3edd 100644 --- a/src/Compiler/Checking/NicePrint.fs +++ b/src/Compiler/Checking/NicePrint.fs @@ -773,8 +773,13 @@ module PrintTypes = | _ -> if denv.abbreviateAdditionalConstraints then wordL (tagKeyword "when") ^^ wordL(tagText "") - elif denv.shortConstraints then - LeftL.leftParen ^^ wordL (tagKeyword "requires") ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen + elif denv.shortConstraints then + match cxs with + | (_,TyparConstraint.AllowsRefStruct _) :: _ -> + // If the first constraint is 'allows ref struct', we do not want to prefix it with 'requires', because that just reads wrong. + LeftL.leftParen ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen + | _ -> + LeftL.leftParen ^^ wordL (tagKeyword "requires") ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen else wordL (tagKeyword "when") ^^ sepListL (wordL (tagKeyword "and")) cxsL @@ -834,6 +839,12 @@ module PrintTypes = [wordL (tagKeyword "unmanaged")] else [wordL (tagKeyword "unmanaged") |> longConstraintPrefix] + + | TyparConstraint.AllowsRefStruct _ -> + if denv.shortConstraints then + [wordL (tagKeyword "allows ref struct")] + else + [wordL (tagKeyword "allows ref struct") |> longConstraintPrefix] | TyparConstraint.IsReferenceType _ -> if denv.shortConstraints then diff --git a/src/Compiler/Checking/PostInferenceChecks.fs b/src/Compiler/Checking/PostInferenceChecks.fs index 06ef1b9766a..e9860a76efa 100644 --- a/src/Compiler/Checking/PostInferenceChecks.fs +++ b/src/Compiler/Checking/PostInferenceChecks.fs @@ -448,6 +448,7 @@ and CheckTypeConstraintDeep cenv f g env x = | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> () diff --git a/src/Compiler/Checking/SignatureHash.fs b/src/Compiler/Checking/SignatureHash.fs index f3f81b2fee3..66aeb0912c7 100644 --- a/src/Compiler/Checking/SignatureHash.fs +++ b/src/Compiler/Checking/SignatureHash.fs @@ -165,6 +165,7 @@ module rec HashTypes = | TyparConstraint.SimpleChoice(tys, _) -> tpHash @@ 12 @@ (tys |> hashListOrderIndependent (hashTType g)) | TyparConstraint.RequiresDefaultConstructor _ -> tpHash @@ 13 | TyparConstraint.NotSupportsNull(_) -> tpHash @@ 14 + | TyparConstraint.AllowsRefStruct _ -> tpHash @@ 15 /// Hash type parameter constraints let private hashConstraints (g: TcGlobals) cxs = diff --git a/src/Compiler/Checking/TypeHierarchy.fs b/src/Compiler/Checking/TypeHierarchy.fs index 0805fcaf09b..ddccdddd637 100644 --- a/src/Compiler/Checking/TypeHierarchy.fs +++ b/src/Compiler/Checking/TypeHierarchy.fs @@ -284,6 +284,7 @@ let FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.SimpleChoice _ | TyparConstraint.RequiresDefaultConstructor _ -> vacc @@ -411,7 +412,9 @@ let ImportReturnTypeFromMetadata amap m nullnessSource ilTy scoref tinst minst = let CopyTyparConstraints m tprefInst (tporig: Typar) = tporig.Constraints - |> List.map (fun tpc -> + // F# does not have escape analysis for authoring 'allows ref struct' generic code. Therefore, typar is not copied, can only come from C# authored code + |> List.filter (fun tp -> match tp with | TyparConstraint.AllowsRefStruct _ -> false | _ -> true) + |> List.map (fun tpc -> match tpc with | TyparConstraint.CoercesTo(ty, _) -> TyparConstraint.CoercesTo (instType tprefInst ty, m) @@ -433,6 +436,7 @@ let CopyTyparConstraints m tprefInst (tporig: Typar) = TyparConstraint.IsNonNullableStruct m | TyparConstraint.IsUnmanaged _ -> TyparConstraint.IsUnmanaged m + | TyparConstraint.AllowsRefStruct _ -> failwith "impossible, filtered above" | TyparConstraint.IsReferenceType _ -> TyparConstraint.IsReferenceType m | TyparConstraint.SimpleChoice (tys, _) -> diff --git a/src/Compiler/Checking/TypeRelations.fs b/src/Compiler/Checking/TypeRelations.fs index 16ed5e9f9d3..b52a1da1574 100644 --- a/src/Compiler/Checking/TypeRelations.fs +++ b/src/Compiler/Checking/TypeRelations.fs @@ -151,19 +151,13 @@ let ChooseTyparSolutionAndRange (g: TcGlobals) amap (tp:Typar) = match tpc with | TyparConstraint.CoercesTo(x, m) -> join m x, m - | TyparConstraint.MayResolveMember(_traitInfo, m) -> - (maxTy, isRefined), m | TyparConstraint.SimpleChoice(_, m) -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInPrintf(), m)) (maxTy, isRefined), m | TyparConstraint.SupportsNull m -> ((addNullnessToTy KnownWithNull maxTy), isRefined), m - | TyparConstraint.NotSupportsNull m -> - (maxTy, isRefined), m // NOTE: this doesn't "force" non-nullness, since it is the default choice in 'obj' or 'int' | TyparConstraint.SupportsComparison m -> join m g.mk_IComparable_ty, m - | TyparConstraint.SupportsEquality m -> - (maxTy, isRefined), m | TyparConstraint.IsEnum(_, m) -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInEnum(), m)) (maxTy, isRefined), m @@ -175,12 +169,15 @@ let ChooseTyparSolutionAndRange (g: TcGlobals) amap (tp:Typar) = | TyparConstraint.IsUnmanaged m -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInUnmanaged(), m)) (maxTy, isRefined), m - | TyparConstraint.RequiresDefaultConstructor m -> - (maxTy, isRefined), m - | TyparConstraint.IsReferenceType m -> + | TyparConstraint.NotSupportsNull m // NOTE: this doesn't "force" non-nullness, since it is the default choice in 'obj' or 'int' + | TyparConstraint.SupportsEquality m + | TyparConstraint.AllowsRefStruct m + | TyparConstraint.RequiresDefaultConstructor m + | TyparConstraint.IsReferenceType m + | TyparConstraint.MayResolveMember(_, m) + | TyparConstraint.DefaultsTo(_,_, m) -> (maxTy, isRefined), m - | TyparConstraint.DefaultsTo(_priority, _ty, m) -> - (maxTy, isRefined), m) + ) if g.langVersion.SupportsFeature LanguageFeature.DiagnosticForObjInference then match tp.Kind with diff --git a/src/Compiler/Checking/import.fs b/src/Compiler/Checking/import.fs index 68e3512864b..1c1b0ed9ea1 100644 --- a/src/Compiler/Checking/import.fs +++ b/src/Compiler/Checking/import.fs @@ -653,6 +653,8 @@ let ImportILGenericParameters amap m scoref tinst (nullableFallback:Nullness.Nul TyparConstraint.IsNonNullableStruct(m) if gp.HasReferenceTypeConstraint then TyparConstraint.IsReferenceType(m) + if gp.HasAllowsRefStruct then + TyparConstraint.AllowsRefStruct(m) for ilTy in gp.Constraints do TyparConstraint.CoercesTo(ImportILType amap m importInst (rescopeILType scoref ilTy), m) ] diff --git a/src/Compiler/TypedTree/TypedTree.fs b/src/Compiler/TypedTree/TypedTree.fs index daf31357df3..b948e91fb65 100644 --- a/src/Compiler/TypedTree/TypedTree.fs +++ b/src/Compiler/TypedTree/TypedTree.fs @@ -2531,6 +2531,9 @@ type TyparConstraint = /// A constraint that a type is .NET unmanaged type | IsUnmanaged of range: range + + /// An anti-constraint indicating that ref structs (e.g. Span<>) are allowed here + | AllowsRefStruct of range:range // %+A formatting is used, so this is not needed //[] diff --git a/src/Compiler/TypedTree/TypedTree.fsi b/src/Compiler/TypedTree/TypedTree.fsi index 3ba4f5c12ba..d357895728d 100644 --- a/src/Compiler/TypedTree/TypedTree.fsi +++ b/src/Compiler/TypedTree/TypedTree.fsi @@ -1694,6 +1694,9 @@ type TyparConstraint = /// A constraint that a type is .NET unmanaged type | IsUnmanaged of range: range + /// An anti-constraint indicating that ref structs (e.g. Span<>) are allowed here + | AllowsRefStruct of range: range + override ToString: unit -> string [] diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index 333b29cd78f..e7c4576b24e 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -272,7 +272,8 @@ and remapTyparConstraintsAux tyenv cs = | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ | TyparConstraint.NotSupportsNull _ - | TyparConstraint.IsUnmanaged _ + | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> Some x) @@ -1039,6 +1040,7 @@ and typarConstraintsAEquivAux erasureFlag g aenv tpc1 tpc2 = | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _, TyparConstraint.AllowsRefStruct _ | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false @@ -2345,6 +2347,7 @@ and accFreeInTyparConstraint opts tpc acc = | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.RequiresDefaultConstructor _ -> acc and accFreeInTrait opts (TTrait(tys, _, _, argTys, retTy, _, sln)) acc = @@ -2480,6 +2483,7 @@ and accFreeInTyparConstraintLeftToRight g cxFlag thruFlag acc tpc = | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> acc @@ -4223,6 +4227,8 @@ module DebugPrint = wordL (tagText "not null") |> constraintPrefix | TyparConstraint.IsUnmanaged _ -> wordL (tagText "unmanaged") |> constraintPrefix + | TyparConstraint.AllowsRefStruct _ -> + wordL (tagText "allows ref struct") |> constraintPrefix | TyparConstraint.SimpleChoice(tys, _) -> bracketL (sepListL (sepL (tagText "|")) (List.map (auxTypeL env) tys)) |> constraintPrefix | TyparConstraint.RequiresDefaultConstructor _ -> diff --git a/src/Compiler/TypedTree/TypedTreePickle.fs b/src/Compiler/TypedTree/TypedTreePickle.fs index 9ade306d77c..9515d49b80d 100644 --- a/src/Compiler/TypedTree/TypedTreePickle.fs +++ b/src/Compiler/TypedTree/TypedTreePickle.fs @@ -1612,19 +1612,22 @@ let p_tyar_constraint x st = | TyparConstraint.SupportsComparison _ -> p_byte 10 st | TyparConstraint.SupportsEquality _ -> p_byte 11 st | TyparConstraint.IsUnmanaged _ -> p_byte 12 st - | TyparConstraint.NotSupportsNull _ -> - failwith "NotSupportsNull constraints should only be emitted to streamB" + + | TyparConstraint.NotSupportsNull _ + | TyparConstraint.AllowsRefStruct _ -> + failwith $"%A{x} constraints should only be emitted to streamB" -// Some extra F# 5.0 constraints are stored in stream B, these will be ignored by earlier F# compilers +// Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers let p_tyar_constraintB x st = match x with | TyparConstraint.NotSupportsNull _ -> p_byteB 1 st - | _ -> failwith "only NotSupportsNull constraints should be emitted to streamB" + | TyparConstraint.AllowsRefStruct _ -> p_byteB 2 st + | _ -> failwith "only NotSupportsNull and AllowsRefStruct constraints should be emitted to streamB" let p_tyar_constraints cxs st = - let cxs1, cxs2 = cxs |> List.partition (function TyparConstraint.NotSupportsNull _ -> false | _ -> true) + let cxs1, cxs2 = cxs |> List.partition (function TyparConstraint.NotSupportsNull _ | TyparConstraint.AllowsRefStruct _ -> false | _ -> true) p_list p_tyar_constraint cxs1 st - // Some extra F# 5.0 constraints are stored in stream B, these will be ignored by earlier F# compilers + // Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers p_listB p_tyar_constraintB cxs2 st let u_tyar_constraint st = @@ -1645,16 +1648,17 @@ let u_tyar_constraint st = | 12 -> (fun _ -> TyparConstraint.IsUnmanaged range0) | _ -> ufailwith st "u_tyar_constraint" -// Some extra F# 5.0 constraints are stored in stream B, these will be ignored by earlier F# compilers +// Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers let u_tyar_constraintB st = let tag = u_byteB st match tag with - | 1 -> TyparConstraint.NotSupportsNull range0 + | 1 -> TyparConstraint.NotSupportsNull range0 + | 2 -> TyparConstraint.AllowsRefStruct range0 | _ -> ufailwith st "u_tyar_constraintB - unexpected constraint in streamB" let u_tyar_constraints st = let cxs1 = u_list_revi u_tyar_constraint st - // Some extra F# 5.0 constraints are stored in stream B, these will be ignored by earlier F# compilers + // Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers // // If the B stream is not present (e.g. reading F# 4.5 components) then this list will be empty // via the implementation of u_listB. diff --git a/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs b/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs index e9ce93a37cd..0b30a5a61e8 100644 --- a/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs @@ -514,4 +514,49 @@ let success,version = System.Version.TryParse(null) checkResults.GetToolTip(2, 45, "let success,version = System.Version.TryParse(null)", [ "TryParse" ], FSharpTokenTag.Identifier,width=100) |> assertAndGetSingleToolTipText |> Assert.shouldBeEquivalentTo ("""System.Version.TryParse([] input: string | null, - [] result: byref) : bool""" |> normalize) \ No newline at end of file + [] result: byref) : bool""" |> normalize) + +[] +let ``Allows ref struct is shown on BCL interface declaration`` () = + let source = """module Foo +open System +let myAction : Action | null = null +""" + let checkResults = getCheckResults source [|"--checknulls+";"--langversion:preview"|] + checkResults.GetToolTip(3, 21, "let myAction : Action | null = null", [ "Action" ], FSharpTokenTag.Identifier) + |> assertAndGetSingleToolTipText + |> Assert.shouldStartWith ("""type Action<'T (allows ref struct)>""" |> normalize) + +[] +let ``Allows ref struct is shown for each T on BCL interface declaration`` () = + let source = """module Foo +open System +let myAction : Action | null = null +""" + let checkResults = getCheckResults source [|"--checknulls+";"--langversion:preview"|] + checkResults.GetToolTip(3, 21, "let myAction : Action | null = null", [ "Action" ], FSharpTokenTag.Identifier) + |> assertAndGetSingleToolTipText + |> Assert.shouldStartWith ("""type Action<'T1,'T2,'T3,'T4 (allows ref struct and allows ref struct and allows ref struct and allows ref struct)>""" |> normalize) + +[] +let ``Allows ref struct is shown on BCL method usage`` () = + let source = """module Foo +open System +open System.Collections.Generic +let doIt (dict:Dictionary<'a,'b>) = dict.GetAlternateLookup<'a,'b,ReadOnlySpan>() +""" + let checkResults = getCheckResults source [|"--langversion:preview"|] + checkResults.GetToolTip(4, 59, "let doIt (dict:Dictionary<'a,'b>) = dict.GetAlternateLookup<'a,'b,ReadOnlySpan>()", [ "GetAlternateLookup" ], FSharpTokenTag.Identifier) + |> assertAndGetSingleToolTipText + |> Assert.shouldContain ("""'TAlternateKey (allows ref struct)""" |> normalize) + +[] +let ``Allows ref struct is not shown on BCL interface usage`` () = + let source = """module Foo +open System +let doIt(myAction : Action) = myAction.Invoke(42) +""" + let checkResults = getCheckResults source [|"--langversion:preview"|] + checkResults.GetToolTip(3, 43, "let doIt(myAction : Action) = myAction.Invoke(42)", [ "myAction" ], FSharpTokenTag.Identifier) + |> assertAndGetSingleToolTipText + |> Assert.shouldBeEquivalentTo ("""val myAction: Action""" |> normalize) \ No newline at end of file diff --git a/tests/FSharp.Test.Utilities/Assert.fs b/tests/FSharp.Test.Utilities/Assert.fs index dfed4bf123e..fc36129666f 100644 --- a/tests/FSharp.Test.Utilities/Assert.fs +++ b/tests/FSharp.Test.Utilities/Assert.fs @@ -11,6 +11,12 @@ module Assert = let inline shouldBeEquivalentTo (expected : ^T) (actual : ^U) = actual.Should().BeEquivalentTo(expected, "") |> ignore + + let inline shouldStartWith (expected : string) (actual : string) = + actual.Should().StartWith(expected) |> ignore + + let inline shouldContain (needle : string) (haystack : string) = + haystack.Should().Contain(needle) |> ignore let inline shouldBe (expected : ^T) (actual : ^U) = actual.Should().Be(expected, "") |> ignore From 1bf093f28984f02737b33758a60e733dbc78d9da Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 30 Sep 2024 17:05:12 +0200 Subject: [PATCH 25/37] Enable policheck and TSA (#17818) --- azure-pipelines.yml | 3 +++ eng/TSACondig.gdntsa | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 eng/TSACondig.gdntsa diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b49d6e126b6..008ddfa8645 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -73,6 +73,9 @@ extends: sbom: enabled: false # VS SBOM is generated with other steps justificationForDisabling: 'SBOM for F# is generated via build process. Will be migrated at later date.' + tsa: + enabled: true + configFile: '$(Build.SourcesDirectory)/eng/TSAConfig.gdntsa' sourceAnalysisPool: name: NetCore1ESPool-Svc-Internal image: 1es-windows-2022 diff --git a/eng/TSACondig.gdntsa b/eng/TSACondig.gdntsa new file mode 100644 index 00000000000..864c796b398 --- /dev/null +++ b/eng/TSACondig.gdntsa @@ -0,0 +1,16 @@ +{ + "codebaseName": "FSharp-GitHub", + "notificationAliases": [ + "mlinfraswat@microsoft.com" + ], + "codebaseAdmins": [ + "EUROPE\\vlza", + "REDMOND\\kevinransom", + "EUROPE\\tomasgrosup" + ], + "instanceUrl": "https://devdiv.visualstudio.com", + "projectName": "DevDiv", + "areaPath": "DevDiv\\FSharp", + "iterationPath": "DevDiv", + "allTools": true +} \ No newline at end of file From e754739a65bcf8a8e684d498e4dfe7fbb2ebdbbc Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:50:07 +0200 Subject: [PATCH 26/37] Fix concurrency issue in `ILPreTypeDefImpl` (#17812) * use standard lazy * rn --- .../.FSharp.Compiler.Service/9.0.200.md | 3 +- src/Compiler/AbstractIL/il.fs | 32 ++++--------------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index f282c6ae800..c7d7b11d770 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -2,7 +2,8 @@ * Fix internal error when calling 'AddSingleton' and other overloads only differing in generic arity ([PR #17804](https://github.com/dotnet/fsharp/pull/17804)) * Fix extension methods support for non-reference system assemblies ([PR #17799](https://github.com/dotnet/fsharp/pull/17799)) -* Ensure `frameworkTcImportsCache` mutations are threadsafe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) +* Ensure `frameworkTcImportsCache` mutations are thread-safe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) +* Fix concurrency issue in `ILPreTypeDefImpl` ([PR #17812](https://github.com/dotnet/fsharp/pull/17812)) ### Added diff --git a/src/Compiler/AbstractIL/il.fs b/src/Compiler/AbstractIL/il.fs index 3c70f5eb93f..82faea51c5e 100644 --- a/src/Compiler/AbstractIL/il.fs +++ b/src/Compiler/AbstractIL/il.fs @@ -2913,35 +2913,17 @@ and [] ILPreTypeDef = /// This is a memory-critical class. Very many of these objects get allocated and held to represent the contents of .NET assemblies. and [] ILPreTypeDefImpl(nameSpace: string list, name: string, metadataIndex: int32, storage: ILTypeDefStored) = - let mutable store: ILTypeDef = Unchecked.defaultof<_> - let mutable storage = storage + let stored = + lazy + match storage with + | ILTypeDefStored.Given td -> td + | ILTypeDefStored.Computed f -> f () + | ILTypeDefStored.Reader f -> f metadataIndex interface ILPreTypeDef with member _.Namespace = nameSpace member _.Name = name - - member x.GetTypeDef() = - match box store with - | null -> - let syncObj = storage - Monitor.Enter(syncObj) - - try - match box store with - | null -> - let value = - match storage with - | ILTypeDefStored.Given td -> td - | ILTypeDefStored.Computed f -> f () - | ILTypeDefStored.Reader f -> f metadataIndex - - store <- value - storage <- Unchecked.defaultof<_> - value - | _ -> store - finally - Monitor.Exit(syncObj) - | _ -> store + member x.GetTypeDef() = stored.Value and ILTypeDefStored = | Given of ILTypeDef From 7e9fd41d9e07714a0bdf1787c07e4f426c8951bd Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:05:45 +0200 Subject: [PATCH 27/37] Tests: remove dependency on CurrentDirectory ("test.ok" files) (#17815) --- FSharpTests.Directory.Build.targets | 56 +-- src/FSharp.Build/Fsi.fs | 28 ++ .../ByrefSafetyAnalysis/MigratedTest02.fs | 2 +- .../Miscellaneous/FsharpSuiteMigrated.fs | 7 +- .../access.fsx | 2 +- .../TestCasesForGenerationRoundTrip/array.fsx | 2 +- .../libtest.fsx | 2 +- .../DependencyManagerInteractiveTests.fs | 6 +- .../FSharpScriptTests.fs | 15 +- tests/FSharp.Test.Utilities/ScriptHelpers.fs | 63 +++- tests/FSharp.Test.Utilities/TestFramework.fs | 72 ++-- tests/FSharp.Test.Utilities/Utilities.fs | 73 +--- .../CodeGen/EmittedIL/StaticMember.fs | 2 +- tests/fsharp/FSharpSuite.Tests.fsproj | 2 +- tests/fsharp/TypeProviderTests.fs | 27 +- tests/fsharp/core/access/test.fsx | 2 +- tests/fsharp/core/anon/test.fsx | 2 +- tests/fsharp/core/apporder/test.fsx | 2 +- tests/fsharp/core/array-no-dot/test.fsx | 2 +- tests/fsharp/core/array/test.fsx | 2 +- tests/fsharp/core/asyncStackTraces/test.fsx | 2 +- tests/fsharp/core/attributes/test.fsx | 2 +- tests/fsharp/core/auto-widen/5.0/test.fsx | 2 +- tests/fsharp/core/auto-widen/minimal/test.fsx | 2 +- .../auto-widen/preview-default-warns/test.fsx | 2 +- tests/fsharp/core/auto-widen/preview/test.fsx | 2 +- tests/fsharp/core/comprehensions-hw/test.fsx | 2 +- tests/fsharp/core/comprehensions/test.fsx | 2 +- tests/fsharp/core/control/test.fsx | 2 +- tests/fsharp/core/controlChamenos/test.fsx | 2 +- tests/fsharp/core/controlMailbox/test.fsx | 2 +- .../fsharp/core/controlStackOverflow/test.fsx | 2 +- tests/fsharp/core/controlWebExt/test.fsx | 2 +- tests/fsharp/core/controlWpf/test.fsx | 4 +- tests/fsharp/core/csext/test.fsx | 2 +- tests/fsharp/core/enum/test.fsx | 2 +- tests/fsharp/core/events/test.fs | 2 +- tests/fsharp/core/fileorder/test.fsx | 2 +- tests/fsharp/core/forexpression/test.fsx | 2 +- tests/fsharp/core/fsfromcs/test.cs | 2 +- tests/fsharp/core/fsfromfsviacs/test.fsx | 2 +- tests/fsharp/core/fsi-load/test.fsx | 2 +- tests/fsharp/core/fsi-reference/test.fsx | 2 +- tests/fsharp/core/fsi-reload/load1.fsx | 2 +- tests/fsharp/core/fsi-reload/load2.fsx | 2 +- tests/fsharp/core/fsi-reload/test1.ml | 2 +- tests/fsharp/core/fsi-shadowcopy/test1.fsx | 3 +- tests/fsharp/core/fsi-shadowcopy/test2.fsx | 3 +- tests/fsharp/core/fsiAndModifiers/test.fsx | 2 +- tests/fsharp/core/genericmeasures/test.fsx | 2 +- tests/fsharp/core/indent/version46/test.fsx | 2 +- tests/fsharp/core/indent/version47/test.fsx | 2 +- tests/fsharp/core/innerpoly/test.fsx | 2 +- tests/fsharp/core/int32/test.fsx | 2 +- .../conditionals/LargeConditionals-200.fs | 2 +- .../LargeConditionals-maxtested.fs | 2 +- tests/fsharp/core/large/lets/LargeLets-500.fs | 2 +- .../core/large/lets/LargeLets-maxtested.fs | 2 +- .../fsharp/core/large/lists/LargeList-500.fs | 2 +- .../core/large/matches/LargeMatches-200.fs | 2 +- .../large/matches/LargeMatches-maxtested.fs | 2 +- .../large/mixed/LargeSequentialLet-500.fs | 2 +- .../mixed/LargeSequentialLet-maxtested.fs | 2 +- .../large/sequential/LargeSequential-500.fs | 2 +- .../sequential/LargeSequential-maxtested.fs | 2 +- tests/fsharp/core/lazy/test.fsx | 2 +- tests/fsharp/core/letrec-mutrec/test.fs | 2 +- tests/fsharp/core/letrec-mutrec2/test.fs | 2 +- tests/fsharp/core/letrec/test.fsx | 2 +- tests/fsharp/core/libtest/test.fsx | 2 +- tests/fsharp/core/lift/test.fsx | 2 +- tests/fsharp/core/longnames/test.fsx | 2 +- tests/fsharp/core/map/test.fsx | 2 +- tests/fsharp/core/math/lalgebra/test.fsx | 2 +- tests/fsharp/core/math/numbers/test.fsx | 2 +- tests/fsharp/core/math/numbersVS2008/test.fsx | 2 +- tests/fsharp/core/measures/test.fsx | 2 +- .../core/members/basics-hw-mutrec/test.fs | 2 +- tests/fsharp/core/members/basics-hw/test.fsx | 2 +- tests/fsharp/core/members/basics/test.fs | 2 +- tests/fsharp/core/members/ctree/test.fsx | 2 +- .../core/members/factors-mutrec/test.fs | 2 +- tests/fsharp/core/members/factors/test.fsx | 2 +- .../members/incremental-hw-mutrec/test.fsx | 2 +- .../core/members/incremental-hw/test.fsx | 2 +- .../fsharp/core/members/incremental/test.fsx | 2 +- tests/fsharp/core/members/ops-mutrec/test.fs | 2 +- tests/fsharp/core/members/ops/test.fsx | 2 +- .../members/self-identifier/version46/test.fs | 2 +- .../members/self-identifier/version47/test.fs | 2 +- tests/fsharp/core/nameof/preview/test.fsx | 2 +- tests/fsharp/core/namespaces/test2.fs | 2 +- tests/fsharp/core/nested/test.fsx | 2 +- tests/fsharp/core/patterns/test.fsx | 2 +- tests/fsharp/core/pinvoke/test.fsx | 2 +- .../fsharp/core/printf-interpolated/test.fsx | 2 +- tests/fsharp/core/printf/test.fsx | 2 +- .../core/queriesCustomQueryOps/test.fsx | 2 +- .../queriesLeafExpressionConvert/test.fsx | 2 +- .../core/queriesNullableOperators/test.fsx | 2 +- .../core/queriesOverIEnumerable/test.fsx | 2 +- .../core/queriesOverIQueryable/test.fsx | 2 +- tests/fsharp/core/quotes/test.fsx | 2 +- tests/fsharp/core/quotesDebugInfo/test.fsx | 2 +- .../core/quotesInMultipleModules/module2.fsx | 2 +- tests/fsharp/core/recordResolution/test.fsx | 2 +- tests/fsharp/core/reflect/test2.fs | 2 +- tests/fsharp/core/refnormalization/test.fs | 2 +- tests/fsharp/core/seq/test.fsx | 2 +- tests/fsharp/core/state-machines/test.fsx | 2 +- tests/fsharp/core/subtype/test.fsx | 2 +- tests/fsharp/core/syntax/test.fsx | 2 +- tests/fsharp/core/tlr/test.fsx | 2 +- .../core/topinit/test_deterministic_init.fs | 2 +- tests/fsharp/core/unicode/test.fsx | 2 +- tests/fsharp/core/unitsOfMeasure/test.fs | 2 +- tests/fsharp/perf/graph/test.ml | 2 +- tests/fsharp/perf/nbody/test.ml | 2 +- tests/fsharp/regression/12322/test.fsx | 2 +- tests/fsharp/regression/12383/test.fs | 2 +- tests/fsharp/regression/13219/test.fsx | 2 +- tests/fsharp/regression/13710/test.fsx | 2 +- tests/fsharp/regression/26/test.ml | 2 +- tests/fsharp/regression/321/test.ml | 2 +- tests/fsharp/regression/655/main.fs | 2 +- tests/fsharp/regression/656/form.fs | 2 +- tests/fsharp/regression/83/test.ml | 2 +- tests/fsharp/regression/84/test.ml | 2 +- tests/fsharp/regression/86/test.ml | 2 +- .../OverloadResolution-bug/test.fsx | 2 +- .../regression/literal-value-bug-2/test.fsx | 2 +- .../regression/struct-tuple-bug-1/test.fsx | 4 +- tests/fsharp/regression/tuple-bug-1/test.ml | 2 +- tests/fsharp/single-test.fs | 96 ++--- tests/fsharp/tests.fs | 335 +++++++----------- tests/fsharp/tools/eval/test.fsx | 2 +- .../typeProviders/diamondAssembly/test3.fsx | 2 +- .../typeProviders/globalNamespace/test.fsx | 2 +- .../fsharp/typeProviders/helloWorld/test.fsx | 2 +- .../typeProviders/helloWorldCSharp/test.fsx | 2 +- .../typeProviders/splitAssemblyTools/test.fsx | 2 +- .../splitAssemblyTypeproviders/test.fsx | 2 +- .../typeProviders/wedgeAssembly/test3.fsx | 2 +- .../typecheck/full-rank-arrays/test.fsx | 2 +- tests/fsharp/typecheck/misc/test.ml | 2 +- .../backtickmoduleandtypenames.fsx | 2 +- tests/scripts/scriptlib.fsx | 5 +- 147 files changed, 448 insertions(+), 611 deletions(-) diff --git a/FSharpTests.Directory.Build.targets b/FSharpTests.Directory.Build.targets index 075321e3fb5..2e0b335b411 100644 --- a/FSharpTests.Directory.Build.targets +++ b/FSharpTests.Directory.Build.targets @@ -7,33 +7,35 @@ Returns="" DependsOnTargets="$(CoreCompileDependsOn)" > - - - + + + + <_CoreCompileResourceInputs Remove="@(_CoreCompileResourceInputs)" /> diff --git a/src/FSharp.Build/Fsi.fs b/src/FSharp.Build/Fsi.fs index 4e7bd9c4e0a..dc362420db0 100644 --- a/src/FSharp.Build/Fsi.fs +++ b/src/FSharp.Build/Fsi.fs @@ -161,6 +161,34 @@ type public Fsi() as this = builder + let mutable bufferLimit = None + + let textOutput = + lazy System.Collections.Generic.Queue<_>(defaultArg bufferLimit 1024) + + override this.LogEventsFromTextOutput(line, msgImportance) = + if this.CaptureTextOutput then + textOutput.Value.Enqueue line + + match bufferLimit with + | Some limit when textOutput.Value.Count > limit -> textOutput.Value.Dequeue() |> ignore + | _ -> () + + base.LogEventsFromTextOutput(line, msgImportance) + + member _.BufferLimit + with get () = defaultArg bufferLimit 0 + and set limit = bufferLimit <- if limit = 0 then None else Some limit + + member val CaptureTextOutput = false with get, set + + [] + member this.TextOutput = + if this.CaptureTextOutput then + textOutput.Value |> String.concat Environment.NewLine + else + String.Empty + // --codepage : Specify the codepage to use when opening source files member _.CodePage with get () = codePage diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/InferenceProcedures/ByrefSafetyAnalysis/MigratedTest02.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/InferenceProcedures/ByrefSafetyAnalysis/MigratedTest02.fs index c34bd114f35..9c166a47aac 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/InferenceProcedures/ByrefSafetyAnalysis/MigratedTest02.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/InferenceProcedures/ByrefSafetyAnalysis/MigratedTest02.fs @@ -57,4 +57,4 @@ module Tests = let test3 () = StaticTest.Test2 // is passing, but probably shouldn't be -printfn "Test Passed" +printf "TEST PASSED OK" diff --git a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs index 2490e301e05..3f17e0cfa11 100644 --- a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs +++ b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs @@ -31,16 +31,15 @@ module ScriptRunner = let cu = cu |> withDefines defaultDefines match cu with | FS fsSource -> - File.Delete("test.ok") let engine = createEngine (fsSource.Options |> Array.ofList,version) let res = evalScriptFromDiskInSharedSession engine cu match res with | CompilationResult.Failure _ -> res - | CompilationResult.Success s -> - if File.Exists("test.ok") then + | CompilationResult.Success s -> + if engine.GetOutput().Contains "TEST PASSED OK" then res else - failwith $"Results looked correct, but 'test.ok' file was not created. Result: %A{s}" + failwith $"Results looked correct, but 'TEST PASSED OK' was not printed. Result: %A{s}" | _ -> failwith $"Compilation unit other than fsharp is not supported, cannot process %A{cu}" diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/access.fsx b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/access.fsx index a8c3798a685..6790e4dfbee 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/access.fsx +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/access.fsx @@ -278,7 +278,7 @@ let aa = match failures.Value with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/array.fsx b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/array.fsx index 8c55d727f92..dd61a8f7474 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/array.fsx +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/array.fsx @@ -1142,7 +1142,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/libtest.fsx b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/libtest.fsx index 23c2125ab51..515e1428697 100644 --- a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/libtest.fsx +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/libtest.fsx @@ -5651,7 +5651,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/FSharp.Compiler.Private.Scripting.UnitTests/DependencyManagerInteractiveTests.fs b/tests/FSharp.Compiler.Private.Scripting.UnitTests/DependencyManagerInteractiveTests.fs index 8a1bb95b2d2..cc027d098af 100644 --- a/tests/FSharp.Compiler.Private.Scripting.UnitTests/DependencyManagerInteractiveTests.fs +++ b/tests/FSharp.Compiler.Private.Scripting.UnitTests/DependencyManagerInteractiveTests.fs @@ -760,10 +760,9 @@ x |> Seq.iter(fun r -> if found = expected.Length then sawExpectedOutput.Set() |> ignore let text = "#help" - use output = new RedirectConsoleOutput() use script = new FSharpScript(quiet = false, langVersion = LangVersion.V47) let mutable found = 0 - output.OutputProduced.Add (fun line -> verifyOutput line) + script.OutputProduced.Add (fun line -> verifyOutput line) let opt = script.Eval(text) |> getValue Assert.True(sawExpectedOutput.WaitOne(TimeSpan.FromSeconds(5.0)), sprintf "Expected to see error sentinel value written\nexpected:%A\nactual:%A" expected lines) @@ -811,10 +810,9 @@ x |> Seq.iter(fun r -> if found = expected.Length then sawExpectedOutput.Set() |> ignore let text = "#help" - use output = new RedirectConsoleOutput() use script = new FSharpScript(quiet = false, langVersion = LangVersion.Preview) let mutable found = 0 - output.OutputProduced.Add (fun line -> verifyOutput line) + script.OutputProduced.Add (fun line -> verifyOutput line) let opt = script.Eval(text) |> getValue Assert.True(sawExpectedOutput.WaitOne(TimeSpan.FromSeconds(5.0)), sprintf "Expected to see error sentinel value written\nexpected:%A\nactual:%A" expected lines) diff --git a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs index f7587333981..aff47308ad2 100644 --- a/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs +++ b/tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs @@ -83,9 +83,7 @@ x [] member _.``Capture console input``() = - use input = new RedirectConsoleInput() - use script = new FSharpScript() - input.ProvideInput "stdin:1234\r\n" + use script = new FSharpScript(input = "stdin:1234\r\n") let opt = script.Eval("System.Console.ReadLine()") |> getValue let value = opt.Value Assert.Equal(typeof, value.ReflectionType) @@ -93,12 +91,11 @@ x [] member _.``Capture console output/error``() = - use output = new RedirectConsoleOutput() use script = new FSharpScript() use sawOutputSentinel = new ManualResetEvent(false) use sawErrorSentinel = new ManualResetEvent(false) - output.OutputProduced.Add (fun line -> if line = "stdout:1234" then sawOutputSentinel.Set() |> ignore) - output.ErrorProduced.Add (fun line -> if line = "stderr:5678" then sawErrorSentinel.Set() |> ignore) + script.OutputProduced.Add (fun line -> if line = "stdout:1234" then sawOutputSentinel.Set() |> ignore) + script.ErrorProduced.Add (fun line -> if line = "stderr:5678" then sawErrorSentinel.Set() |> ignore) script.Eval("printfn \"stdout:1234\"; eprintfn \"stderr:5678\"") |> ignoreValue Assert.True(sawOutputSentinel.WaitOne(TimeSpan.FromSeconds(5.0)), "Expected to see output sentinel value written") Assert.True(sawErrorSentinel.WaitOne(TimeSpan.FromSeconds(5.0)), "Expected to see error sentinel value written") @@ -305,11 +302,10 @@ printfn ""%A"" result [] member _.``Eval script with invalid PackageName should fail immediately``() = - use output = new RedirectConsoleOutput() use script = new FSharpScript(additionalArgs=[| |]) let mutable found = 0 let outp = System.Collections.Generic.List() - output.OutputProduced.Add( + script.OutputProduced.Add( fun line -> if line.Contains("error NU1101:") && line.Contains("FSharp.Really.Not.A.Package") then found <- found + 1 @@ -321,10 +317,9 @@ printfn ""%A"" result [] member _.``Eval script with invalid PackageName should fail immediately and resolve one time only``() = - use output = new RedirectConsoleOutput() use script = new FSharpScript(additionalArgs=[| |]) let mutable foundResolve = 0 - output.OutputProduced.Add (fun line -> if line.Contains("error NU1101:") then foundResolve <- foundResolve + 1) + script.OutputProduced.Add (fun line -> if line.Contains("error NU1101:") then foundResolve <- foundResolve + 1) let result, errors = script.Eval(""" #r "nuget:FSharp.Really.Not.A.Package" diff --git a/tests/FSharp.Test.Utilities/ScriptHelpers.fs b/tests/FSharp.Test.Utilities/ScriptHelpers.fs index aaaf5c458d8..688941934c9 100644 --- a/tests/FSharp.Test.Utilities/ScriptHelpers.fs +++ b/tests/FSharp.Test.Utilities/ScriptHelpers.fs @@ -3,7 +3,6 @@ namespace FSharp.Test.ScriptHelpers open System -open System.Collections.Generic open System.IO open System.Text open System.Threading @@ -11,7 +10,7 @@ open FSharp.Compiler open FSharp.Compiler.Interactive.Shell open FSharp.Compiler.Diagnostics open FSharp.Compiler.EditorServices -open FSharp.Test.Utilities +open FSharp.Test [] type LangVersion = @@ -25,7 +24,26 @@ type LangVersion = | Latest | SupportsMl -type FSharpScript(?additionalArgs: string[], ?quiet: bool, ?langVersion: LangVersion) = +type private EventedTextWriter() = + inherit TextWriter() + let sb = StringBuilder() + let sw = new StringWriter() + let lineWritten = Event() + member _.LineWritten = lineWritten.Publish + override _.Encoding = Encoding.UTF8 + override _.Write(c: char) = + if c = '\n' then + let line = + let v = sb.ToString() + if v.EndsWith("\r") then v.Substring(0, v.Length - 1) + else v + sb.Clear() |> ignore + sw.WriteLine line + lineWritten.Trigger(line) + else sb.Append(c) |> ignore + override _.ToString() = sw.ToString() + +type FSharpScript(?additionalArgs: string[], ?quiet: bool, ?langVersion: LangVersion, ?input: string) = let additionalArgs = defaultArg additionalArgs [||] let quiet = defaultArg quiet true @@ -54,13 +72,32 @@ type FSharpScript(?additionalArgs: string[], ?quiet: bool, ?langVersion: LangVer let argv = Array.append baseArgs additionalArgs + let inReader = new StringReader(defaultArg input "") + let outWriter = new EventedTextWriter() + let errorWriter = new EventedTextWriter() + + let previousIn, previousOut, previousError = Console.In, Console.Out, Console.Error + + do + Console.SetIn inReader + Console.SetOut outWriter + Console.SetError errorWriter + let fsi = FsiEvaluationSession.Create (config, argv, stdin, stdout, stderr) member _.ValueBound = fsi.ValueBound member _.Fsi = fsi - member _.Eval(code: string, ?cancellationToken: CancellationToken, ?desiredCulture: Globalization.CultureInfo) = + member _.OutputProduced = outWriter.LineWritten + + member _.ErrorProduced = errorWriter.LineWritten + + member _.GetOutput() = string outWriter + + member _.GetErrorOutput() = string errorWriter + + member this.Eval(code: string, ?cancellationToken: CancellationToken, ?desiredCulture: Globalization.CultureInfo) = let originalCulture = Thread.CurrentThread.CurrentCulture Thread.CurrentThread.CurrentCulture <- Option.defaultValue Globalization.CultureInfo.InvariantCulture desiredCulture @@ -88,7 +125,11 @@ type FSharpScript(?additionalArgs: string[], ?quiet: bool, ?langVersion: LangVer } interface IDisposable with - member this.Dispose() = ((this.Fsi) :> IDisposable).Dispose() + member this.Dispose() = + ((this.Fsi) :> IDisposable).Dispose() + Console.SetIn previousIn + Console.SetOut previousOut + Console.SetError previousError [] module TestHelpers = @@ -101,15 +142,3 @@ module TestHelpers = | Error ex -> raise ex let ignoreValue = getValue >> ignore - - let getTempDir () = - let sysTempDir = Path.GetTempPath() - let customTempDirName = Guid.NewGuid().ToString("D") - let fullDirName = Path.Combine(sysTempDir, customTempDirName) - let dirInfo = Directory.CreateDirectory(fullDirName) - { new Object() with - member _.ToString() = dirInfo.FullName - interface IDisposable with - member _.Dispose() = - dirInfo.Delete(true) - } diff --git a/tests/FSharp.Test.Utilities/TestFramework.fs b/tests/FSharp.Test.Utilities/TestFramework.fs index d32ce4fcda8..6e1611beb5c 100644 --- a/tests/FSharp.Test.Utilities/TestFramework.fs +++ b/tests/FSharp.Test.Utilities/TestFramework.fs @@ -9,6 +9,7 @@ open System.Diagnostics open Scripting open Xunit open FSharp.Compiler.IO +open Xunit.Sdk let getShortId() = Guid.NewGuid().ToString().[..7] @@ -141,7 +142,7 @@ module Commands = let copy workDir source dest = log "copy /y %s %s" source dest File.Copy( source |> getfullpath workDir, dest |> getfullpath workDir, true) - CmdResult.Success + CmdResult.Success "" let mkdir_p workDir dir = log "mkdir %s" dir @@ -183,19 +184,6 @@ module Commands = let fsc workDir exec (dotNetExe: FilePath) (fscExe: FilePath) flags srcFiles = let args = (sprintf "%s %s" flags (srcFiles |> Seq.ofList |> String.concat " ")) -#if FSC_IN_PROCESS - // This is not yet complete - printfn "Hosted Compiler:" - printfn "workdir: %A\nargs: %A"workdir args - let fscCompiler = FSharp.Compiler.Hosted.FscCompiler() - let exitCode, _stdin, _stdout = FSharp.Compiler.Hosted.CompilerHelpers.fscCompile workDir (FSharp.Compiler.Hosted.CompilerHelpers.parseCommandLine args) - - match exitCode with - | 0 -> CmdResult.Success - | err -> - let msg = sprintf "Error running command '%s' with args '%s' in directory '%s'" fscExe args workDir - CmdResult.ErrorLevel (msg, err) -#else ignore workDir #if NETCOREAPP exec dotNetExe (fscExe + " " + args) @@ -204,7 +192,6 @@ module Commands = printfn "fscExe: %A" fscExe printfn "args: %A" args exec fscExe args -#endif #endif let csc exec cscExe flags srcFiles = @@ -441,15 +428,23 @@ let logConfig (cfg: TestConfig) = log "PEVERIFY = %s" cfg.PEVERIFY log "---------------------------------------------------------------" +let checkOutputPassed (output: string) = + Assert.True(output.Contains "TEST PASSED OK", $"Output does not contain 'TEST PASSED OK':\n{output}") + +let checkResultPassed result = + match result with + | CmdResult.ErrorLevel (msg1, err) -> Assert.Fail (sprintf "%s. ERRORLEVEL %d" msg1 err) + | CmdResult.Success output -> checkOutputPassed output + let checkResult result = match result with | CmdResult.ErrorLevel (msg1, err) -> Assert.Fail (sprintf "%s. ERRORLEVEL %d" msg1 err) - | CmdResult.Success -> () + | CmdResult.Success _ -> () let checkErrorLevel1 result = match result with | CmdResult.ErrorLevel (_,1) -> () - | CmdResult.Success | CmdResult.ErrorLevel _ -> Assert.Fail (sprintf "Command passed unexpectedly") + | CmdResult.Success _ | CmdResult.ErrorLevel _ -> Assert.Fail (sprintf "Command passed unexpectedly") let envVars () = System.Environment.GetEnvironmentVariables () @@ -497,27 +492,13 @@ let createConfigWithEmptyDirectory() = let cfg = suiteHelpers.Value { cfg with Directory = createTemporaryDirectory "temp" } -[] -type FileGuard(path: string) = - let remove path = if FileSystem.FileExistsShim(path) then Commands.rm (Path.GetTempPath()) path - do if not (Path.IsPathRooted(path)) then failwithf "path '%s' must be absolute" path - do remove path - member x.Path = path - member x.Exists = x.Path |> FileSystem.FileExistsShim - member x.CheckExists() = - if not x.Exists then - failwith (sprintf "exit code 0 but %s file doesn't exists" (x.Path |> Path.GetFileName)) - - interface IDisposable with - member x.Dispose () = remove path - - type RedirectToType = | Overwrite of FilePath | Append of FilePath type RedirectTo = - | Inherit + | Ignore + | Collect | Output of RedirectToType | OutputAndError of RedirectToType * RedirectToType | OutputAndErrorToSameFile of RedirectToType @@ -541,8 +522,8 @@ module Command = let redirectType = function Overwrite x -> sprintf ">%s" x | Append x -> sprintf ">>%s" x let outF = function - | Inherit -> "" - | Output r-> sprintf " 1%s" (redirectType r) + | Ignore | Collect -> "" + | Output r -> sprintf " 1%s" (redirectType r) | OutputAndError (r1, r2) -> sprintf " 1%s 2%s" (redirectType r1) (redirectType r2) | OutputAndErrorToSameFile r -> sprintf " 1%s 2>1" (redirectType r) | Error r -> sprintf " 2%s" (redirectType r) @@ -579,9 +560,12 @@ module Command = let outF fCont cmdArgs = match redirect.Output with - | RedirectTo.Inherit -> - use toLog = redirectToLog () - fCont { cmdArgs with RedirectOutput = Some (toLog.Post); RedirectError = Some (toLog.Post) } + | Ignore -> + fCont { cmdArgs with RedirectOutput = Some ignore; RedirectError = Some ignore } + | Collect -> + use out = redirectTo (new StringWriter()) + use error = redirectTo (new StringWriter()) + fCont { cmdArgs with RedirectOutput = Some out.Post; RedirectError = Some error.Post } | Output r -> use writer = openWrite r use outFile = redirectTo writer @@ -612,18 +596,21 @@ module Command = let alwaysSuccess _ = () -let execArgs = { Output = Inherit; Input = None; } +let execArgs = { Output = Ignore; Input = None; } let execAppend cfg stdoutPath stderrPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = OutputAndError(Append(stdoutPath), Append(stderrPath)) } p >> checkResult let execAppendIgnoreExitCode cfg stdoutPath stderrPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = OutputAndError(Append(stdoutPath), Append(stderrPath)) } p >> alwaysSuccess let exec cfg p = Command.exec cfg.Directory cfg.EnvironmentVariables execArgs p >> checkResult +let execAndCheckPassed cfg p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = Collect } p >> checkResultPassed let execExpectFail cfg p = Command.exec cfg.Directory cfg.EnvironmentVariables execArgs p >> checkErrorLevel1 let execIn cfg workDir p = Command.exec workDir cfg.EnvironmentVariables execArgs p >> checkResult -let execBothToOutNoCheck cfg workDir outFile p = Command.exec workDir cfg.EnvironmentVariables { execArgs with Output = OutputAndErrorToSameFile(Overwrite(outFile)) } p +let execBothToOutNoCheck cfg workDir outFile p = Command.exec workDir cfg.EnvironmentVariables { execArgs with Output = OutputAndErrorToSameFile(Overwrite(outFile)) } p let execBothToOut cfg workDir outFile p = execBothToOutNoCheck cfg workDir outFile p >> checkResult +let execBothToOutCheckPassed cfg workDir outFile p = execBothToOutNoCheck cfg workDir outFile p >> checkResultPassed let execBothToOutExpectFail cfg workDir outFile p = execBothToOutNoCheck cfg workDir outFile p >> checkErrorLevel1 let execAppendOutIgnoreExitCode cfg workDir outFile p = Command.exec workDir cfg.EnvironmentVariables { execArgs with Output = Output(Append(outFile)) } p >> alwaysSuccess let execAppendErrExpectFail cfg errPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { execArgs with Output = Error(Overwrite(errPath)) } p >> checkErrorLevel1 -let execStdin cfg l p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = Inherit; Input = Some(RedirectInput(l)) } p >> checkResult +let execStdin cfg l p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = Ignore; Input = Some(RedirectInput(l)) } p >> checkResult +let execStdinCheckPassed cfg l p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = Collect; Input = Some(RedirectInput(l)) } p >> checkResultPassed let execStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = OutputAndError(Append(stdoutPath), Append(stderrPath)); Input = Some(RedirectInput(stdinPath)) } p >> alwaysSuccess let fsc cfg arg = Printf.ksprintf (Commands.fsc cfg.Directory (exec cfg) cfg.DotNetExe cfg.FSC) arg let fscIn cfg workDir arg = Printf.ksprintf (Commands.fsc workDir (execIn cfg workDir) cfg.DotNetExe cfg.FSC) arg @@ -639,6 +626,7 @@ let ilasm cfg arg = Printf.ksprintf (Commands.ilasm (exec cfg) cfg.ILASM) arg let peverify _cfg _test = printfn "PEVerify is disabled, need to migrate to ILVerify instead, see https://github.com/dotnet/fsharp/issues/13854" //Commands.peverify (exec cfg) cfg.PEVERIFY "/nologo" let peverifyWithArgs _cfg _args _test = printfn "PEVerify is disabled, need to migrate to ILVerify instead, see https://github.com/dotnet/fsharp/issues/13854" //Commands.peverify (exec cfg) cfg.PEVERIFY args let fsi cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI) +let fsiCheckPassed cfg = Printf.ksprintf (Commands.fsi (execAndCheckPassed cfg) cfg.FSI) #if !NETCOREAPP let fsiAnyCpu cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSIANYCPU) let sn cfg = Printf.ksprintf (Commands.sn (exec cfg) cfg.SN) @@ -646,10 +634,10 @@ let sn cfg = Printf.ksprintf (Commands.sn (exec cfg) cfg.SN) let fsi_script cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI_FOR_SCRIPTS) let fsiExpectFail cfg = Printf.ksprintf (Commands.fsi (execExpectFail cfg) cfg.FSI) let fsiAppendIgnoreExitCode cfg stdoutPath stderrPath = Printf.ksprintf (Commands.fsi (execAppendIgnoreExitCode cfg stdoutPath stderrPath) cfg.FSI) -let fileguard cfg fileName = Commands.getfullpath cfg.Directory fileName |> (fun x -> new FileGuard(x)) let getfullpath cfg = Commands.getfullpath cfg.Directory let fileExists cfg fileName = Commands.fileExists cfg.Directory fileName |> Option.isSome let fsiStdin cfg stdinPath = Printf.ksprintf (Commands.fsi (execStdin cfg stdinPath) cfg.FSI) +let fsiStdinCheckPassed cfg stdinPath = Printf.ksprintf (Commands.fsi (execStdinCheckPassed cfg stdinPath) cfg.FSI) let fsiStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath = Printf.ksprintf (Commands.fsi (execStdinAppendBothIgnoreExitCode cfg stdoutPath stderrPath stdinPath) cfg.FSI) let rm cfg x = Commands.rm cfg.Directory x let rmdir cfg x = Commands.rmdir cfg.Directory x diff --git a/tests/FSharp.Test.Utilities/Utilities.fs b/tests/FSharp.Test.Utilities/Utilities.fs index 199f047dfd1..6ed885d4e44 100644 --- a/tests/FSharp.Test.Utilities/Utilities.fs +++ b/tests/FSharp.Test.Utilities/Utilities.fs @@ -38,86 +38,23 @@ type FactForDESKTOPAttribute() = do base.Skip <- "NETCOREAPP is not supported runtime for this kind of test, it is intended for DESKTOP only" #endif - // This file mimics how Roslyn handles their compilation references for compilation testing module Utilities = - - type CapturedTextReader() = - inherit TextReader() - let queue = Queue() - member _.ProvideInput(text: string) = - for c in text.ToCharArray() do - queue.Enqueue(c) - override _.Peek() = - if queue.Count > 0 then queue.Peek() |> int else -1 - override _.Read() = - if queue.Count > 0 then queue.Dequeue() |> int else -1 - - type RedirectConsoleInput() = - let oldStdIn = Console.In - let newStdIn = new CapturedTextReader() - do Console.SetIn(newStdIn) - member _.ProvideInput(text: string) = - newStdIn.ProvideInput(text) - interface IDisposable with - member _.Dispose() = - Console.SetIn(oldStdIn) - newStdIn.Dispose() - - type EventedTextWriter() = - inherit TextWriter() - let sb = StringBuilder() - let lineWritten = Event() - member _.LineWritten = lineWritten.Publish - override _.Encoding = Encoding.UTF8 - override _.Write(c: char) = - if c = '\n' then - let line = - let v = sb.ToString() - if v.EndsWith("\r") then v.Substring(0, v.Length - 1) - else v - sb.Clear() |> ignore - lineWritten.Trigger(line) - else sb.Append(c) |> ignore - - type RedirectConsoleOutput() = - let outputProduced = Event() - let errorProduced = Event() + type RedirectConsole() = let oldStdOut = Console.Out let oldStdErr = Console.Error - let newStdOut = new EventedTextWriter() - let newStdErr = new EventedTextWriter() - - do newStdOut.LineWritten.Add outputProduced.Trigger - do newStdErr.LineWritten.Add errorProduced.Trigger + let newStdOut = new StringWriter() + let newStdErr = new StringWriter() do Console.SetOut(newStdOut) do Console.SetError(newStdErr) + member _.Output () = string newStdOut - member _.OutputProduced = outputProduced.Publish - - member _.ErrorProduced = errorProduced.Publish + member _.ErrorOutput () =string newStdErr interface IDisposable with member _.Dispose() = Console.SetOut(oldStdOut) Console.SetError(oldStdErr) - newStdOut.Dispose() - newStdErr.Dispose() - - type RedirectConsole() = - let redirector = new RedirectConsoleOutput() - let outputLines = StringBuilder() - let errorLines = StringBuilder() - - do redirector.OutputProduced.Add (fun line -> lock outputLines <| fun () -> outputLines.AppendLine line |>ignore) - do redirector.ErrorProduced.Add(fun line -> lock errorLines <| fun () -> errorLines.AppendLine line |>ignore) - - member _.Output () = lock outputLines outputLines.ToString - - member _.ErrorOutput () = lock errorLines errorLines.ToString - - interface IDisposable with - member _.Dispose() = (redirector :> IDisposable).Dispose() type Async with static member RunImmediate (computation: Async<'T>, ?cancellationToken ) = diff --git a/tests/fsharp/Compiler/CodeGen/EmittedIL/StaticMember.fs b/tests/fsharp/Compiler/CodeGen/EmittedIL/StaticMember.fs index 464b7ca7d13..078cffd9e60 100644 --- a/tests/fsharp/Compiler/CodeGen/EmittedIL/StaticMember.fs +++ b/tests/fsharp/Compiler/CodeGen/EmittedIL/StaticMember.fs @@ -481,7 +481,7 @@ let _ = if !failures then (System.Console.Out.WriteLine "Test Failed"; exit 1) do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) """, (fun verifier -> verifier.VerifyIL [ diff --git a/tests/fsharp/FSharpSuite.Tests.fsproj b/tests/fsharp/FSharpSuite.Tests.fsproj index 36f26235ac1..6673da9f911 100644 --- a/tests/fsharp/FSharpSuite.Tests.fsproj +++ b/tests/fsharp/FSharpSuite.Tests.fsproj @@ -3,7 +3,7 @@ net472;$(FSharpNetCoreProductTargetFramework) - $(FSharpNetCoreProductTargetFramework) + $(FSharpNetCoreProductTargetFramework) win-x86;win-x64 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81 true diff --git a/tests/fsharp/TypeProviderTests.fs b/tests/fsharp/TypeProviderTests.fs index ba3d43037e6..ab9f2e7e5ef 100644 --- a/tests/fsharp/TypeProviderTests.fs +++ b/tests/fsharp/TypeProviderTests.fs @@ -69,11 +69,9 @@ let diamondAssembly () = exec cfg ("." ++ "test3.exe") "" - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "%s" cfg.fsi_flags ["test3.fsx"] - - testOkFile.CheckExists() + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test3.fsx"] [] let globalNamespace () = @@ -286,18 +284,16 @@ let splitAssembly subdir project = fsc cfg "--out:test.exe -r:provider.dll" ["test.fsx"] begin - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] end // Do the same thing with different load locations for the type provider design-time component @@ -326,19 +322,16 @@ let splitAssembly subdir project = fsc cfg "--out:test.exe -r:provider.dll" ["test.fsx"] - begin - use testOkFile = fileguard cfg "test.ok" + begin - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] end clean() diff --git a/tests/fsharp/core/access/test.fsx b/tests/fsharp/core/access/test.fsx index 21a8c056ee0..3a8bfd0e6f3 100644 --- a/tests/fsharp/core/access/test.fsx +++ b/tests/fsharp/core/access/test.fsx @@ -274,7 +274,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK"; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/anon/test.fsx b/tests/fsharp/core/anon/test.fsx index 580772b3446..6b065cdd7f0 100644 --- a/tests/fsharp/core/anon/test.fsx +++ b/tests/fsharp/core/anon/test.fsx @@ -86,7 +86,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/apporder/test.fsx b/tests/fsharp/core/apporder/test.fsx index 7830de44c1a..5dc19b65fde 100644 --- a/tests/fsharp/core/apporder/test.fsx +++ b/tests/fsharp/core/apporder/test.fsx @@ -1130,7 +1130,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/array-no-dot/test.fsx b/tests/fsharp/core/array-no-dot/test.fsx index 4cba7c3268b..569c477c5eb 100644 --- a/tests/fsharp/core/array-no-dot/test.fsx +++ b/tests/fsharp/core/array-no-dot/test.fsx @@ -435,7 +435,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/array/test.fsx b/tests/fsharp/core/array/test.fsx index 69d1feada8c..ceed74ab3b4 100644 --- a/tests/fsharp/core/array/test.fsx +++ b/tests/fsharp/core/array/test.fsx @@ -1142,7 +1142,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/asyncStackTraces/test.fsx b/tests/fsharp/core/asyncStackTraces/test.fsx index abbd3ec0a4b..34c82a8804c 100644 --- a/tests/fsharp/core/asyncStackTraces/test.fsx +++ b/tests/fsharp/core/asyncStackTraces/test.fsx @@ -176,6 +176,6 @@ let aa = exit 1 else stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 diff --git a/tests/fsharp/core/attributes/test.fsx b/tests/fsharp/core/attributes/test.fsx index 30509f450fd..e17fd3404f1 100644 --- a/tests/fsharp/core/attributes/test.fsx +++ b/tests/fsharp/core/attributes/test.fsx @@ -1358,7 +1358,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/auto-widen/5.0/test.fsx b/tests/fsharp/core/auto-widen/5.0/test.fsx index 83d2f46ab2b..74f1af4fdb9 100644 --- a/tests/fsharp/core/auto-widen/5.0/test.fsx +++ b/tests/fsharp/core/auto-widen/5.0/test.fsx @@ -459,7 +459,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> printfn "Test Failed, failures = %A" failures diff --git a/tests/fsharp/core/auto-widen/minimal/test.fsx b/tests/fsharp/core/auto-widen/minimal/test.fsx index 92e7cfc56da..bf0e11b64a6 100644 --- a/tests/fsharp/core/auto-widen/minimal/test.fsx +++ b/tests/fsharp/core/auto-widen/minimal/test.fsx @@ -2,5 +2,5 @@ #r "System.Xml.XDocument.dll" let ns : System.Xml.Linq.XNamespace = "" -System.IO.File.WriteAllText("test.ok","ok") +printf "TEST PASSED OK" ; exit 0 \ No newline at end of file diff --git a/tests/fsharp/core/auto-widen/preview-default-warns/test.fsx b/tests/fsharp/core/auto-widen/preview-default-warns/test.fsx index 2989aa19071..ea91533c0dd 100644 --- a/tests/fsharp/core/auto-widen/preview-default-warns/test.fsx +++ b/tests/fsharp/core/auto-widen/preview-default-warns/test.fsx @@ -566,7 +566,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> printfn "Test Failed, failures = %A" failures diff --git a/tests/fsharp/core/auto-widen/preview/test.fsx b/tests/fsharp/core/auto-widen/preview/test.fsx index e5e11b074dd..50eaae85f62 100644 --- a/tests/fsharp/core/auto-widen/preview/test.fsx +++ b/tests/fsharp/core/auto-widen/preview/test.fsx @@ -644,7 +644,7 @@ let aa = match failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> printfn "Test Failed, failures = %A" failures diff --git a/tests/fsharp/core/comprehensions-hw/test.fsx b/tests/fsharp/core/comprehensions-hw/test.fsx index 54ccfa1f167..bd47019704e 100644 --- a/tests/fsharp/core/comprehensions-hw/test.fsx +++ b/tests/fsharp/core/comprehensions-hw/test.fsx @@ -1048,7 +1048,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/comprehensions/test.fsx b/tests/fsharp/core/comprehensions/test.fsx index c6cad18b75c..4d9664404cb 100644 --- a/tests/fsharp/core/comprehensions/test.fsx +++ b/tests/fsharp/core/comprehensions/test.fsx @@ -1488,7 +1488,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/control/test.fsx b/tests/fsharp/core/control/test.fsx index 98db3309532..6c80ca0d72b 100644 --- a/tests/fsharp/core/control/test.fsx +++ b/tests/fsharp/core/control/test.fsx @@ -2100,7 +2100,7 @@ let aa = exit 1 else stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/controlChamenos/test.fsx b/tests/fsharp/core/controlChamenos/test.fsx index b95bfff4c80..5742662a53c 100644 --- a/tests/fsharp/core/controlChamenos/test.fsx +++ b/tests/fsharp/core/controlChamenos/test.fsx @@ -123,6 +123,6 @@ let aa = exit 1 else stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/controlMailbox/test.fsx b/tests/fsharp/core/controlMailbox/test.fsx index fc8a1cc7aea..98d6a7d2f31 100644 --- a/tests/fsharp/core/controlMailbox/test.fsx +++ b/tests/fsharp/core/controlMailbox/test.fsx @@ -624,6 +624,6 @@ let aa = exit 1 else stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/controlStackOverflow/test.fsx b/tests/fsharp/core/controlStackOverflow/test.fsx index 735b09173c9..f3678844b05 100644 --- a/tests/fsharp/core/controlStackOverflow/test.fsx +++ b/tests/fsharp/core/controlStackOverflow/test.fsx @@ -415,6 +415,6 @@ let aa = else stdout.WriteLine "Test Passed" log "ALL OK, HAPPY HOLIDAYS, MERRY CHRISTMAS!" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/controlWebExt/test.fsx b/tests/fsharp/core/controlWebExt/test.fsx index 42a43aed573..23e5bf5071e 100644 --- a/tests/fsharp/core/controlWebExt/test.fsx +++ b/tests/fsharp/core/controlWebExt/test.fsx @@ -233,7 +233,7 @@ let aa = if not failures.IsEmpty then (stdout.WriteLine("Test Failed, failures = {0}", failures); exit 1) else (stdout.WriteLine "Test Passed"; log "ALL OK, HAPPY HOLIDAYS, MERRY CHRISTMAS!" - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; // debug: why is the fsi test failing? is it because test.ok does not exist? if System.IO.File.Exists("test.ok") then stdout.WriteLine ("test.ok found at {0}", System.IO.FileInfo("test.ok").FullName) diff --git a/tests/fsharp/core/controlWpf/test.fsx b/tests/fsharp/core/controlWpf/test.fsx index 25ad5eff208..400f196c652 100644 --- a/tests/fsharp/core/controlWpf/test.fsx +++ b/tests/fsharp/core/controlWpf/test.fsx @@ -27,8 +27,8 @@ async { printfn "Test Failed" app.Shutdown(128) else - printfn "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" + printf "TEST PASSED OK" ; app.Shutdown(0) } |> Async.StartImmediate diff --git a/tests/fsharp/core/csext/test.fsx b/tests/fsharp/core/csext/test.fsx index c77a7307642..224fd9dd047 100644 --- a/tests/fsharp/core/csext/test.fsx +++ b/tests/fsharp/core/csext/test.fsx @@ -321,7 +321,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/enum/test.fsx b/tests/fsharp/core/enum/test.fsx index 2bc2d41d783..bf80f12bdc7 100644 --- a/tests/fsharp/core/enum/test.fsx +++ b/tests/fsharp/core/enum/test.fsx @@ -49,7 +49,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/events/test.fs b/tests/fsharp/core/events/test.fs index 0050a8d5635..e9921fcbe25 100644 --- a/tests/fsharp/core/events/test.fs +++ b/tests/fsharp/core/events/test.fs @@ -537,5 +537,5 @@ module EventWithNonPublicDelegateTypes_DevDiv271288 = let _ = if failures.Length > 0 then (printfn "Tests Failed: %A" failures; exit 1) else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/core/fileorder/test.fsx b/tests/fsharp/core/fileorder/test.fsx index 6981cdcc03a..8c874d7d6b5 100644 --- a/tests/fsharp/core/fileorder/test.fsx +++ b/tests/fsharp/core/fileorder/test.fsx @@ -19,5 +19,5 @@ let aa = if !failures then (stdout.WriteLine "Test Failed"; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) \ No newline at end of file diff --git a/tests/fsharp/core/forexpression/test.fsx b/tests/fsharp/core/forexpression/test.fsx index 141fc4677e1..257cdf308f3 100644 --- a/tests/fsharp/core/forexpression/test.fsx +++ b/tests/fsharp/core/forexpression/test.fsx @@ -168,5 +168,5 @@ let RUN() = !failures #else let aa = if !failures then stdout.WriteLine "Test Failed"; exit 1 - else stdout.WriteLine "Test Passed"; System.IO.File.WriteAllText("test.ok","ok"); exit 0 + else stdout.WriteLine "Test Passed"; printf "TEST PASSED OK"; exit 0 #endif diff --git a/tests/fsharp/core/fsfromcs/test.cs b/tests/fsharp/core/fsfromcs/test.cs index 5281b3469e0..7c27491f789 100644 --- a/tests/fsharp/core/fsfromcs/test.cs +++ b/tests/fsharp/core/fsfromcs/test.cs @@ -311,7 +311,7 @@ static int Main() //let tup3 = (2,3,4) //let tup4 = (2,3,4,5) - System.Console.WriteLine("Test Passed."); + System.Console.WriteLine("TEST PASSED OK"); return 0; } diff --git a/tests/fsharp/core/fsfromfsviacs/test.fsx b/tests/fsharp/core/fsfromfsviacs/test.fsx index 7974a4ce47b..e7c47575bd8 100644 --- a/tests/fsharp/core/fsfromfsviacs/test.fsx +++ b/tests/fsharp/core/fsfromfsviacs/test.fsx @@ -487,7 +487,7 @@ let _ = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/fsi-load/test.fsx b/tests/fsharp/core/fsi-load/test.fsx index f81654365e7..062ea882adc 100644 --- a/tests/fsharp/core/fsi-load/test.fsx +++ b/tests/fsharp/core/fsi-load/test.fsx @@ -17,6 +17,6 @@ module OtherModule = let _ = stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 diff --git a/tests/fsharp/core/fsi-reference/test.fsx b/tests/fsharp/core/fsi-reference/test.fsx index 16867d6f344..393b44151c2 100644 --- a/tests/fsharp/core/fsi-reference/test.fsx +++ b/tests/fsharp/core/fsi-reference/test.fsx @@ -4,5 +4,5 @@ let c = new ReferenceAssembly.MyClass() let _ = c.X // If this fails then the jit blows up so this file will not get written. -let os = System.IO.File.CreateText "test.ok" in os.Close() +printf "TEST PASSED OK" ; exit 0 diff --git a/tests/fsharp/core/fsi-reload/load1.fsx b/tests/fsharp/core/fsi-reload/load1.fsx index 0f7fba67329..44b24cddab5 100644 --- a/tests/fsharp/core/fsi-reload/load1.fsx +++ b/tests/fsharp/core/fsi-reload/load1.fsx @@ -2,4 +2,4 @@ #load "a1.fs" #load "a2.fs" -let os = System.IO.File.CreateText "test.ok" in os.Close() +printf "TEST PASSED OK" ; diff --git a/tests/fsharp/core/fsi-reload/load2.fsx b/tests/fsharp/core/fsi-reload/load2.fsx index a30cad3826f..d87b4e10df0 100644 --- a/tests/fsharp/core/fsi-reload/load2.fsx +++ b/tests/fsharp/core/fsi-reload/load2.fsx @@ -2,4 +2,4 @@ #load "b1.fs" #load "b2.fsi" "b2.fs" -let os = System.IO.File.CreateText "test.ok" in os.Close() +printf "TEST PASSED OK" ; diff --git a/tests/fsharp/core/fsi-reload/test1.ml b/tests/fsharp/core/fsi-reload/test1.ml index e9f0a57fa91..9cc77a02eb1 100644 --- a/tests/fsharp/core/fsi-reload/test1.ml +++ b/tests/fsharp/core/fsi-reload/test1.ml @@ -72,6 +72,6 @@ printf "x = %b\n" (X x = X 3) printf "x = %d\n" (3 : x_t) ;; -begin ignore (3 : x_t); ignore (3 : Nested.x_t); ignore (3 : Test1.Nested.x_t); ignore (3 : Test1.x_t); let os = System.IO.File.CreateText "test.ok" in os.Close() end;; +begin ignore (3 : x_t); ignore (3 : Nested.x_t); ignore (3 : Test1.Nested.x_t); ignore (3 : Test1.x_t); printf "TEST PASSED OK" end;; #quit;; diff --git a/tests/fsharp/core/fsi-shadowcopy/test1.fsx b/tests/fsharp/core/fsi-shadowcopy/test1.fsx index 3e34e651775..93f2765b719 100644 --- a/tests/fsharp/core/fsi-shadowcopy/test1.fsx +++ b/tests/fsharp/core/fsi-shadowcopy/test1.fsx @@ -23,8 +23,7 @@ let next = compiled 30000;; //compile will fail because shadow copy is disabled if next = false then printfn "Succeeded -- compile fail because file locked due to --shadowcopyreferences-" - use os = System.IO.File.CreateText "test1.ok" - os.Close() + printf "TEST PASSED OK" ; else printfn "Failed -- compile succeeded but should have failed due to file lock because of --shadowcopyReferences-. Suspect test error";; diff --git a/tests/fsharp/core/fsi-shadowcopy/test2.fsx b/tests/fsharp/core/fsi-shadowcopy/test2.fsx index 34da503c636..94633d0819e 100644 --- a/tests/fsharp/core/fsi-shadowcopy/test2.fsx +++ b/tests/fsharp/core/fsi-shadowcopy/test2.fsx @@ -30,8 +30,7 @@ if next = true then printfn "Succeeded -- compile worked because file not locked due to --shadowcopyReferences+" if verifyGetEntryAssembly then printfn "Succeeded -- GetEntryAssembly() returned not null" - use os = System.IO.File.CreateText "test2.ok" - os.Close() + printf "TEST PASSED OK" ; else printfn "Failed -- GetEntryAssembly() returned null" else diff --git a/tests/fsharp/core/fsiAndModifiers/test.fsx b/tests/fsharp/core/fsiAndModifiers/test.fsx index 16b3d33aee0..c63ddcf384f 100644 --- a/tests/fsharp/core/fsiAndModifiers/test.fsx +++ b/tests/fsharp/core/fsiAndModifiers/test.fsx @@ -139,7 +139,7 @@ module PinTests = if errors.IsEmpty then - System.IO.File.WriteAllText("test.ok", "") + printf "TEST PASSED OK" ; exit(0) else for error in errors do diff --git a/tests/fsharp/core/genericmeasures/test.fsx b/tests/fsharp/core/genericmeasures/test.fsx index b7de5c84aaa..ade03d4fb4c 100644 --- a/tests/fsharp/core/genericmeasures/test.fsx +++ b/tests/fsharp/core/genericmeasures/test.fsx @@ -80,7 +80,7 @@ module Core_genericMeasures = #else RunAll(); stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/indent/version46/test.fsx b/tests/fsharp/core/indent/version46/test.fsx index b9d41a04da5..3cc566d6981 100644 --- a/tests/fsharp/core/indent/version46/test.fsx +++ b/tests/fsharp/core/indent/version46/test.fsx @@ -105,7 +105,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/indent/version47/test.fsx b/tests/fsharp/core/indent/version47/test.fsx index 9a119b4c89f..1cc563cb0aa 100644 --- a/tests/fsharp/core/indent/version47/test.fsx +++ b/tests/fsharp/core/indent/version47/test.fsx @@ -85,7 +85,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/innerpoly/test.fsx b/tests/fsharp/core/innerpoly/test.fsx index e03b322d1c0..c9a8c714bc6 100644 --- a/tests/fsharp/core/innerpoly/test.fsx +++ b/tests/fsharp/core/innerpoly/test.fsx @@ -483,7 +483,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/int32/test.fsx b/tests/fsharp/core/int32/test.fsx index a6dec0ea0af..1c6a500c55a 100644 --- a/tests/fsharp/core/int32/test.fsx +++ b/tests/fsharp/core/int32/test.fsx @@ -425,7 +425,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs index d1910edcce4..330bfa99801 100644 --- a/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs +++ b/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs @@ -207,4 +207,4 @@ let expectedValues() = if rnd.Next(3) = 1 then 1 else 4 printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs index 40840fbdb13..71c3dec00a3 100644 --- a/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs +++ b/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs @@ -421,4 +421,4 @@ let expectedValues() = if rnd.Next(3) = 1 then 1 else 4 printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/lets/LargeLets-500.fs b/tests/fsharp/core/large/lets/LargeLets-500.fs index 5a1aa0697bb..d4e5f29e270 100644 --- a/tests/fsharp/core/large/lets/LargeLets-500.fs +++ b/tests/fsharp/core/large/lets/LargeLets-500.fs @@ -506,4 +506,4 @@ let expectedValues() = let x = x + rnd.Next(3) x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) +printf "TEST PASSED OK" ; diff --git a/tests/fsharp/core/large/lets/LargeLets-maxtested.fs b/tests/fsharp/core/large/lets/LargeLets-maxtested.fs index 9f220268b6e..2c9a0ee6007 100644 --- a/tests/fsharp/core/large/lets/LargeLets-maxtested.fs +++ b/tests/fsharp/core/large/lets/LargeLets-maxtested.fs @@ -792,4 +792,4 @@ let expectedValues() = let x = x + rnd.Next(3) x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) +printf "TEST PASSED OK" ; diff --git a/tests/fsharp/core/large/lists/LargeList-500.fs b/tests/fsharp/core/large/lists/LargeList-500.fs index b46244887a7..0b610e54c1d 100644 --- a/tests/fsharp/core/large/lists/LargeList-500.fs +++ b/tests/fsharp/core/large/lists/LargeList-500.fs @@ -504,4 +504,4 @@ let expectedValues = 1 ] printfn "length = %d" expectedValues.Length -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-200.fs b/tests/fsharp/core/large/matches/LargeMatches-200.fs index 4dac865609a..33624f1275b 100644 --- a/tests/fsharp/core/large/matches/LargeMatches-200.fs +++ b/tests/fsharp/core/large/matches/LargeMatches-200.fs @@ -306,4 +306,4 @@ let expectedValues() = | None -> 4 printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs b/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs index a220824334d..1c992ab7a43 100644 --- a/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs +++ b/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs @@ -462,4 +462,4 @@ let expectedValues() = | None -> 4 printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs index 404817e2a4f..966651362be 100644 --- a/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs +++ b/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs @@ -1008,4 +1008,4 @@ let expectedValues() = let mutable x = x + 1 x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs index 404817e2a4f..966651362be 100644 --- a/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs +++ b/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs @@ -1008,4 +1008,4 @@ let expectedValues() = let mutable x = x + 1 x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-500.fs b/tests/fsharp/core/large/sequential/LargeSequential-500.fs index adfd85723c8..98709915acc 100644 --- a/tests/fsharp/core/large/sequential/LargeSequential-500.fs +++ b/tests/fsharp/core/large/sequential/LargeSequential-500.fs @@ -506,4 +506,4 @@ let expectedValues() = x <- x + rnd.Next(3) x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs b/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs index e28abe4c379..b5fcb01d945 100644 --- a/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs +++ b/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs @@ -6712,4 +6712,4 @@ let expectedValues() = x <- x + rnd.Next(3) x printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file +printf "TEST PASSED OK" ; \ No newline at end of file diff --git a/tests/fsharp/core/lazy/test.fsx b/tests/fsharp/core/lazy/test.fsx index 7b2424252df..a15a1aa33d8 100644 --- a/tests/fsharp/core/lazy/test.fsx +++ b/tests/fsharp/core/lazy/test.fsx @@ -78,7 +78,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/letrec-mutrec/test.fs b/tests/fsharp/core/letrec-mutrec/test.fs index 9f571cf2a9d..720b441cb38 100644 --- a/tests/fsharp/core/letrec-mutrec/test.fs +++ b/tests/fsharp/core/letrec-mutrec/test.fs @@ -203,6 +203,6 @@ do if !failures then (stdout.WriteLine "Test Failed"; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) #endif diff --git a/tests/fsharp/core/letrec-mutrec2/test.fs b/tests/fsharp/core/letrec-mutrec2/test.fs index e9a830ec488..c04592ad0f2 100644 --- a/tests/fsharp/core/letrec-mutrec2/test.fs +++ b/tests/fsharp/core/letrec-mutrec2/test.fs @@ -337,6 +337,6 @@ let aa = do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) #endif \ No newline at end of file diff --git a/tests/fsharp/core/letrec/test.fsx b/tests/fsharp/core/letrec/test.fsx index 27f03ce0213..9d7ea6fbea4 100644 --- a/tests/fsharp/core/letrec/test.fsx +++ b/tests/fsharp/core/letrec/test.fsx @@ -812,7 +812,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/libtest/test.fsx b/tests/fsharp/core/libtest/test.fsx index 370cb4918af..6df6e6e4432 100644 --- a/tests/fsharp/core/libtest/test.fsx +++ b/tests/fsharp/core/libtest/test.fsx @@ -5646,7 +5646,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/lift/test.fsx b/tests/fsharp/core/lift/test.fsx index f47e1ba5972..24ec381a256 100644 --- a/tests/fsharp/core/lift/test.fsx +++ b/tests/fsharp/core/lift/test.fsx @@ -64,7 +64,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/longnames/test.fsx b/tests/fsharp/core/longnames/test.fsx index 577dc547a6d..963f31d4b25 100644 --- a/tests/fsharp/core/longnames/test.fsx +++ b/tests/fsharp/core/longnames/test.fsx @@ -695,7 +695,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/map/test.fsx b/tests/fsharp/core/map/test.fsx index 2e80355e94a..b093d33ff33 100644 --- a/tests/fsharp/core/map/test.fsx +++ b/tests/fsharp/core/map/test.fsx @@ -177,7 +177,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/math/lalgebra/test.fsx b/tests/fsharp/core/math/lalgebra/test.fsx index c09351a1a99..30f8dda47f6 100644 --- a/tests/fsharp/core/math/lalgebra/test.fsx +++ b/tests/fsharp/core/math/lalgebra/test.fsx @@ -313,7 +313,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/math/numbers/test.fsx b/tests/fsharp/core/math/numbers/test.fsx index d9b8eb2edd7..7e1fb5ecb04 100644 --- a/tests/fsharp/core/math/numbers/test.fsx +++ b/tests/fsharp/core/math/numbers/test.fsx @@ -290,7 +290,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/math/numbersVS2008/test.fsx b/tests/fsharp/core/math/numbersVS2008/test.fsx index ec3adaf70c8..d51423a94f3 100644 --- a/tests/fsharp/core/math/numbersVS2008/test.fsx +++ b/tests/fsharp/core/math/numbersVS2008/test.fsx @@ -276,7 +276,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/measures/test.fsx b/tests/fsharp/core/measures/test.fsx index f1dec887c09..83357564018 100644 --- a/tests/fsharp/core/measures/test.fsx +++ b/tests/fsharp/core/measures/test.fsx @@ -612,7 +612,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/basics-hw-mutrec/test.fs b/tests/fsharp/core/members/basics-hw-mutrec/test.fs index 5b53e85196f..cd66176d435 100644 --- a/tests/fsharp/core/members/basics-hw-mutrec/test.fs +++ b/tests/fsharp/core/members/basics-hw-mutrec/test.fs @@ -37,6 +37,6 @@ module StaticInitializerTest3 = let _ = if not failures.Value.IsEmpty then (eprintfn "Test Failed, failures = %A" failures.Value; exit 1) else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/core/members/basics-hw/test.fsx b/tests/fsharp/core/members/basics-hw/test.fsx index e04a76f7ec2..641cb5dbc76 100644 --- a/tests/fsharp/core/members/basics-hw/test.fsx +++ b/tests/fsharp/core/members/basics-hw/test.fsx @@ -5663,7 +5663,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/basics/test.fs b/tests/fsharp/core/members/basics/test.fs index efcaa000692..466e6cdd5b7 100644 --- a/tests/fsharp/core/members/basics/test.fs +++ b/tests/fsharp/core/members/basics/test.fs @@ -3481,7 +3481,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/ctree/test.fsx b/tests/fsharp/core/members/ctree/test.fsx index 117a36d1c18..c12dcd73a61 100644 --- a/tests/fsharp/core/members/ctree/test.fsx +++ b/tests/fsharp/core/members/ctree/test.fsx @@ -64,7 +64,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/factors-mutrec/test.fs b/tests/fsharp/core/members/factors-mutrec/test.fs index 8619ec8e785..e8532addec1 100644 --- a/tests/fsharp/core/members/factors-mutrec/test.fs +++ b/tests/fsharp/core/members/factors-mutrec/test.fs @@ -152,6 +152,6 @@ let Gaussian1DPriorFactorNode((var: VariableNode), mean, variance) = let _ = if !failures then (stdout.WriteLine "Test Failed"; exit 1) else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/core/members/factors/test.fsx b/tests/fsharp/core/members/factors/test.fsx index b2ebe8dbcf4..e8b83b4fa6b 100644 --- a/tests/fsharp/core/members/factors/test.fsx +++ b/tests/fsharp/core/members/factors/test.fsx @@ -276,7 +276,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx index d8543c40291..a661090396c 100644 --- a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx +++ b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx @@ -659,6 +659,6 @@ module ExceptionsWithAugmentations = let _ = if !failures then (stdout.WriteLine "Test Failed"; exit 1) else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/core/members/incremental-hw/test.fsx b/tests/fsharp/core/members/incremental-hw/test.fsx index 0c3ede8a6b7..0fbc223b8e1 100644 --- a/tests/fsharp/core/members/incremental-hw/test.fsx +++ b/tests/fsharp/core/members/incremental-hw/test.fsx @@ -740,7 +740,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/incremental/test.fsx b/tests/fsharp/core/members/incremental/test.fsx index 57015d42851..88b493e0cda 100644 --- a/tests/fsharp/core/members/incremental/test.fsx +++ b/tests/fsharp/core/members/incremental/test.fsx @@ -717,7 +717,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/ops-mutrec/test.fs b/tests/fsharp/core/members/ops-mutrec/test.fs index 1ff8f31135f..b4eae93feb8 100644 --- a/tests/fsharp/core/members/ops-mutrec/test.fs +++ b/tests/fsharp/core/members/ops-mutrec/test.fs @@ -382,6 +382,6 @@ module TraitCallsAndConstructors = let _ = if !failures then (stdout.WriteLine "Test Failed"; exit 1) else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK" exit 0) diff --git a/tests/fsharp/core/members/ops/test.fsx b/tests/fsharp/core/members/ops/test.fsx index a7b611ee9cd..c8ef75f93be 100644 --- a/tests/fsharp/core/members/ops/test.fsx +++ b/tests/fsharp/core/members/ops/test.fsx @@ -416,7 +416,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/self-identifier/version46/test.fs b/tests/fsharp/core/members/self-identifier/version46/test.fs index 5a53a84a4cb..8bd41b0555c 100644 --- a/tests/fsharp/core/members/self-identifier/version46/test.fs +++ b/tests/fsharp/core/members/self-identifier/version46/test.fs @@ -54,7 +54,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/members/self-identifier/version47/test.fs b/tests/fsharp/core/members/self-identifier/version47/test.fs index 76bc777ae0d..2a648678b4e 100644 --- a/tests/fsharp/core/members/self-identifier/version47/test.fs +++ b/tests/fsharp/core/members/self-identifier/version47/test.fs @@ -76,7 +76,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/nameof/preview/test.fsx b/tests/fsharp/core/nameof/preview/test.fsx index 0a952ab823f..4921b12d53e 100644 --- a/tests/fsharp/core/nameof/preview/test.fsx +++ b/tests/fsharp/core/nameof/preview/test.fsx @@ -417,7 +417,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/namespaces/test2.fs b/tests/fsharp/core/namespaces/test2.fs index 4ad843fb442..90a5d6bfe41 100644 --- a/tests/fsharp/core/namespaces/test2.fs +++ b/tests/fsharp/core/namespaces/test2.fs @@ -28,7 +28,7 @@ module UnionTestsWithSignature = exit 1 else stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 #endif diff --git a/tests/fsharp/core/nested/test.fsx b/tests/fsharp/core/nested/test.fsx index 388db9ecc23..410d0f510a3 100644 --- a/tests/fsharp/core/nested/test.fsx +++ b/tests/fsharp/core/nested/test.fsx @@ -64,7 +64,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/patterns/test.fsx b/tests/fsharp/core/patterns/test.fsx index 1eb20080910..dce360f5996 100644 --- a/tests/fsharp/core/patterns/test.fsx +++ b/tests/fsharp/core/patterns/test.fsx @@ -1735,7 +1735,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/pinvoke/test.fsx b/tests/fsharp/core/pinvoke/test.fsx index 7f83b24fd41..29c079e145d 100644 --- a/tests/fsharp/core/pinvoke/test.fsx +++ b/tests/fsharp/core/pinvoke/test.fsx @@ -152,7 +152,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | messages -> printfn "%A" messages diff --git a/tests/fsharp/core/printf-interpolated/test.fsx b/tests/fsharp/core/printf-interpolated/test.fsx index b1891f31ad9..810d7bfd675 100644 --- a/tests/fsharp/core/printf-interpolated/test.fsx +++ b/tests/fsharp/core/printf-interpolated/test.fsx @@ -292,7 +292,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/printf/test.fsx b/tests/fsharp/core/printf/test.fsx index cf78d1a8cbd..a3ae40791a3 100644 --- a/tests/fsharp/core/printf/test.fsx +++ b/tests/fsharp/core/printf/test.fsx @@ -9339,7 +9339,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/queriesCustomQueryOps/test.fsx b/tests/fsharp/core/queriesCustomQueryOps/test.fsx index d542e5d0f4d..4b26f71babd 100644 --- a/tests/fsharp/core/queriesCustomQueryOps/test.fsx +++ b/tests/fsharp/core/queriesCustomQueryOps/test.fsx @@ -459,7 +459,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx index 59583445916..da0505782be 100644 --- a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx +++ b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx @@ -1004,7 +1004,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/queriesNullableOperators/test.fsx b/tests/fsharp/core/queriesNullableOperators/test.fsx index 1cb230749b5..5e400fb5644 100644 --- a/tests/fsharp/core/queriesNullableOperators/test.fsx +++ b/tests/fsharp/core/queriesNullableOperators/test.fsx @@ -311,7 +311,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/queriesOverIEnumerable/test.fsx b/tests/fsharp/core/queriesOverIEnumerable/test.fsx index cb77ad63828..fefcdc309f3 100644 --- a/tests/fsharp/core/queriesOverIEnumerable/test.fsx +++ b/tests/fsharp/core/queriesOverIEnumerable/test.fsx @@ -1002,7 +1002,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/queriesOverIQueryable/test.fsx b/tests/fsharp/core/queriesOverIQueryable/test.fsx index c6e507dfa61..d5a8b6c6858 100644 --- a/tests/fsharp/core/queriesOverIQueryable/test.fsx +++ b/tests/fsharp/core/queriesOverIQueryable/test.fsx @@ -2445,7 +2445,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/quotes/test.fsx b/tests/fsharp/core/quotes/test.fsx index 41efacfbc8d..7aa339449cf 100644 --- a/tests/fsharp/core/quotes/test.fsx +++ b/tests/fsharp/core/quotes/test.fsx @@ -5938,7 +5938,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | errs -> printfn "Test Failed, errors = %A" errs diff --git a/tests/fsharp/core/quotesDebugInfo/test.fsx b/tests/fsharp/core/quotesDebugInfo/test.fsx index 63b68a71777..e2bdcd55ce3 100644 --- a/tests/fsharp/core/quotesDebugInfo/test.fsx +++ b/tests/fsharp/core/quotesDebugInfo/test.fsx @@ -646,7 +646,7 @@ let aa = match !failures with | 0 -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/quotesInMultipleModules/module2.fsx b/tests/fsharp/core/quotesInMultipleModules/module2.fsx index 62a2f9e6e21..c24c10e54bf 100644 --- a/tests/fsharp/core/quotesInMultipleModules/module2.fsx +++ b/tests/fsharp/core/quotesInMultipleModules/module2.fsx @@ -37,7 +37,7 @@ if not test3 then if test1 && test2 && test3 then stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0 else exit 1 diff --git a/tests/fsharp/core/recordResolution/test.fsx b/tests/fsharp/core/recordResolution/test.fsx index 13af38e0d92..545b7b81a7b 100644 --- a/tests/fsharp/core/recordResolution/test.fsx +++ b/tests/fsharp/core/recordResolution/test.fsx @@ -56,5 +56,5 @@ module Ex3 = let a2 = { FA = 1 } let r = a2 :> A2 //this produces warnings, but proves that a2 is indeed of type A2. -System.IO.File.WriteAllText("test.ok","ok") +printf "TEST PASSED OK" ; exit 0 \ No newline at end of file diff --git a/tests/fsharp/core/reflect/test2.fs b/tests/fsharp/core/reflect/test2.fs index 5b4a58e5b8e..78e876605a9 100644 --- a/tests/fsharp/core/reflect/test2.fs +++ b/tests/fsharp/core/reflect/test2.fs @@ -330,7 +330,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/refnormalization/test.fs b/tests/fsharp/core/refnormalization/test.fs index 40c34e96927..994868999e5 100644 --- a/tests/fsharp/core/refnormalization/test.fs +++ b/tests/fsharp/core/refnormalization/test.fs @@ -25,5 +25,5 @@ let main args = printfn "Actual: %A " versions 1 else - File.WriteAllText("test.ok", "ok") + printf "TEST PASSED OK" ; 0 diff --git a/tests/fsharp/core/seq/test.fsx b/tests/fsharp/core/seq/test.fsx index b62a55882aa..62f39fe5f3c 100644 --- a/tests/fsharp/core/seq/test.fsx +++ b/tests/fsharp/core/seq/test.fsx @@ -768,7 +768,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/state-machines/test.fsx b/tests/fsharp/core/state-machines/test.fsx index 5fae4c96b7a..f171bfdbe7b 100644 --- a/tests/fsharp/core/state-machines/test.fsx +++ b/tests/fsharp/core/state-machines/test.fsx @@ -663,7 +663,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/subtype/test.fsx b/tests/fsharp/core/subtype/test.fsx index 688682206e0..820c8566502 100644 --- a/tests/fsharp/core/subtype/test.fsx +++ b/tests/fsharp/core/subtype/test.fsx @@ -2545,7 +2545,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/syntax/test.fsx b/tests/fsharp/core/syntax/test.fsx index c961992da28..c85225a5a73 100644 --- a/tests/fsharp/core/syntax/test.fsx +++ b/tests/fsharp/core/syntax/test.fsx @@ -1841,7 +1841,7 @@ let aa = match !failures with | false -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/tlr/test.fsx b/tests/fsharp/core/tlr/test.fsx index bb8f1bcbf94..3d799fd1fd9 100644 --- a/tests/fsharp/core/tlr/test.fsx +++ b/tests/fsharp/core/tlr/test.fsx @@ -380,7 +380,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/topinit/test_deterministic_init.fs b/tests/fsharp/core/topinit/test_deterministic_init.fs index ea3d5f9df1d..55474ff38a2 100644 --- a/tests/fsharp/core/topinit/test_deterministic_init.fs +++ b/tests/fsharp/core/topinit/test_deterministic_init.fs @@ -597,5 +597,5 @@ printfn "Touching value in module Lib85..." printfn " --> Lib85.x = %A" Lib85.x printfn "Checking this did cause initialization of module Lib85..." checkInitialized "Lib85" InitFlag85.init -System.IO.File.WriteAllText("test.ok","ok") +printf "TEST PASSED OK" ; exit 0 diff --git a/tests/fsharp/core/unicode/test.fsx b/tests/fsharp/core/unicode/test.fsx index 10089e9dd0b..3954ee440cd 100644 --- a/tests/fsharp/core/unicode/test.fsx +++ b/tests/fsharp/core/unicode/test.fsx @@ -139,7 +139,7 @@ let aa = match !failures with | [] -> stdout.WriteLine "Test Passed" - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; exit 0 | _ -> stdout.WriteLine "Test Failed" diff --git a/tests/fsharp/core/unitsOfMeasure/test.fs b/tests/fsharp/core/unitsOfMeasure/test.fs index b2a40a8759f..fa7244122aa 100644 --- a/tests/fsharp/core/unitsOfMeasure/test.fs +++ b/tests/fsharp/core/unitsOfMeasure/test.fs @@ -201,7 +201,7 @@ let main argv = // test2 for _ in CreateBadImageFormatException () do () - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; match failures with | [] -> diff --git a/tests/fsharp/perf/graph/test.ml b/tests/fsharp/perf/graph/test.ml index 1e34121064f..e19614be84e 100644 --- a/tests/fsharp/perf/graph/test.ml +++ b/tests/fsharp/perf/graph/test.ml @@ -538,5 +538,5 @@ end let _ = test() do (System.Console.WriteLine "Test Passed"; - System.IO.File.WriteAllText ("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/perf/nbody/test.ml b/tests/fsharp/perf/nbody/test.ml index 4ec5b9862a1..06b94f4c674 100644 --- a/tests/fsharp/perf/nbody/test.ml +++ b/tests/fsharp/perf/nbody/test.ml @@ -143,6 +143,6 @@ let _ = test "dce98nj" (main 500000 = "-0.169096567") do (System.Console.WriteLine "Test Passed"; - System.IO.File.WriteAllText ("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/regression/12322/test.fsx b/tests/fsharp/regression/12322/test.fsx index 755937aedd4..855a3a2bb51 100644 --- a/tests/fsharp/regression/12322/test.fsx +++ b/tests/fsharp/regression/12322/test.fsx @@ -1489,6 +1489,6 @@ module LotsOfLets = // This is a compilation test, not a lot actually happens in the test do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/12383/test.fs b/tests/fsharp/regression/12383/test.fs index ae10696c9ae..b94d328988d 100644 --- a/tests/fsharp/regression/12383/test.fs +++ b/tests/fsharp/regression/12383/test.fs @@ -2940,6 +2940,6 @@ let inline translate opcode = let translate2 opcode = translate opcode do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/13219/test.fsx b/tests/fsharp/regression/13219/test.fsx index c6ff7817805..be2ff9c7421 100644 --- a/tests/fsharp/regression/13219/test.fsx +++ b/tests/fsharp/regression/13219/test.fsx @@ -18,5 +18,5 @@ type System.Object with // This is a compilation test, not a lot actually happens in the test do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/13710/test.fsx b/tests/fsharp/regression/13710/test.fsx index e80a3ecd54b..22b0c34dcec 100644 --- a/tests/fsharp/regression/13710/test.fsx +++ b/tests/fsharp/regression/13710/test.fsx @@ -12,6 +12,6 @@ printfn $"{auth.Test}" // This is a compilation test, not a lot actually happens in the test do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/26/test.ml b/tests/fsharp/regression/26/test.ml index 525ae7c5e97..287a42bed6a 100644 --- a/tests/fsharp/regression/26/test.ml +++ b/tests/fsharp/regression/26/test.ml @@ -27,6 +27,6 @@ let _ = if (compare [| |] [| |] <> 0) then fail "Test Failed (abcwlvero02)" let _ = System.Console.Error.WriteLine "Test Passed" do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/regression/321/test.ml b/tests/fsharp/regression/321/test.ml index 8669efdbbb8..61f99fc21ac 100644 --- a/tests/fsharp/regression/321/test.ml +++ b/tests/fsharp/regression/321/test.ml @@ -25,5 +25,5 @@ exception Bad_xml_structure of string let _ = (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/regression/655/main.fs b/tests/fsharp/regression/655/main.fs index 2a5f4da2d93..424f52c3b36 100644 --- a/tests/fsharp/regression/655/main.fs +++ b/tests/fsharp/regression/655/main.fs @@ -6,7 +6,7 @@ let xI = x :> Datafile let _ = (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/656/form.fs b/tests/fsharp/regression/656/form.fs index 70bd3f707c2..de189dba38f 100644 --- a/tests/fsharp/regression/656/form.fs +++ b/tests/fsharp/regression/656/form.fs @@ -928,5 +928,5 @@ do Application.Run(mainForm) let _ = (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK" ; exit 0) diff --git a/tests/fsharp/regression/83/test.ml b/tests/fsharp/regression/83/test.ml index 5dad355c937..1188cc35d02 100644 --- a/tests/fsharp/regression/83/test.ml +++ b/tests/fsharp/regression/83/test.ml @@ -41,6 +41,6 @@ let _ = if !failures then (System.Console.Out.WriteLine "Test Failed"; exit 1) do (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/regression/84/test.ml b/tests/fsharp/regression/84/test.ml index b2e868f53b8..b8f9ec7ce0c 100644 --- a/tests/fsharp/regression/84/test.ml +++ b/tests/fsharp/regression/84/test.ml @@ -5,7 +5,7 @@ let _ = | true -> (System.Console.Out.WriteLine "Test Failed"; exit 1) | false -> (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) let _ = (System.Console.Out.WriteLine "Test Ended"; exit 100) diff --git a/tests/fsharp/regression/86/test.ml b/tests/fsharp/regression/86/test.ml index 4b1abe343f6..2ec7219e0be 100644 --- a/tests/fsharp/regression/86/test.ml +++ b/tests/fsharp/regression/86/test.ml @@ -4,7 +4,7 @@ let _ = if '\\' = '\092' & "\\" = "\092" then (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) else (System.Console.Out.WriteLine "Test Failed"; exit 1) diff --git a/tests/fsharp/regression/OverloadResolution-bug/test.fsx b/tests/fsharp/regression/OverloadResolution-bug/test.fsx index ff87afb18cb..c3d3669c450 100644 --- a/tests/fsharp/regression/OverloadResolution-bug/test.fsx +++ b/tests/fsharp/regression/OverloadResolution-bug/test.fsx @@ -31,5 +31,5 @@ module TestOfObj = | _ -> None - System.IO.File.WriteAllText("test.ok","ok") + printf "TEST PASSED OK" ; printfn "Succeeded" diff --git a/tests/fsharp/regression/literal-value-bug-2/test.fsx b/tests/fsharp/regression/literal-value-bug-2/test.fsx index e529df8c863..fa15406ebcc 100644 --- a/tests/fsharp/regression/literal-value-bug-2/test.fsx +++ b/tests/fsharp/regression/literal-value-bug-2/test.fsx @@ -30,7 +30,7 @@ let result = 1 if result = 0 then - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; printfn "Succeeded" else printfn "Failed: %d" result diff --git a/tests/fsharp/regression/struct-tuple-bug-1/test.fsx b/tests/fsharp/regression/struct-tuple-bug-1/test.fsx index e70c5934575..88852695706 100644 --- a/tests/fsharp/regression/struct-tuple-bug-1/test.fsx +++ b/tests/fsharp/regression/struct-tuple-bug-1/test.fsx @@ -14,7 +14,7 @@ let _ = printfn "Test Failed" exit 1 else - printfn "Test Passed" - System.IO.File.WriteAllText("test.ok", "ok") + printf "TEST PASSED OK" + printf "TEST PASSED OK" ; exit 0 () \ No newline at end of file diff --git a/tests/fsharp/regression/tuple-bug-1/test.ml b/tests/fsharp/regression/tuple-bug-1/test.ml index d839ccd0733..bead09c38dd 100644 --- a/tests/fsharp/regression/tuple-bug-1/test.ml +++ b/tests/fsharp/regression/tuple-bug-1/test.ml @@ -25,6 +25,6 @@ let _ = if !failures then (System.Console.Out.WriteLine "Test Failed"; exit 1) else (System.Console.Out.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/single-test.fs b/tests/fsharp/single-test.fs index a84de9a8c94..5869e27aee0 100644 --- a/tests/fsharp/single-test.fs +++ b/tests/fsharp/single-test.fs @@ -87,6 +87,9 @@ let generateOverrides = let template = @" + + + " template @@ -189,7 +192,6 @@ let generateProjectArtifacts (pc:ProjectConfiguration) outputType (targetFramewo - " template |> replace "$(UTILITYSOURCEITEMS)" pc.UtilitySourceItems false false CompileItem.Compile @@ -209,7 +211,6 @@ let generateProjectArtifacts (pc:ProjectConfiguration) outputType (targetFramewo |> replaceTokens "$(RestoreFromArtifactsPath)" (Path.GetFullPath(__SOURCE_DIRECTORY__) + "/../../artifacts/packages/" + configuration) generateProjBody -let lockObj = obj() let singleTestBuildAndRunCore cfg copyFiles p languageVersion = let sources = [] let loadSources = [] @@ -225,22 +226,7 @@ let singleTestBuildAndRunCore cfg copyFiles p languageVersion = // targetFramework optimize = "net472" OR net5.0 etc ... // optimize = true or false let executeSingleTestBuildAndRun outputType compilerType targetFramework optimize buildOnly = - let mutable result = false - let directory = - let mutable result = "" - lock lockObj <| (fun () -> - let rec loop () = - let pathToArtifacts = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "../../../..")) - if Path.GetFileName(pathToArtifacts) <> "artifacts" then failwith "FSharp.Cambridge did not find artifacts directory --- has the location changed????" - let pathToTemp = Path.Combine(pathToArtifacts, "Temp") - let projectDirectory = Path.Combine(pathToTemp, "FSharp.Cambridge", Guid.NewGuid().ToString() + ".tmp") - if Directory.Exists(projectDirectory) then - loop () - else - Directory.CreateDirectory(projectDirectory) |>ignore - projectDirectory - result <- loop()) - result + let directory = cfg.Directory let pc = { OutputType = outputType @@ -269,47 +255,30 @@ let singleTestBuildAndRunCore cfg copyFiles p languageVersion = let propsFileName = Path.Combine(directory, "Directory.Build.props") let overridesFileName = Path.Combine(directory, "Directory.Overrides.targets") let projectFileName = Path.Combine(directory, Guid.NewGuid().ToString() + ".tmp" + ".fsproj") - try - // Clean up directory - Directory.CreateDirectory(directory) |> ignore - copyFilesToDest cfg.Directory directory - try File.Delete(Path.Combine(directory, "FSharp.Core.dll")) with _ -> () - emitFile targetsFileName targetsBody - emitFile overridesFileName overridesBody - let buildOutputFile = Path.Combine(directory, "buildoutput.txt") - if outputType = OutputType.Exe then - let executeFsc testCompilerVersion targetFramework = - let propsBody = generateProps testCompilerVersion cfg.BUILD_CONFIG - emitFile propsFileName propsBody - let projectBody = generateProjectArtifacts pc outputType targetFramework cfg.BUILD_CONFIG languageVersion - emitFile projectFileName projectBody - use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) - let cfg = { cfg with Directory = directory } - let result = execBothToOutNoCheck cfg directory buildOutputFile cfg.DotNetExe (sprintf "run -f %s" targetFramework) - if not (buildOnly) then - result |> checkResult - testOkFile.CheckExists() - executeFsc compilerType targetFramework - if buildOnly then verifyResults (findFirstSourceFile pc) buildOutputFile - else - let executeFsi testCompilerVersion targetFramework = - let propsBody = generateProps testCompilerVersion cfg.BUILD_CONFIG - emitFile propsFileName propsBody - let projectBody = generateProjectArtifacts pc outputType targetFramework cfg.BUILD_CONFIG languageVersion - emitFile projectFileName projectBody - use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) - let cfg = { cfg with Directory = directory } - execBothToOut cfg directory buildOutputFile cfg.DotNetExe "build /t:RunFSharpScript" - testOkFile.CheckExists() - executeFsi compilerType targetFramework - result <- true - finally - if result <> false then - try Directory.Delete(directory, true) with _ -> () - else - printfn "Configuration: %s" cfg.Directory - printfn "Directory: %s" directory - printfn "Filename: %s" projectFileName + emitFile targetsFileName targetsBody + emitFile overridesFileName overridesBody + let buildOutputFile = Path.Combine(directory, "buildoutput.txt") + if outputType = OutputType.Exe then + let executeFsc testCompilerVersion targetFramework = + let propsBody = generateProps testCompilerVersion cfg.BUILD_CONFIG + emitFile propsFileName propsBody + let projectBody = generateProjectArtifacts pc outputType targetFramework cfg.BUILD_CONFIG languageVersion + emitFile projectFileName projectBody + let cfg = { cfg with Directory = directory } + let result = execBothToOutNoCheck cfg directory buildOutputFile cfg.DotNetExe (sprintf "run -f %s" targetFramework) + if not (buildOnly) then + result |> checkResultPassed + executeFsc compilerType targetFramework + if buildOnly then verifyResults (findFirstSourceFile pc) buildOutputFile + else + let executeFsi testCompilerVersion targetFramework = + let propsBody = generateProps testCompilerVersion cfg.BUILD_CONFIG + emitFile propsFileName propsBody + let projectBody = generateProjectArtifacts pc outputType targetFramework cfg.BUILD_CONFIG languageVersion + emitFile projectFileName projectBody + let cfg = { cfg with Directory = directory } + execBothToOutCheckPassed cfg directory buildOutputFile cfg.DotNetExe $"build /t:RunFSharpScriptAndPrintOutput" + executeFsi compilerType targetFramework match p with #if NETCOREAPP @@ -321,19 +290,15 @@ let singleTestBuildAndRunCore cfg copyFiles p languageVersion = | FSI_NETFX_STDIN -> use _cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") let sources = extraSources |> List.filter (fileExists cfg) - fsiStdin cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only - - testOkFile.CheckExists() + fsiStdinCheckPassed cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only | FSC_NETFX_TEST_ROUNDTRIP_AS_DLL -> // Compile as a DLL to exercise pickling of interface data, then recompile the original source file referencing this DLL // The second compilation will not utilize the information from the first in any meaningful way, but the // compiler will unpickle the interface and optimization data, so we test unpickling as well. use _cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") let sources = extraSources |> List.filter (fileExists cfg) @@ -343,9 +308,8 @@ let singleTestBuildAndRunCore cfg copyFiles p languageVersion = peverify cfg "test--optimize-lib.dll" peverify cfg "test--optimize-client-of-lib.exe" - exec cfg ("." ++ "test--optimize-client-of-lib.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize-client-of-lib.exe") "" - testOkFile.CheckExists() #endif let singleTestBuildAndRunAux cfg p = diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 7fdab667a00..ed99adda96a 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -35,37 +35,32 @@ module CoreTests = let ``subtype-langversion-checknulls`` () = let cfg = testConfig "core/subtype" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test-checknulls.exe -g --checknulls" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test-checknulls.exe") "" + execAndCheckPassed cfg ("." ++ "test-checknulls.exe") "" - testOkFile.CheckExists() [] let ``subtype-langversion-no-checknulls`` () = let cfg = testConfig "core/subtype" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test-no-checknulls.exe -g --checknulls-" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test-no-checknulls.exe") "" + execAndCheckPassed cfg ("." ++ "test-no-checknulls.exe") "" - testOkFile.CheckExists() [] let ``subtype-langversion-46`` () = let cfg = testConfig "core/subtype" - use testOkFile = fileguard cfg "test.ok" - fsc cfg "%s -o:test-langversion-46.exe -g --langversion:4.6" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test-langversion-46.exe") "" + execAndCheckPassed cfg ("." ++ "test-langversion-46.exe") "" - testOkFile.CheckExists() #endif @@ -94,75 +89,71 @@ module CoreTests = let cfg = { cfg with fsc_flags = sprintf "%s --preferreduilang:en-US --test:StackSpan" cfg.fsc_flags} begin - use testOkFile = fileguard cfg "test.ok" + singleNegTest cfg "test" fsc cfg "%s -o:test.exe -g" cfg.fsc_flags ["test.fsx"] // Execution is disabled until we can be sure .NET 4.7.2 is on the machine - //exec cfg ("." ++ "test.exe") "" + //execAndCheckPassed cfg ("." ++ "test.exe") "" - //testOkFile.CheckExists() + //checkPassed() end begin - use testOkFile = fileguard cfg "test2.ok" singleNegTest cfg "test2" fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] // Execution is disabled until we can be sure .NET 4.7.2 is on the machine - //exec cfg ("." ++ "test.exe") "" + //execAndCheckPassed cfg ("." ++ "test.exe") "" - //testOkFile.CheckExists() + //checkPassed() end begin - use testOkFile = fileguard cfg "test3.ok" singleNegTest cfg "test3" fsc cfg "%s -o:test3.exe -g" cfg.fsc_flags ["test3.fsx"] // Execution is disabled until we can be sure .NET 4.7.2 is on the machine - //exec cfg ("." ++ "test.exe") "" + //execAndCheckPassed cfg ("." ++ "test.exe") "" - //testOkFile.CheckExists() + //checkPassed() end [] let asyncStackTraces () = let cfg = testConfig "core/asyncStackTraces" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe -g --tailcalls- --optimize-" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() [] let ``state-machines-non-optimized`` () = let cfg = testConfig "core/state-machines" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe -g --tailcalls- --optimize-" cfg.fsc_flags ["test.fsx"] peverify cfg "test.exe" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() [] let ``state-machines-optimized`` () = let cfg = testConfig "core/state-machines" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe -g --tailcalls+ --optimize+" cfg.fsc_flags ["test.fsx"] @@ -170,7 +161,6 @@ module CoreTests = exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() [] let ``state-machines neg-resumable-01`` () = @@ -186,90 +176,79 @@ module CoreTests = [] let ``lots-of-conditionals``() = let cfg = testConfig "core/large/conditionals" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeConditionals-200.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-conditionals-maxtested``() = let cfg = testConfig "core/large/conditionals" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeConditionals-maxtested.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-lets``() = let cfg = testConfig "core/large/lets" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeLets-500.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-lets-maxtested``() = let cfg = testConfig "core/large/lets" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeLets-maxtested.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-lists``() = let cfg = testConfig "core/large/lists" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test-500.exe " cfg.fsc_flags ["LargeList-500.fs"] - exec cfg ("." ++ "test-500.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test-500.exe") "" [] let ``lots-of-matches``() = let cfg = testConfig "core/large/matches" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeMatches-200.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-matches-maxtested``() = let cfg = testConfig "core/large/matches" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeMatches-maxtested.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-sequential-and-let``() = let cfg = testConfig "core/large/mixed" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeSequentialLet-500.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-sequential-and-let-maxtested``() = let cfg = testConfig "core/large/mixed" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeSequentialLet-maxtested.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-sequential``() = let cfg = testConfig "core/large/sequential" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeSequential-500.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" [] let ``lots-of-sequential-maxtested``() = let cfg = testConfig "core/large/sequential" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test.exe " cfg.fsc_flags ["LargeSequential-maxtested.fs"] - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" #endif @@ -295,19 +274,17 @@ module CoreTests = peverify cfg "test.exe" begin - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "-r:lib.dll" ["test.fsx"] + fsiCheckPassed cfg "-r:lib.dll" ["test.fsx"] - testOkFile.CheckExists() end [] @@ -322,13 +299,12 @@ module CoreTests = peverify cfg "testcs.exe" - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "" ["test.fs"] + fsiCheckPassed cfg "" ["test.fs"] - testOkFile.CheckExists() - exec cfg ("." ++ "testcs.exe") "" + execAndCheckPassed cfg ("." ++ "testcs.exe") "" // @@ -355,7 +331,7 @@ module CoreTests = // fsiStdin cfg "%s %s" cfg.fsi_flags flags "test1.fsx" // // // if NOT EXIST test1.ok goto SetError - // testOkFile.CheckExists() + // checkPassed() // // // [] @@ -377,7 +353,7 @@ module CoreTests = // fsiStdin cfg "%s %s" cfg.fsi_flags flags "test2.fsx" // // // if NOT EXIST test2.ok goto SetError - // testOkFile.CheckExists() + // checkPassed() // @@ -446,9 +422,9 @@ module CoreTests = csc cfg """/nologo /r:"%s" /r:System.Core.dll /r:lib--optimize.dll /out:test--optimize.exe""" cfg.FSCOREDLLPATH ["test.cs"] - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - exec cfg ("." ++ "test--optimize.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" [] let fsfromfsviacs () = @@ -467,21 +443,21 @@ module CoreTests = peverify cfg "test.exe" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" // Same with library references the other way around fsc cfg "%s -r:lib.dll -r:lib3.dll -r:lib2.dll -o:test.exe -g" cfg.fsc_flags ["test.fsx"] peverify cfg "test.exe" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" // Same without the reference to lib.dll - testing an incomplete reference set, but only compiling a subset of the code fsc cfg "%s --define:NO_LIB_REFERENCE -r:lib3.dll -r:lib2.dll -o:test.exe -g" cfg.fsc_flags ["test.fsx"] peverify cfg "test.exe" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" // some features missing in 4.7 for version in ["4.7"] do @@ -509,35 +485,22 @@ module CoreTests = let cfg = testConfig "core/fsi-reference" - begin - use testOkFile = fileguard cfg "test.ok" + begin fsc cfg @"--target:library -o:ImplementationAssembly\ReferenceAssemblyExample.dll" ["ImplementationAssembly.fs"] fsc cfg @"--target:library -o:ReferenceAssembly\ReferenceAssemblyExample.dll" ["ReferenceAssembly.fs"] - fsiStdin cfg "test.fsx" "" [] - testOkFile.CheckExists() + fsiStdinCheckPassed cfg "test.fsx" "" [] end [] let ``fsi-reload`` () = let cfg = testConfig "core/fsi-reload" + + fsiStdinCheckPassed cfg "test1.ml" " --langversion:5.0 --mlcompatibility --maxerrors:1" [] + + fsiCheckPassed cfg "%s --maxerrors:1" cfg.fsi_flags ["load1.fsx"] - begin - use testOkFile = fileguard cfg "test.ok" - fsiStdin cfg "test1.ml" " --langversion:5.0 --mlcompatibility --maxerrors:1" [] - testOkFile.CheckExists() - end - - begin - use testOkFile = fileguard cfg "test.ok" - fsi cfg "%s --maxerrors:1" cfg.fsi_flags ["load1.fsx"] - testOkFile.CheckExists() - end - - begin - use testOkFile = fileguard cfg "test.ok" - fsi cfg "%s --maxerrors:1" cfg.fsi_flags ["load2.fsx"] - testOkFile.CheckExists() - end + + fsiCheckPassed cfg "%s --maxerrors:1" cfg.fsi_flags ["load2.fsx"] fsc cfg "" ["load1.fsx"] fsc cfg "" ["load2.fsx"] @@ -551,11 +514,7 @@ module CoreTests = fsiStdin cfg "prepare.fsx" "--maxerrors:1" [] - use testOkFile = fileguard cfg "test.ok" - - fsiStdin cfg "test.fsx" "--maxerrors:1" [] - - testOkFile.CheckExists() + fsiStdinCheckPassed cfg "test.fsx" "--maxerrors:1" [] [] let ``genericmeasures-FSC_NETFX_TEST_ROUNDTRIP_AS_DLL`` () = singleTestBuildAndRun "core/genericmeasures" FSC_NETFX_TEST_ROUNDTRIP_AS_DLL @@ -595,27 +554,24 @@ module CoreTests = singleNegTest cfg "negativetest" begin - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test--optimize.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" - testOkFile.CheckExists() end // Debug with @@ -633,10 +589,10 @@ module CoreTests = let ``fsi b 2>c`` = // "%FSI%" %fsc_flags_errors_ok% --nologo z.raw.output.test.default.txt 2>&1 - let ``exec b 2>c`` (inFile, outFile, errFile) p = + let ``execAndCheckPassed b 2>c`` (inFile, outFile, errFile) p = Command.exec cfg.Directory cfg.EnvironmentVariables { Output = OutputAndError(Overwrite(outFile), Overwrite(errFile)); Input = Some(RedirectInput(inFile)); } p >> checkResult - Printf.ksprintf (fun flags (inFile, outFile, errFile) -> Commands.fsi (``exec b 2>c`` (inFile, outFile, errFile)) cfg.FSI flags []) + Printf.ksprintf (fun flags (inFile, outFile, errFile) -> Commands.fsi (``execAndCheckPassed b 2>c`` (inFile, outFile, errFile)) cfg.FSI flags []) let fsc_flags_errors_ok = "" @@ -819,9 +775,8 @@ module CoreTests = peverify cfg "test.exe" begin - use testOkFile = fileguard cfg "test.ok" - exec cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() + + execAndCheckPassed cfg ("." ++ "test.exe") "" end fsc cfg "%s -o:test-with-debug-data.exe --quotations-debug+ -r cslib.dll -g" cfg.fsc_flags ["test.fsx"] @@ -833,23 +788,20 @@ module CoreTests = peverify cfg "test--optimize.exe" begin - use testOkFile = fileguard cfg "test.ok" + - fsi cfg "%s -r cslib.dll" cfg.fsi_flags ["test.fsx"] + fsiCheckPassed cfg "%s -r cslib.dll" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test.ok" - exec cfg ("." ++ "test-with-debug-data.exe") "" - testOkFile.CheckExists() + + execAndCheckPassed cfg ("." ++ "test-with-debug-data.exe") "" end begin - use testOkFile = fileguard cfg "test.ok" - exec cfg ("." ++ "test--optimize.exe") "" - testOkFile.CheckExists() + + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" end // Previously a comment here said: @@ -948,7 +900,7 @@ module CoreTests = peverify cfg "test.exe" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" log "== Compiling F# Library and Code, when empty file libfile2.fs IS included" fsc cfg "%s -a --optimize -o:lib2.dll " cfg.fsc_flags ["libfile1.fs"; "libfile2.fs"] @@ -959,7 +911,7 @@ module CoreTests = peverify cfg "test2.exe" - exec cfg ("." ++ "test2.exe") "" + execAndCheckPassed cfg ("." ++ "test2.exe") "" // Repro for https://github.com/dotnet/fsharp/issues/2679 [] @@ -1008,26 +960,24 @@ module CoreTests = let ``libtest-langversion-checknulls`` () = let cfg = testConfig "core/libtest" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test-checknulls.exe -g --checknulls" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test-checknulls.exe") "" + execAndCheckPassed cfg ("." ++ "test-checknulls.exe") "" - testOkFile.CheckExists() [] let ``libtest-langversion-46`` () = let cfg = testConfig "core/libtest" - use testOkFile = fileguard cfg "test.ok" + fsc cfg "%s -o:test-langversion-46.exe -g --langversion:4.6" cfg.fsc_flags ["test.fsx"] - exec cfg ("." ++ "test-langversion-46.exe") "" + execAndCheckPassed cfg ("." ++ "test-langversion-46.exe") "" - testOkFile.CheckExists() [] let ``no-warn-2003-tests`` () = @@ -1240,23 +1190,14 @@ module CoreTests = peverify cfg "test--optimize.exe" - use testOkFile = fileguard cfg "test.ok" + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" - use testOkFile2 = fileguard cfg "test.ok" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" - testOkFile2.CheckExists() - - use testOkFile3 = fileguard cfg "test.ok" - - exec cfg ("." ++ "test--optimize.exe") "" - - testOkFile3.CheckExists() [] @@ -1271,17 +1212,11 @@ module CoreTests = peverify cfg "test--optimize.exe" - use testOkFile = fileguard cfg "test.ok" - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] - use testOkFile2 = fileguard cfg "test.ok" - exec cfg ("." ++ "test.exe") "" - testOkFile2.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" - use testOkFile3 = fileguard cfg "test.ok" - exec cfg ("." ++ "test--optimize.exe") "" - testOkFile3.CheckExists() + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" [] let queriesOverIEnumerable () = @@ -1295,23 +1230,15 @@ module CoreTests = peverify cfg "test--optimize.exe" - use testOkFile = fileguard cfg "test.ok" - - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] - - testOkFile.CheckExists() + - use testOkFile2 = fileguard cfg "test.ok" + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] - exec cfg ("." ++ "test.exe") "" - testOkFile2.CheckExists() + execAndCheckPassed cfg ("." ++ "test.exe") "" - use testOkFile3 = fileguard cfg "test.ok" - - exec cfg ("." ++ "test--optimize.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" - testOkFile3.CheckExists() [] let queriesOverIQueryable () = @@ -1325,23 +1252,18 @@ module CoreTests = peverify cfg "test--optimize.exe" - use testOkFile = fileguard cfg "test.ok" - fsi cfg "%s" cfg.fsi_flags ["test.fsx"] + + fsiCheckPassed cfg "%s" cfg.fsi_flags ["test.fsx"] - testOkFile.CheckExists() - use testOkFile2 = fileguard cfg "test.ok" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile2.CheckExists() - use testOkFile3 = fileguard cfg "test.ok" - exec cfg ("." ++ "test--optimize.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" - testOkFile3.CheckExists() [] @@ -1356,23 +1278,17 @@ module CoreTests = peverify cfg "test--optimize.exe" - use testOkFile = fileguard cfg "test.ok" - fsi cfg "%s --quotations-debug+" cfg.fsi_flags ["test.fsx"] - - testOkFile.CheckExists() + + fsiCheckPassed cfg "%s --quotations-debug+" cfg.fsi_flags ["test.fsx"] - use testOkFile2 = fileguard cfg "test.ok" - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile2.CheckExists() - use testOkFile3 = fileguard cfg "test.ok" - exec cfg ("." ++ "test--optimize.exe") "" + execAndCheckPassed cfg ("." ++ "test--optimize.exe") "" - testOkFile3.CheckExists() [] @@ -1399,30 +1315,24 @@ module CoreTests = peverify cfg "module2-opt.exe" - use testOkFile = fileguard cfg "test.ok" - - fsi cfg "%s -r module1.dll" cfg.fsi_flags ["module2.fsx"] - - testOkFile.CheckExists() + + fsiCheckPassed cfg "%s -r module1.dll" cfg.fsi_flags ["module2.fsx"] - use testOkFile = fileguard cfg "test.ok" - exec cfg ("." ++ "module2.exe") "" - testOkFile.CheckExists() + - use testOkFile = fileguard cfg "test.ok" + execAndCheckPassed cfg ("." ++ "module2.exe") "" - exec cfg ("." ++ "module2-opt.exe") "" + - testOkFile.CheckExists() + execAndCheckPassed cfg ("." ++ "module2-opt.exe") "" - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "module2-staticlink.exe") "" + execAndCheckPassed cfg ("." ++ "module2-staticlink.exe") "" - testOkFile.CheckExists() #endif @@ -1442,26 +1352,23 @@ module CoreTests = //TestCase1 // Build a program that references v2 of ascendent and v1 of dependent. // Note that, even though ascendent v2 references dependent v2, the reference is marked as v1. - use TestOk = fileguard cfg "test.ok" + fsc cfg @"%s -o:test1.exe -r:version1\DependentAssembly.dll -r:version2\AscendentAssembly.dll --optimize- -g" cfg.fsc_flags ["test.fs"] - exec cfg ("." ++ "test1.exe") "DependentAssembly-1.0.0.0 AscendentAssembly-2.0.0.0" - TestOk.CheckExists() + execAndCheckPassed cfg ("." ++ "test1.exe") "DependentAssembly-1.0.0.0 AscendentAssembly-2.0.0.0" //TestCase2 // Build a program that references v1 of ascendent and v2 of dependent. // Note that, even though ascendent v1 references dependent v1, the reference is marked as v2 which was passed in. - use TestOk = fileguard cfg "test.ok" + fsc cfg @"%s -o:test2.exe -r:version2\DependentAssembly.dll -r:version1\AscendentAssembly.dll --optimize- -g" cfg.fsc_flags ["test.fs"] - exec cfg ("." ++ "test2.exe") "DependentAssembly-2.0.0.0 AscendentAssembly-1.0.0.0" - TestOk.CheckExists() + execAndCheckPassed cfg ("." ++ "test2.exe") "DependentAssembly-2.0.0.0 AscendentAssembly-1.0.0.0" //TestCase3 // Build a program that references v1 of ascendent and v1 and v2 of dependent. // Verifies that compiler uses first version of a duplicate assembly passed on command line. - use TestOk = fileguard cfg "test.ok" + fsc cfg @"%s -o:test3.exe -r:version1\DependentAssembly.dll -r:version2\DependentAssembly.dll -r:version1\AscendentAssembly.dll --optimize- -g" cfg.fsc_flags ["test.fs"] - exec cfg ("." ++ "test3.exe") "DependentAssembly-1.0.0.0 AscendentAssembly-1.0.0.0" - TestOk.CheckExists() + execAndCheckPassed cfg ("." ++ "test3.exe") "DependentAssembly-1.0.0.0 AscendentAssembly-1.0.0.0" [] @@ -1628,11 +1535,10 @@ module CoreTests = peverify cfg "test.exe" - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() [] let verify () = @@ -1867,11 +1773,10 @@ module RegressionTests = peverify cfg "test.exe" - use testOkFile = fileguard cfg "test.ok" + - exec cfg ("." ++ "test.exe") "" + execAndCheckPassed cfg ("." ++ "test.exe") "" - testOkFile.CheckExists() // This test is disabled in coreclr builds dependent on fixing : https://github.com/dotnet/fsharp/issues/2600 [] diff --git a/tests/fsharp/tools/eval/test.fsx b/tests/fsharp/tools/eval/test.fsx index 69431999bbc..9fb17c1d870 100644 --- a/tests/fsharp/tools/eval/test.fsx +++ b/tests/fsharp/tools/eval/test.fsx @@ -2797,5 +2797,5 @@ let _ = exit 1 else stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0 diff --git a/tests/fsharp/typeProviders/diamondAssembly/test3.fsx b/tests/fsharp/typeProviders/diamondAssembly/test3.fsx index 51e5f1803e7..d3350294831 100644 --- a/tests/fsharp/typeProviders/diamondAssembly/test3.fsx +++ b/tests/fsharp/typeProviders/diamondAssembly/test3.fsx @@ -162,7 +162,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/globalNamespace/test.fsx b/tests/fsharp/typeProviders/globalNamespace/test.fsx index 133be281594..f0201d7d252 100644 --- a/tests/fsharp/typeProviders/globalNamespace/test.fsx +++ b/tests/fsharp/typeProviders/globalNamespace/test.fsx @@ -24,7 +24,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/helloWorld/test.fsx b/tests/fsharp/typeProviders/helloWorld/test.fsx index e528e8da949..59d811bc5a0 100644 --- a/tests/fsharp/typeProviders/helloWorld/test.fsx +++ b/tests/fsharp/typeProviders/helloWorld/test.fsx @@ -1192,7 +1192,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/helloWorldCSharp/test.fsx b/tests/fsharp/typeProviders/helloWorldCSharp/test.fsx index 936e670a305..a4a1fbe3228 100644 --- a/tests/fsharp/typeProviders/helloWorldCSharp/test.fsx +++ b/tests/fsharp/typeProviders/helloWorldCSharp/test.fsx @@ -26,7 +26,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/splitAssemblyTools/test.fsx b/tests/fsharp/typeProviders/splitAssemblyTools/test.fsx index e25871ab5f8..ba7cc6b9e34 100644 --- a/tests/fsharp/typeProviders/splitAssemblyTools/test.fsx +++ b/tests/fsharp/typeProviders/splitAssemblyTools/test.fsx @@ -26,7 +26,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/splitAssemblyTypeproviders/test.fsx b/tests/fsharp/typeProviders/splitAssemblyTypeproviders/test.fsx index e25871ab5f8..ba7cc6b9e34 100644 --- a/tests/fsharp/typeProviders/splitAssemblyTypeproviders/test.fsx +++ b/tests/fsharp/typeProviders/splitAssemblyTypeproviders/test.fsx @@ -26,7 +26,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typeProviders/wedgeAssembly/test3.fsx b/tests/fsharp/typeProviders/wedgeAssembly/test3.fsx index 7e6125c4be9..1a3c546d17a 100644 --- a/tests/fsharp/typeProviders/wedgeAssembly/test3.fsx +++ b/tests/fsharp/typeProviders/wedgeAssembly/test3.fsx @@ -108,7 +108,7 @@ let _ = if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/fsharp/typecheck/full-rank-arrays/test.fsx b/tests/fsharp/typecheck/full-rank-arrays/test.fsx index 0a062adae4a..d8800170979 100644 --- a/tests/fsharp/typecheck/full-rank-arrays/test.fsx +++ b/tests/fsharp/typecheck/full-rank-arrays/test.fsx @@ -107,5 +107,5 @@ let _ = let x = Class1() x.RunTests() System.Console.WriteLine "Test Passed"; - System.IO.File.WriteAllText ("test.ok", "ok"); + printf "TEST PASSED OK" exit 0 diff --git a/tests/fsharp/typecheck/misc/test.ml b/tests/fsharp/typecheck/misc/test.ml index 4a2e5c89332..14bc16ae51f 100644 --- a/tests/fsharp/typecheck/misc/test.ml +++ b/tests/fsharp/typecheck/misc/test.ml @@ -33,5 +33,5 @@ let _ = * So avoid using ;; *) System.Console.WriteLine "Test Passed"; - System.IO.File.WriteAllText ("test.ok", "ok"); + printf "TEST PASSED OK"; exit 0 diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/backtickmoduleandtypenames.fsx b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/backtickmoduleandtypenames.fsx index 20aede76c20..47debdeb71f 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/backtickmoduleandtypenames.fsx +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/backtickmoduleandtypenames.fsx @@ -75,5 +75,5 @@ let aa = if !failures then (stdout.WriteLine "Test Failed"; exit 1) do (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); + printf "TEST PASSED OK"; exit 0) diff --git a/tests/scripts/scriptlib.fsx b/tests/scripts/scriptlib.fsx index b074b78ba25..853aecb496e 100644 --- a/tests/scripts/scriptlib.fsx +++ b/tests/scripts/scriptlib.fsx @@ -82,7 +82,7 @@ module Scripting = type FilePath = string type CmdResult = - | Success + | Success of output: string | ErrorLevel of string * int type CmdArguments = @@ -156,7 +156,8 @@ module Scripting = p.WaitForExit() match p.ExitCode with - | 0 -> Success + | 0 -> + Success(string out) | errCode -> let msg = sprintf "Error running command '%s' with args '%s' in directory '%s'.\n---- stdout below --- \n%s\n---- stderr below --- \n%s " exePath arguments workDir (out.ToString()) (err.ToString()) ErrorLevel (msg, errCode) From dc2494a89005683f9fb38d80234935aa48520b8b Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Fri, 4 Oct 2024 01:42:08 +0300 Subject: [PATCH 28/37] CompilerOrder: set metadata for CompileFirst items (#17820) Co-authored-by: Kevin Ransom (msft) --- src/FSharp.Build/Microsoft.FSharp.NetSdk.props | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/FSharp.Build/Microsoft.FSharp.NetSdk.props index c4b5228dfd4..71dfca26382 100644 --- a/src/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -131,6 +131,10 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and true + + CompileFirst + + CompileBefore From f1b9addb02821459ea4bf7489f6249f7da4319bf Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Fri, 4 Oct 2024 12:58:30 +0200 Subject: [PATCH 29/37] Nullness bugfix - change isObjTy early returns in ConstraintSolver (#17757) --- .fantomasignore | 3 + .../.FSharp.Compiler.Service/9.0.200.md | 2 +- src/Compiler/AbstractIL/ilreflect.fs | 2 +- src/Compiler/Checking/AttributeChecking.fs | 4 +- src/Compiler/Checking/ConstraintSolver.fs | 1287 +++++++++-------- .../Checking/Expressions/CheckExpressions.fs | 10 +- src/Compiler/Checking/InfoReader.fs | 2 +- src/Compiler/Checking/MethodCalls.fs | 2 +- src/Compiler/Checking/NameResolution.fs | 16 +- src/Compiler/Checking/NicePrint.fs | 2 +- src/Compiler/Checking/TypeHierarchy.fs | 2 +- src/Compiler/Checking/TypeRelations.fs | 2 +- src/Compiler/Checking/infos.fs | 10 +- src/Compiler/CodeGen/IlxGen.fs | 6 +- .../DependencyManager/DependencyProvider.fs | 28 +- src/Compiler/Driver/GraphChecking/Graph.fs | 2 +- src/Compiler/Driver/GraphChecking/Graph.fsi | 2 +- src/Compiler/Facilities/prim-parsing.fs | 8 +- src/Compiler/Interactive/fsi.fs | 2 +- src/Compiler/Symbols/Exprs.fs | 2 +- src/Compiler/SyntaxTree/ParseHelpers.fs | 2 +- src/Compiler/TypedTree/TypeProviders.fs | 2 +- src/Compiler/TypedTree/TypedTreeOps.fs | 15 +- src/Compiler/TypedTree/TypedTreeOps.fsi | 10 +- src/Compiler/Utilities/FileSystem.fs | 2 +- src/Compiler/Utilities/illib.fs | 2 +- src/Compiler/Utilities/sformat.fs | 5 +- src/Compiler/Utilities/sr.fs | 2 +- src/FSharp.Build/FSharpEmbedResourceText.fs | 2 +- .../EmittedIL/Nullness/GenericCode.fs | 19 + .../Nullness/GenericCode.fs.il.net472.bsl | 222 +++ .../Nullness/GenericCode.fs.il.netcore.bsl | 157 ++ .../EmittedIL/Nullness/NullnessMetadata.fs | 6 + .../Nullness/NullableReferenceTypesTests.fs | 128 +- .../using-nullness-syntax-positive.fs | 6 +- ...s-syntax-positive.fs.checknulls_on.err.bsl | 1 + tests/fsharp/core/libtest/test.fsx | 4 +- tests/fsharp/core/subtype/test.fsx | 8 +- 38 files changed, 1265 insertions(+), 722 deletions(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.net472.bsl create mode 100644 tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.netcore.bsl diff --git a/.fantomasignore b/.fantomasignore index a4802164d9b..20249273f54 100644 --- a/.fantomasignore +++ b/.fantomasignore @@ -117,6 +117,9 @@ src/Compiler/Facilities/AsyncMemoize.fsi src/Compiler/Facilities/AsyncMemoize.fs src/Compiler/AbstractIL/il.fs +src/Compiler/Driver/GraphChecking/Graph.fsi +src/Compiler/Driver/GraphChecking/Graph.fs + # Fantomas limitations on implementation files (to investigate) src/Compiler/AbstractIL/ilwrite.fs diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index c7d7b11d770..688dd4bc702 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -1,11 +1,11 @@ ### Fixed +* Fix false negatives for passing null to "obj" arguments. Only "obj | null" can now subsume any type ([PR #17757](https://github.com/dotnet/fsharp/pull/17757)) * Fix internal error when calling 'AddSingleton' and other overloads only differing in generic arity ([PR #17804](https://github.com/dotnet/fsharp/pull/17804)) * Fix extension methods support for non-reference system assemblies ([PR #17799](https://github.com/dotnet/fsharp/pull/17799)) * Ensure `frameworkTcImportsCache` mutations are thread-safe. ([PR #17795](https://github.com/dotnet/fsharp/pull/17795)) * Fix concurrency issue in `ILPreTypeDefImpl` ([PR #17812](https://github.com/dotnet/fsharp/pull/17812)) - ### Added diff --git a/src/Compiler/AbstractIL/ilreflect.fs b/src/Compiler/AbstractIL/ilreflect.fs index 2a65eb8679b..5a52ddc017a 100644 --- a/src/Compiler/AbstractIL/ilreflect.fs +++ b/src/Compiler/AbstractIL/ilreflect.fs @@ -277,7 +277,7 @@ type TypeBuilder with match m with | null -> raise (MissingMethodException nm) - | m -> m.Invoke(null, args) + | m -> m.Invoke(null, (args: obj array)) member typB.SetCustomAttributeAndLog(cinfo, bytes) = if logRefEmitCalls then diff --git a/src/Compiler/Checking/AttributeChecking.fs b/src/Compiler/Checking/AttributeChecking.fs index a91ace98d4a..8ef659ac20e 100644 --- a/src/Compiler/Checking/AttributeChecking.fs +++ b/src/Compiler/Checking/AttributeChecking.fs @@ -466,9 +466,9 @@ let MethInfoIsUnseen g (m: range) (ty: TType) minfo = let isUnseenByHidingAttribute () = #if !NO_TYPEPROVIDERS - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && isAppTy g ty && - isObjTy g minfo.ApparentEnclosingType && + isObjTyAnyNullness g minfo.ApparentEnclosingType && let tcref = tcrefOfAppTy g ty match tcref.TypeReprInfo with | TProvidedTypeRepr info -> diff --git a/src/Compiler/Checking/ConstraintSolver.fs b/src/Compiler/Checking/ConstraintSolver.fs index f9ed37fe9ca..6c79c33be97 100644 --- a/src/Compiler/Checking/ConstraintSolver.fs +++ b/src/Compiler/Checking/ConstraintSolver.fs @@ -1225,164 +1225,165 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr TransactMemberConstraintSolution traitInfo trace traitSln | _ -> () - if ty1 === ty2 then CompleteD else + if ty1 === ty2 then + CompleteD + else + let canShortcut = not trace.HasTrace + let sty1 = stripTyEqnsA csenv.g canShortcut ty1 + let sty2 = stripTyEqnsA csenv.g canShortcut ty2 + + let csenv = + match ty1 with + | TType.TType_var(r,_) when r.typar_flags.IsSupportsNullFlex -> + { csenv with IsSupportsNullFlex = true} + | _ -> csenv + + match sty1, sty2 with + // type vars inside forall-types may be alpha-equivalent + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when typarEq tp1 tp2 || (match aenv.EquivTypars.TryFind tp1 with | Some tpTy1 when typeEquiv g tpTy1 ty2 -> true | _ -> false) -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when PreferUnifyTypar tp1 tp2 -> + match nullness1.TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 + } + //// Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 + let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 nullness2 + } - let canShortcut = not trace.HasTrace - let sty1 = stripTyEqnsA csenv.g canShortcut ty1 - let sty2 = stripTyEqnsA csenv.g canShortcut ty2 - let csenv = - match ty1 with - | TType.TType_var(r,_) when r.typar_flags.IsSupportsNullFlex -> - { csenv with IsSupportsNullFlex = true} - | _ -> csenv - - match sty1, sty2 with - // type vars inside forall-types may be alpha-equivalent - | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when typarEq tp1 tp2 || (match aenv.EquivTypars.TryFind tp1 with | Some tpTy1 when typeEquiv g tpTy1 ty2 -> true | _ -> false) -> - SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 - - | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when PreferUnifyTypar tp1 tp2 -> - match nullness1.TryEvaluate(), nullness2.TryEvaluate() with - // Unifying 'T1? and 'T2? - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> - SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> - let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) - trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 - } - //// Unifying 'T1 % and 'T2 % - //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> - // SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) - | _ -> - trackErrors { - do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 - let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 nullness2 - } + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when not csenv.MatchingOnly && PreferUnifyTypar tp2 tp1 -> + match nullness1.TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 + } + //// Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) + | _ -> + // Unifying 'T1 ? and 'T2 % + // Unifying 'T1 % and 'T2 ? + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + } + | TType_var (tp1, nullness1), _ when not (IsRigid csenv tp1) -> + match nullness1.TryEvaluate(), (nullnessOfTy g sty2).TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) + | ValueSome NullnessInfo.WithoutNull, ValueSome NullnessInfo.WithoutNull when + csenv.IsSupportsNullFlex && + isAppTy g sty2 && + tp1.Constraints |> List.exists (function TyparConstraint.SupportsNull _ -> true | _ -> false) -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty2 + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln ty1 (TType_var(tpNew, g.knownWithNull)) + } + // Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 + let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 (nullnessOfTy g sty2) + } - | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when not csenv.MatchingOnly && PreferUnifyTypar tp2 tp1 -> - match nullness1.TryEvaluate(), nullness2.TryEvaluate() with - // Unifying 'T1? and 'T2? - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> - SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> - let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) - trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 - } - //// Unifying 'T1 % and 'T2 % - //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> - // SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) - | _ -> - // Unifying 'T1 ? and 'T2 % - // Unifying 'T1 % and 'T2 ? + | _, TType_var (tp2, nullness2) when not csenv.MatchingOnly && not (IsRigid csenv tp2) -> + match (nullnessOfTy g sty1).TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) + // Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 + } + + // Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1> + | (_, TType_app (tc2, [ms2], _)) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2])) -> trackErrors { - do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 - let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + do! SolveTypeEqualsType csenv ndeep m2 trace None (TType_measure Measure.One) ms2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) } - | TType_var (tp1, nullness1), _ when not (IsRigid csenv tp1) -> - match nullness1.TryEvaluate(), (nullnessOfTy g sty2).TryEvaluate() with - // Unifying 'T1? and 'T2? - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> - SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) - | ValueSome NullnessInfo.WithoutNull, ValueSome NullnessInfo.WithoutNull when - csenv.IsSupportsNullFlex && - isAppTy g sty2 && - tp1.Constraints |> List.exists (function TyparConstraint.SupportsNull _ -> true | _ -> false) -> - let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) - trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty2 - do! SolveTypeEqualsType csenv ndeep m2 trace cxsln ty1 (TType_var(tpNew, g.knownWithNull)) - } - // Unifying 'T1 % and 'T2 % - //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> - // SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) - | _ -> + | (TType_app (tc1, [ms1], _), _) when (tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1])) -> trackErrors { - do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 - let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 (nullnessOfTy g sty2) + do! SolveTypeEqualsType csenv ndeep m2 trace None ms1 (TType_measure Measure.One) + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) } - | _, TType_var (tp2, nullness2) when not csenv.MatchingOnly && not (IsRigid csenv tp2) -> - match (nullnessOfTy g sty1).TryEvaluate(), nullness2.TryEvaluate() with - // Unifying 'T1? and 'T2? - | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> - SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) - // Unifying 'T1 % and 'T2 % - //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> - // SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) - | _ -> + | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> trackErrors { - do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 - let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) } + | TType_app _, TType_app _ -> + localAbortD - // Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1> - | (_, TType_app (tc2, [ms2], _)) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2])) -> - trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace None (TType_measure Measure.One) ms2 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } - - | (TType_app (tc1, [ms1], _), _) when (tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1])) -> - trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace None ms1 (TType_measure Measure.One) - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } - - | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> - trackErrors { - do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } - | TType_app _, TType_app _ -> - localAbortD - - | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> - if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then - ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) - else - SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> + if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then + ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) + else + SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> - trackErrors { - do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 - do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - } + | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> + trackErrors { + do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + } - | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> - trackErrors { - do! SolveFunTypeEqn csenv ndeep m2 trace None domainTy1 domainTy2 rangeTy1 rangeTy2 - do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 - } + | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> + trackErrors { + do! SolveFunTypeEqn csenv ndeep m2 trace None domainTy1 domainTy2 rangeTy1 rangeTy2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + } - | TType_measure ms1, TType_measure ms2 -> - UnifyMeasures csenv trace ms1 ms2 + | TType_measure ms1, TType_measure ms2 -> + UnifyMeasures csenv trace ms1 ms2 - | TType_forall(tps1, bodyTy1), TType_forall(tps2, bodyTy2) -> - if tps1.Length <> tps2.Length then - localAbortD - else - let aenv = aenv.BindEquivTypars tps1 tps2 - let csenv = {csenv with EquivEnv = aenv } - if not (typarsAEquiv g aenv tps1 tps2) then + | TType_forall(tps1, bodyTy1), TType_forall(tps2, bodyTy2) -> + if tps1.Length <> tps2.Length then localAbortD else - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bodyTy1 bodyTy2 + let aenv = aenv.BindEquivTypars tps1 tps2 + let csenv = {csenv with EquivEnv = aenv } + if not (typarsAEquiv g aenv tps1 tps2) then + localAbortD + else + SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bodyTy1 bodyTy2 - | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - | _ -> localAbortD + | _ -> localAbortD and SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1 ty2 = SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace None ty1 ty2 @@ -1455,132 +1456,136 @@ and SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rang // // "ty2 casts to ty1" // "a value of type ty2 can be used where a value of type ty1 is expected" -and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = - // 'a :> obj ---> +and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = let ndeep = ndeep + 1 let g = csenv.g - if isObjTy g ty1 then CompleteD else let canShortcut = not trace.HasTrace - let sty1 = stripTyEqnsA csenv.g canShortcut ty1 - let sty2 = stripTyEqnsA csenv.g canShortcut ty2 - let amap = csenv.amap - let aenv = csenv.EquivEnv - let denv = csenv.DisplayEnv + // 'a :> objnull ---> + if isObjNullTy g ty1 then + CompleteD + elif isObjTyAnyNullness g ty1 && not csenv.MatchingOnly && not(isTyparTy g ty2) then + let nullness t = t |> stripTyEqnsA g canShortcut |> nullnessOfTy g + SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullness ty1) (nullness ty2) + else + let sty1 = stripTyEqnsA csenv.g canShortcut ty1 + let sty2 = stripTyEqnsA csenv.g canShortcut ty2 + let amap = csenv.amap + let aenv = csenv.EquivEnv + let denv = csenv.DisplayEnv - match sty1, sty2 with - | TType_var (tp1, nullness1) , _ -> - match aenv.EquivTypars.TryFind tp1 with - | Some tpTy1 -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln tpTy1 ty2 - | _ -> - match sty2 with - | TType_var (r2, nullness2) when typarEq tp1 r2 -> - SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 - | TType_var (r2, nullness2) when not csenv.MatchingOnly -> + match sty1, sty2 with + | TType_var (tp1, nullness1) , _ -> + match aenv.EquivTypars.TryFind tp1 with + | Some tpTy1 -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln tpTy1 ty2 + | _ -> + match sty2 with + | TType_var (r2, nullness2) when typarEq tp1 r2 -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + | TType_var (r2, nullness2) when not csenv.MatchingOnly -> + trackErrors { + do! SolveTyparSubtypeOfType csenv ndeep m2 trace r2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + } + | _ -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2 + + | _, TType_var (r2, nullness2) when not csenv.MatchingOnly -> trackErrors { do! SolveTyparSubtypeOfType csenv ndeep m2 trace r2 ty1 let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 } - | _ -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2 - - | _, TType_var (r2, nullness2) when not csenv.MatchingOnly -> - trackErrors { - do! SolveTyparSubtypeOfType csenv ndeep m2 trace r2 ty1 - let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 - } - - | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> - if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then - ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) - else - SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) - | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> - // nb. can unify since no variance - trackErrors { - do! SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullness2 - } - | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> - trackErrors { - do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 - do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 - } - | TType_measure ms1, TType_measure ms2 -> - UnifyMeasures csenv trace ms1 ms2 - // Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1> - | _, TType_app (tc2, [ms2], _) when tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2]) -> - trackErrors { - do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms2 (TType_measure Measure.One) - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } - - | TType_app (tc1, [ms1], _), _ when tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1]) -> - trackErrors { - do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms1 (TType_measure Measure.One) - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> + if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then + ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) + else + SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) + | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> + // nb. can unify since no variance + trackErrors { + do! SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullness2 + } + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> + trackErrors { + do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + } + | TType_measure ms1, TType_measure ms2 -> + UnifyMeasures csenv trace ms1 ms2 - // Special subsumption rule for byref tags - | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> - match l1, l2 with - | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 - match stripTyEqnsA csenv.g canShortcut tag1, stripTyEqnsA csenv.g canShortcut tag2 with - | TType_app(tagc1, [], _), TType_app(tagc2, [], _) - when (tyconRefEq g tagc2 g.byrefkind_InOut_tcr && - (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> () - | _ -> return! SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2 - } - | _ -> SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange - - | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> - trackErrors { - do! SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange - do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) - } + // Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1> + | _, TType_app (tc2, [ms2], _) when tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2]) -> + trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms2 (TType_measure Measure.One) + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + | TType_app (tc1, [ms1], _), _ when tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1]) -> + trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms1 (TType_measure Measure.One) + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | _ -> - // By now we know the type is not a variable type + // Special subsumption rule for byref tags + | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> + match l1, l2 with + | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 + match stripTyEqnsA csenv.g canShortcut tag1, stripTyEqnsA csenv.g canShortcut tag2 with + | TType_app(tagc1, [], _), TType_app(tagc2, [], _) + when (tyconRefEq g tagc2 g.byrefkind_InOut_tcr && + (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> () + | _ -> return! SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2 + } + | _ -> SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange - // C :> obj ---> - if isObjTy g ty1 then CompleteD else - - let m = csenv.m + | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> + trackErrors { + do! SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - // 'a[] :> IList<'b> ---> 'a = 'b - // 'a[] :> ICollection<'b> ---> 'a = 'b - // 'a[] :> IEnumerable<'b> ---> 'a = 'b - // 'a[] :> IReadOnlyList<'b> ---> 'a = 'b - // 'a[] :> IReadOnlyCollection<'b> ---> 'a = 'b - // Note we don't support co-variance on array types nor - // the special .NET conversions for these types - match ty1 with - | AppTy g (tcref1, tinst1) when - isArray1DTy g ty2 && - (tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IList || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_ICollection || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyList || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyCollection || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IEnumerable) -> - match tinst1 with - | [elemTy1] -> - let elemTy2 = destArrayTy g ty2 - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln elemTy1 elemTy2 - | _ -> error(InternalError("destArrayTy", m)) + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 | _ -> - // D :> Head<_> --> C :> Head<_> for the - // first interface or super-class C supported by D which - // may feasibly convert to Head. - match FindUniqueFeasibleSupertype g amap m ty1 ty2 with - | None -> ErrorD(ConstraintSolverTypesNotInSubsumptionRelation(denv, ty1, ty2, m, m2)) - | Some t -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln ty1 t + // By now we know the type is not a variable type + // C :> obj ---> + if isObjNullTy g ty1 then + CompleteD + else + let m = csenv.m + // 'a[] :> IList<'b> ---> 'a = 'b + // 'a[] :> ICollection<'b> ---> 'a = 'b + // 'a[] :> IEnumerable<'b> ---> 'a = 'b + // 'a[] :> IReadOnlyList<'b> ---> 'a = 'b + // 'a[] :> IReadOnlyCollection<'b> ---> 'a = 'b + // Note we don't support co-variance on array types nor + // the special .NET conversions for these types + match ty1 with + | AppTy g (tcref1, tinst1) when + isArray1DTy g ty2 && + (tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IList || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_ICollection || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyList || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyCollection || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IEnumerable) -> + match tinst1 with + | [elemTy1] -> + let elemTy2 = destArrayTy g ty2 + SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln elemTy1 elemTy2 + | _ -> error(InternalError("destArrayTy", m)) + + | _ -> + // D :> Head<_> --> C :> Head<_> for the + // first interface or super-class C supported by D which + // may feasibly convert to Head. + match FindUniqueFeasibleSupertype g amap m ty1 ty2 with + | None -> ErrorD(ConstraintSolverTypesNotInSubsumptionRelation(denv, ty1, ty2, m, m2)) + | Some t -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln ty1 t and SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace cxsln ty1 ty2 = let denv = csenv.DisplayEnv @@ -1595,15 +1600,22 @@ and SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace cxsln ty1 ty2 = and SolveTyparSubtypeOfType (csenv: ConstraintSolverEnv) ndeep m2 trace tp ty1 = let g = csenv.g - if isObjTy g ty1 then CompleteD - elif typeEquiv g ty1 (mkTyparTy tp) then CompleteD + if isObjNullTy g ty1 then + CompleteD + elif isObjTyAnyNullness g ty1 then + AddConstraint csenv ndeep m2 trace tp (TyparConstraint.NotSupportsNull csenv.m) + elif typeEquiv g ty1 (mkTyparTy tp) then + CompleteD elif isSealedTy g ty1 then SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace (mkTyparTy tp) ty1 else AddConstraint csenv ndeep m2 trace tp (TyparConstraint.CoercesTo(ty1, csenv.m)) and DepthCheck ndeep m = - if ndeep > 300 then error(Error(FSComp.SR.csTypeInferenceMaxDepth(), m)) else CompleteD + if ndeep > 300 then + error(Error(FSComp.SR.csTypeInferenceMaxDepth(), m)) + else + CompleteD // If this is a type that's parameterized on a unit-of-measure (expected to be numeric), unify its measure with 1 and SolveDimensionlessNumericType (csenv: ConstraintSolverEnv) ndeep m2 trace ty = @@ -1625,434 +1637,435 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload trackErrors { let (TTrait(supportTys, nm, memFlags, traitObjAndArgTys, retTy, source, sln)) = traitInfo // Do not re-solve if already solved - if sln.Value.IsSome then return true else - - let g = csenv.g - let m = csenv.m - let amap = csenv.amap - let aenv = csenv.EquivEnv - let denv = csenv.DisplayEnv + if sln.Value.IsSome then + return true + else + let g = csenv.g + let m = csenv.m + let amap = csenv.amap + let aenv = csenv.EquivEnv + let denv = csenv.DisplayEnv - let ndeep = ndeep + 1 - do! DepthCheck ndeep m + let ndeep = ndeep + 1 + do! DepthCheck ndeep m - // Remove duplicates from the set of types in the support - let supportTys = ListSet.setify (typeAEquiv g aenv) supportTys + // Remove duplicates from the set of types in the support + let supportTys = ListSet.setify (typeAEquiv g aenv) supportTys - // Rebuild the trait info after removing duplicates - let traitInfo = traitInfo.WithSupportTypes supportTys - let retTy = GetFSharpViewOfReturnType g retTy + // Rebuild the trait info after removing duplicates + let traitInfo = traitInfo.WithSupportTypes supportTys + let retTy = GetFSharpViewOfReturnType g retTy - // Assert the object type if the constraint is for an instance member - if memFlags.IsInstance then - match supportTys, traitObjAndArgTys with - | [ty], h :: _ -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty - | _ -> do! ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) + // Assert the object type if the constraint is for an instance member + if memFlags.IsInstance then + match supportTys, traitObjAndArgTys with + | [ty], h :: _ -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty + | _ -> do! ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) + + // Trait calls are only supported on pseudo type (variables) + if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then + for e in supportTys do + do! SolveTypStaticReq csenv trace TyparStaticReq.HeadType e + + // SRTP constraints on rigid type parameters do not need to be solved + let isRigid = + supportTys |> List.forall (fun ty -> + match tryDestTyparTy g ty with + | ValueSome tp -> + match tp.Rigidity with + | TyparRigidity.Rigid + | TyparRigidity.WillBeRigid -> true + | _ -> false + | ValueNone -> false) + + let argTys = if memFlags.IsInstance then List.tail traitObjAndArgTys else traitObjAndArgTys + + let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo + + let! res = + trackErrors { + match minfos, supportTys, memFlags.IsInstance, nm, argTys with + | _, _, false, ("op_Division" | "op_Multiply"), [argTy1;argTy2] + when + // This simulates the existence of + // float * float -> float + // float32 * float32 -> float32 + // float<'u> * float<'v> -> float<'u 'v> + // float32<'u> * float32<'v> -> float32<'u 'v> + // decimal<'u> * decimal<'v> -> decimal<'u 'v> + // decimal<'u> * decimal -> decimal<'u> + // float32<'u> * float32<'v> -> float32<'u 'v> + // int * int -> int + // int64 * int64 -> int64 + // + // The rule is triggered by these sorts of inputs when permitWeakResolution=false + // float * float + // float * float32 // will give error + // decimal * decimal + // decimal * decimal <-- Note this one triggers even though "decimal" has some possibly-relevant methods + // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead + // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead + // + // The rule is triggered by these sorts of inputs when permitWeakResolution=true + // float * 'a + // 'a * float + // decimal<'u> * 'a + (let checkRuleAppliesInPreferenceToMethods argTy1 argTy2 = + // Check that at least one of the argument types is numeric + IsNumericOrIntegralEnumType g argTy1 && + // Check the other type is nominal, unless using weak resolution + IsBinaryOpOtherArgType g permitWeakResolution argTy2 && + // This next condition checks that either + // - Neither type contributes any methods OR + // - We have the special case "decimal<_> * decimal". In this case we have some + // possibly-relevant methods from "decimal" but we ignore them in this case. + (isNil minfos || (Option.isSome (getMeasureOfType g argTy1) && isDecimalTy g argTy2)) in + + checkRuleAppliesInPreferenceToMethods argTy1 argTy2 || + checkRuleAppliesInPreferenceToMethods argTy2 argTy1) -> + + match getMeasureOfType g argTy1 with + | Some (tcref, ms1) -> + let ms2 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 (mkWoNullAppTy tcref [TType_measure ms2]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return TTraitBuiltIn - // Trait calls are only supported on pseudo type (variables) - if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then - for e in supportTys do - do! SolveTypStaticReq csenv trace TyparStaticReq.HeadType e + | _ -> - // SRTP constraints on rigid type parameters do not need to be solved - let isRigid = - supportTys |> List.forall (fun ty -> - match tryDestTyparTy g ty with - | ValueSome tp -> - match tp.Rigidity with - | TyparRigidity.Rigid - | TyparRigidity.WillBeRigid -> true - | _ -> false - | ValueNone -> false) + match getMeasureOfType g argTy2 with + | Some (tcref, ms2) -> + let ms1 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure ms1]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return TTraitBuiltIn + + | _ -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, ("op_Addition" | "op_Subtraction" | "op_Modulus"), [argTy1;argTy2] + when // Ignore any explicit +/- overloads from any basic integral types + (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && + ( IsAddSubModType nm g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsAddSubModType nm g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn - let argTys = if memFlags.IsInstance then List.tail traitObjAndArgTys else traitObjAndArgTys + | _, _, false, ("op_LessThan" | "op_LessThanOrEqual" | "op_GreaterThan" | "op_GreaterThanOrEqual" | "op_Equality" | "op_Inequality" ), [argTy1;argTy2] + when // Ignore any explicit overloads from any basic integral types + (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && + ( IsRelationalType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsRelationalType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.bool_ty + return TTraitBuiltIn - let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo + // We pretend for uniformity that the numeric types have a static property called Zero and One + // As with constants, only zero is polymorphic in its units + | [], [ty], false, "get_Zero", [] + when isNumericType g ty || isCharTy g ty -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty + return TTraitBuiltIn - let! res = - trackErrors { - match minfos, supportTys, memFlags.IsInstance, nm, argTys with - | _, _, false, ("op_Division" | "op_Multiply"), [argTy1;argTy2] - when - // This simulates the existence of - // float * float -> float - // float32 * float32 -> float32 - // float<'u> * float<'v> -> float<'u 'v> - // float32<'u> * float32<'v> -> float32<'u 'v> - // decimal<'u> * decimal<'v> -> decimal<'u 'v> - // decimal<'u> * decimal -> decimal<'u> - // float32<'u> * float32<'v> -> float32<'u 'v> - // int * int -> int - // int64 * int64 -> int64 - // - // The rule is triggered by these sorts of inputs when permitWeakResolution=false - // float * float - // float * float32 // will give error - // decimal * decimal - // decimal * decimal <-- Note this one triggers even though "decimal" has some possibly-relevant methods - // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead - // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead - // - // The rule is triggered by these sorts of inputs when permitWeakResolution=true - // float * 'a - // 'a * float - // decimal<'u> * 'a - (let checkRuleAppliesInPreferenceToMethods argTy1 argTy2 = - // Check that at least one of the argument types is numeric - IsNumericOrIntegralEnumType g argTy1 && - // Check the other type is nominal, unless using weak resolution - IsBinaryOpOtherArgType g permitWeakResolution argTy2 && - // This next condition checks that either - // - Neither type contributes any methods OR - // - We have the special case "decimal<_> * decimal". In this case we have some - // possibly-relevant methods from "decimal" but we ignore them in this case. - (isNil minfos || (Option.isSome (getMeasureOfType g argTy1) && isDecimalTy g argTy2)) in - - checkRuleAppliesInPreferenceToMethods argTy1 argTy2 || - checkRuleAppliesInPreferenceToMethods argTy2 argTy1) -> - - match getMeasureOfType g argTy1 with - | Some (tcref, ms1) -> - let ms2 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 (mkWoNullAppTy tcref [TType_measure ms2]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + | [], [ty], false, "get_One", [] + when isNumericType g ty || isCharTy g ty -> + do! SolveDimensionlessNumericType csenv ndeep m2 trace ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty return TTraitBuiltIn - | _ -> + | [], _, false, "DivideByInt", [argTy1;argTy2] + when isFpTy g argTy1 || isDecimalTy g argTy1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn - match getMeasureOfType g argTy2 with - | Some (tcref, ms2) -> - let ms1 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure ms1]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) - return TTraitBuiltIn + // We pretend for uniformity that the 'string' and 'array' types have an indexer property called 'Item' + | [], [ty], true, "get_Item", [argTy1] + when isStringTy g ty -> - | _ -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.char_ty + return TTraitBuiltIn - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn + | [], [ty], true, "get_Item", argTys + when isArrayTy g ty -> + + if rankOfArrayTy g ty <> argTys.Length then + do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argTys.Length), m, m2)) + + for argTy in argTys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty - | _, _, false, ("op_Addition" | "op_Subtraction" | "op_Modulus"), [argTy1;argTy2] - when // Ignore any explicit +/- overloads from any basic integral types - (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && - ( IsAddSubModType nm g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsAddSubModType nm g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, ("op_LessThan" | "op_LessThanOrEqual" | "op_GreaterThan" | "op_GreaterThanOrEqual" | "op_Equality" | "op_Inequality" ), [argTy1;argTy2] - when // Ignore any explicit overloads from any basic integral types - (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && - ( IsRelationalType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsRelationalType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.bool_ty - return TTraitBuiltIn - - // We pretend for uniformity that the numeric types have a static property called Zero and One - // As with constants, only zero is polymorphic in its units - | [], [ty], false, "get_Zero", [] - when isNumericType g ty || isCharTy g ty -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty - return TTraitBuiltIn - - | [], [ty], false, "get_One", [] - when isNumericType g ty || isCharTy g ty -> - do! SolveDimensionlessNumericType csenv ndeep m2 trace ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty - return TTraitBuiltIn - - | [], _, false, "DivideByInt", [argTy1;argTy2] - when isFpTy g argTy1 || isDecimalTy g argTy1 -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - // We pretend for uniformity that the 'string' and 'array' types have an indexer property called 'Item' - | [], [ty], true, "get_Item", [argTy1] - when isStringTy g ty -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.char_ty - return TTraitBuiltIn - - | [], [ty], true, "get_Item", argTys - when isArrayTy g ty -> - - if rankOfArrayTy g ty <> argTys.Length then - do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argTys.Length), m, m2)) - - for argTy in argTys do - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty - - let ety = destArrayTy g ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ety - return TTraitBuiltIn - - | [], [ty], true, "set_Item", argTys - when isArrayTy g ty -> + let ety = destArrayTy g ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ety + return TTraitBuiltIn + + | [], [ty], true, "set_Item", argTys + when isArrayTy g ty -> - if rankOfArrayTy g ty <> argTys.Length - 1 then - do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argTys.Length - 1)), m, m2)) - let argTys, lastTy = List.frontAndBack argTys + if rankOfArrayTy g ty <> argTys.Length - 1 then + do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argTys.Length - 1)), m, m2)) + let argTys, lastTy = List.frontAndBack argTys + + for argTy in argTys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty + + let elemTy = destArrayTy g ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace lastTy elemTy + return TTraitBuiltIn - for argTy in argTys do - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty + | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argTy1;argTy2] + when IsBitwiseOpType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsBitwiseOpType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1 -> - let elemTy = destArrayTy g ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace lastTy elemTy - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + return TTraitBuiltIn - | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argTy1;argTy2] - when IsBitwiseOpType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsBitwiseOpType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1 -> + | [], _, false, ("op_LeftShift" | "op_RightShift"), [argTy1;argTy2] + when IsIntegerOrIntegerEnumTy g argTy1 -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + return TTraitBuiltIn - | [], _, false, ("op_LeftShift" | "op_RightShift"), [argTy1;argTy2] - when IsIntegerOrIntegerEnumTy g argTy1 -> + | _, _, false, "op_UnaryPlus", [argTy] + when IsNumericOrIntegralEnumType g argTy -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn - | _, _, false, "op_UnaryPlus", [argTy] - when IsNumericOrIntegralEnumType g argTy -> + | _, _, false, "op_UnaryNegation", [argTy] + when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn - | _, _, false, "op_UnaryNegation", [argTy] - when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> + | _, _, true, "get_Sign", [] + when IsSignType g supportTys.Head -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.int32_ty + return TTraitBuiltIn - | _, _, true, "get_Sign", [] - when IsSignType g supportTys.Head -> + | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argTy] + when IsIntegerOrIntegerEnumTy g argTy -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.int32_ty - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy + return TTraitBuiltIn - | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argTy] - when IsIntegerOrIntegerEnumTy g argTy -> + | _, _, false, "Abs", [argTy] + when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy - return TTraitBuiltIn + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn - | _, _, false, "Abs", [argTy] - when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> + | _, _, false, "Sqrt", [argTy1] + when isFpTy g argTy1 -> + match getMeasureOfType g argTy1 with + | Some (tcref, _) -> + let ms1 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure ms1]) + return TTraitBuiltIn + | None -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, ("Sin" | "Cos" | "Tan" | "Sinh" | "Cosh" | "Tanh" | "Atan" | "Acos" | "Asin" | "Exp" | "Ceiling" | "Floor" | "Round" | "Truncate" | "Log10" | "Log" | "Sqrt"), [argTy] + when isFpTy g argTy -> + + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn + // Conversions from non-decimal numbers / strings / chars to non-decimal numbers / chars are built-in + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (IsNonDecimalNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && + // The output type + (IsNonDecimalNumericOrIntegralEnumType g retTy || isCharTy g retTy)) -> - | _, _, false, "Sqrt", [argTy1] - when isFpTy g argTy1 -> - match getMeasureOfType g argTy1 with - | Some (tcref, _) -> - let ms1 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure ms1]) - return TTraitBuiltIn - | None -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn + return TTraitBuiltIn + + // Conversions from (including decimal) numbers / strings / chars to decimals are built-in + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (IsNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && + // The output type + (isDecimalTy g retTy)) -> + return TTraitBuiltIn + + // Conversions from decimal numbers to native integers are built-in + // The rest of decimal conversions are handled via op_Explicit lookup on System.Decimal (which also looks for op_Implicit) + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (isDecimalTy g argTy) && + // The output type + (isNativeIntegerTy g retTy)) -> + return TTraitBuiltIn - | _, _, false, ("Sin" | "Cos" | "Tan" | "Sinh" | "Cosh" | "Tanh" | "Atan" | "Acos" | "Asin" | "Exp" | "Ceiling" | "Floor" | "Round" | "Truncate" | "Log10" | "Log" | "Sqrt"), [argTy] - when isFpTy g argTy -> - - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn - - // Conversions from non-decimal numbers / strings / chars to non-decimal numbers / chars are built-in - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (IsNonDecimalNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && - // The output type - (IsNonDecimalNumericOrIntegralEnumType g retTy || isCharTy g retTy)) -> - - return TTraitBuiltIn - - // Conversions from (including decimal) numbers / strings / chars to decimals are built-in - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (IsNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && - // The output type - (isDecimalTy g retTy)) -> - return TTraitBuiltIn - - // Conversions from decimal numbers to native integers are built-in - // The rest of decimal conversions are handled via op_Explicit lookup on System.Decimal (which also looks for op_Implicit) - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (isDecimalTy g argTy) && - // The output type - (isNativeIntegerTy g retTy)) -> - return TTraitBuiltIn - - | [], _, false, "Pow", [argTy1; argTy2] - when isFpTy g argTy1 -> + | [], _, false, "Pow", [argTy1; argTy2] + when isFpTy g argTy1 -> - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, "Atan2", [argTy1; argTy2] - when isFpTy g argTy1 -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - match getMeasureOfType g argTy1 with - | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure Measure.One]) - return TTraitBuiltIn + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn - | _ -> - // OK, this is not solved by a built-in constraint. - // Now look for real solutions - - // First look for a solution by a record property - let recdPropSearch = - let isGetProp = nm.StartsWithOrdinal("get_") - let isSetProp = nm.StartsWithOrdinal("set_") - if not isRigid && ((argTys.IsEmpty && isGetProp) || isSetProp) then - let propName = nm[4..] - let props = - supportTys |> List.choose (fun ty -> - match TryFindIntrinsicNamedItemOfType csenv.InfoReader (propName, AccessibleFromEverywhere, false) FindMemberFlag.IgnoreOverrides m ty with - | Some (RecdFieldItem rfinfo) - when (isGetProp || rfinfo.RecdField.IsMutable) && - (rfinfo.IsStatic = not memFlags.IsInstance) && - IsRecdFieldAccessible amap m AccessibleFromEverywhere rfinfo.RecdFieldRef && - not rfinfo.LiteralValue.IsSome && - not rfinfo.RecdField.IsCompilerGenerated -> - Some (rfinfo, isSetProp) - | _ -> None) - match props with - | [ prop ] -> Some prop - | _ -> None - else - None - - let anonRecdPropSearch = - let isGetProp = nm.StartsWithOrdinal("get_") - if not isRigid && isGetProp && memFlags.IsInstance then - let propName = nm[4..] - let props = - supportTys |> List.choose (fun ty -> - match TryFindAnonRecdFieldOfType g ty propName with - | Some (Item.AnonRecdField(anonInfo, tinst, i, _)) -> Some (anonInfo, tinst, i) - | _ -> None) - match props with - | [ prop ] -> Some prop - | _ -> None - else - None - - // Now check if there are no feasible solutions at all - match minfos, recdPropSearch, anonRecdPropSearch with - | [], None, None when MemberConstraintIsReadyForStrongResolution csenv traitInfo -> - if supportTys |> List.exists (isFunTy g) then - return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) - elif supportTys |> List.exists (isAnyTupleTy g) then - return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) - else - match nm, argTys with - | "op_Explicit", [argTy] -> - let argTyString = NicePrint.prettyStringOfTy denv argTy - let rtyString = NicePrint.prettyStringOfTy denv retTy - return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion(argTyString, rtyString), m, m2)) - | _ -> - let tyString = - match supportTys with - | [ty] -> NicePrint.minimalStringOfType denv ty - | _ -> supportTys |> List.map (NicePrint.minimalStringOfType denv) |> String.concat ", " - let opName = ConvertValLogicalNameToDisplayNameCore nm - let err = - match opName with - | "?>=" | "?>" | "?<=" | "?<" | "?=" | "?<>" - | ">=?" | ">?" | "<=?" | "?" - | "?>=?" | "?>?" | "?<=?" | "??" -> - if List.isSingleton supportTys then FSComp.SR.csTypeDoesNotSupportOperatorNullable(tyString, opName) - else FSComp.SR.csTypesDoNotSupportOperatorNullable(tyString, opName) - | _ -> - match supportTys, source.Value with - | [_], Some s when s.StartsWith("Operators.") -> - let opSource = s[10..] - if opSource = nm then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) - else FSComp.SR.csTypeDoesNotSupportOperator(tyString, opSource) - | [_], Some s -> - FSComp.SR.csFunctionDoesNotSupportType(s, tyString, nm) - | [_], _ - -> FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) - | _, _ - -> FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) - return! ErrorD(ConstraintSolverError(err, m, m2)) + | _, _, false, "Atan2", [argTy1; argTy2] + when isFpTy g argTy1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + match getMeasureOfType g argTy1 with + | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure Measure.One]) + return TTraitBuiltIn | _ -> - let dummyExpr = mkUnit g m - let calledMethGroup = - minfos - // curried members may not be used to satisfy constraints - |> List.choose (fun (staticTy, minfo) -> - if minfo.IsCurried then - None - else - let callerArgs = - { - Unnamed = [ (argTys |> List.map (fun argTy -> CallerArg(argTy, m, false, dummyExpr))) ] - Named = [ [ ] ] - } - let minst = FreshenMethInfo m minfo - let objtys = minfo.GetObjArgTypes(amap, m, minst) - Some(CalledMeth(csenv.InfoReader, None, false, FreshenMethInfo, m, AccessibleFromEverywhere, minfo, minst, minst, None, objtys, callerArgs, false, false, None, Some staticTy))) - - let methOverloadResult, errors = - trace.CollectThenUndoOrCommit - (fun (a, _) -> Option.isSome a) - (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) CallerArgs.Empty AccessibleFromEverywhere calledMethGroup false (Some (MustEqual retTy))) - - match anonRecdPropSearch, recdPropSearch, methOverloadResult with - | Some (anonInfo, tinst, i), None, None -> - // OK, the constraint is solved by a record property. Assert that the return types match. - let rty2 = List.item i tinst - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 - return TTraitSolvedAnonRecdProp(anonInfo, tinst, i) - - | None, Some (rfinfo, isSetProp), None -> - // OK, the constraint is solved by a record property. Assert that the return types match. - let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 - return TTraitSolvedRecdProp(rfinfo, isSetProp) - - | None, None, Some (calledMeth: CalledMeth<_>) -> - // OK, the constraint is solved. - let minfo = calledMeth.Method - - do! errors - let isInstance = minfo.IsInstance - if isInstance <> memFlags.IsInstance then - return! - if isInstance then - ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsNotStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) - else - ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) - else - do! CheckMethInfoAttributes g m None minfo - return TTraitSolved (minfo, calledMeth.CalledTyArgs, calledMeth.OptionalStaticType) + // OK, this is not solved by a built-in constraint. + // Now look for real solutions + + // First look for a solution by a record property + let recdPropSearch = + let isGetProp = nm.StartsWithOrdinal("get_") + let isSetProp = nm.StartsWithOrdinal("set_") + if not isRigid && ((argTys.IsEmpty && isGetProp) || isSetProp) then + let propName = nm[4..] + let props = + supportTys |> List.choose (fun ty -> + match TryFindIntrinsicNamedItemOfType csenv.InfoReader (propName, AccessibleFromEverywhere, false) FindMemberFlag.IgnoreOverrides m ty with + | Some (RecdFieldItem rfinfo) + when (isGetProp || rfinfo.RecdField.IsMutable) && + (rfinfo.IsStatic = not memFlags.IsInstance) && + IsRecdFieldAccessible amap m AccessibleFromEverywhere rfinfo.RecdFieldRef && + not rfinfo.LiteralValue.IsSome && + not rfinfo.RecdField.IsCompilerGenerated -> + Some (rfinfo, isSetProp) + | _ -> None) + match props with + | [ prop ] -> Some prop + | _ -> None + else + None + + let anonRecdPropSearch = + let isGetProp = nm.StartsWithOrdinal("get_") + if not isRigid && isGetProp && memFlags.IsInstance then + let propName = nm[4..] + let props = + supportTys |> List.choose (fun ty -> + match TryFindAnonRecdFieldOfType g ty propName with + | Some (Item.AnonRecdField(anonInfo, tinst, i, _)) -> Some (anonInfo, tinst, i) + | _ -> None) + match props with + | [ prop ] -> Some prop + | _ -> None + else + None + + // Now check if there are no feasible solutions at all + match minfos, recdPropSearch, anonRecdPropSearch with + | [], None, None when MemberConstraintIsReadyForStrongResolution csenv traitInfo -> + if supportTys |> List.exists (isFunTy g) then + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) + elif supportTys |> List.exists (isAnyTupleTy g) then + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) + else + match nm, argTys with + | "op_Explicit", [argTy] -> + let argTyString = NicePrint.prettyStringOfTy denv argTy + let rtyString = NicePrint.prettyStringOfTy denv retTy + return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion(argTyString, rtyString), m, m2)) + | _ -> + let tyString = + match supportTys with + | [ty] -> NicePrint.minimalStringOfType denv ty + | _ -> supportTys |> List.map (NicePrint.minimalStringOfType denv) |> String.concat ", " + let opName = ConvertValLogicalNameToDisplayNameCore nm + let err = + match opName with + | "?>=" | "?>" | "?<=" | "?<" | "?=" | "?<>" + | ">=?" | ">?" | "<=?" | "?" + | "?>=?" | "?>?" | "?<=?" | "??" -> + if List.isSingleton supportTys then FSComp.SR.csTypeDoesNotSupportOperatorNullable(tyString, opName) + else FSComp.SR.csTypesDoNotSupportOperatorNullable(tyString, opName) + | _ -> + match supportTys, source.Value with + | [_], Some s when s.StartsWith("Operators.") -> + let opSource = s[10..] + if opSource = nm then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) + else FSComp.SR.csTypeDoesNotSupportOperator(tyString, opSource) + | [_], Some s -> + FSComp.SR.csFunctionDoesNotSupportType(s, tyString, nm) + | [_], _ + -> FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) + | _, _ + -> FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) + return! ErrorD(ConstraintSolverError(err, m, m2)) | _ -> - do! AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors - return TTraitUnsolved - } - return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res + let dummyExpr = mkUnit g m + let calledMethGroup = + minfos + // curried members may not be used to satisfy constraints + |> List.choose (fun (staticTy, minfo) -> + if minfo.IsCurried then + None + else + let callerArgs = + { + Unnamed = [ (argTys |> List.map (fun argTy -> CallerArg(argTy, m, false, dummyExpr))) ] + Named = [ [ ] ] + } + let minst = FreshenMethInfo m minfo + let objtys = minfo.GetObjArgTypes(amap, m, minst) + Some(CalledMeth(csenv.InfoReader, None, false, FreshenMethInfo, m, AccessibleFromEverywhere, minfo, minst, minst, None, objtys, callerArgs, false, false, None, Some staticTy))) + + let methOverloadResult, errors = + trace.CollectThenUndoOrCommit + (fun (a, _) -> Option.isSome a) + (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) CallerArgs.Empty AccessibleFromEverywhere calledMethGroup false (Some (MustEqual retTy))) + + match anonRecdPropSearch, recdPropSearch, methOverloadResult with + | Some (anonInfo, tinst, i), None, None -> + // OK, the constraint is solved by a record property. Assert that the return types match. + let rty2 = List.item i tinst + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 + return TTraitSolvedAnonRecdProp(anonInfo, tinst, i) + + | None, Some (rfinfo, isSetProp), None -> + // OK, the constraint is solved by a record property. Assert that the return types match. + let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 + return TTraitSolvedRecdProp(rfinfo, isSetProp) + + | None, None, Some (calledMeth: CalledMeth<_>) -> + // OK, the constraint is solved. + let minfo = calledMeth.Method + + do! errors + let isInstance = minfo.IsInstance + if isInstance <> memFlags.IsInstance then + return! + if isInstance then + ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsNotStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) + else + ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) + else + do! CheckMethInfoAttributes g m None minfo + return TTraitSolved (minfo, calledMeth.CalledTyArgs, calledMeth.OptionalStaticType) + + | _ -> + do! AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors + return TTraitUnsolved + } + return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res } and AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors = diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index f0656173c79..3a01eaa2efe 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -3283,7 +3283,7 @@ let AnalyzeArbitraryExprAsEnumerable (cenv: cenv) (env: TcEnv) localAlloc m expr let enumElemTy = - if isObjTy g enumElemTy then + if isObjTyAnyNullness g enumElemTy then // Look for an 'Item' property, or a set of these with consistent return types let allEquivReturnTypes (minfo: MethInfo) (others: MethInfo list) = let returnTy = minfo.GetFSharpReturnType(cenv.amap, m, []) @@ -6195,7 +6195,7 @@ and TcExprObjectExpr (cenv: cenv) overallTy env tpenv (synObjTy, argopt, binds, errorR(Error(FSComp.SR.tcCannotInheritFromErasedType(), m)) (m, intfTy, overrides), tpenv) - let realObjTy = if isObjTy g objTy && not (isNil extraImpls) then (p23 (List.head extraImpls)) else objTy + let realObjTy = if isObjTyAnyNullness g objTy && not (isNil extraImpls) then (p23 (List.head extraImpls)) else objTy TcPropagatingExprLeafThenConvert cenv overallTy realObjTy env (* canAdhoc *) m (fun () -> TcObjectExpr cenv env tpenv (objTy, realObjTy, argopt, binds, extraImpls, mObjTy, mNewExpr, m) @@ -7320,7 +7320,7 @@ and TcFormatStringExpr cenv (overallTy: OverallTy) env m tpenv (fmtString: strin let formatTy = mkPrintfFormatTy g aty bty cty dty ety // This might qualify as a format string - check via a type directed rule - let ok = not (isObjTy g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy + let ok = not (isObjTyAnyNullness g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy if ok then // Parse the format string to work out the phantom types @@ -7399,7 +7399,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn Choice1Of2 (true, newFormatMethod) // ... or if that fails then may be a FormattableString by a type-directed rule.... - elif (not (isObjTy g overallTy.Commit) && + elif (not (isObjTyAnyNullness g overallTy.Commit) && ((g.system_FormattableString_tcref.CanDeref && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit g.system_FormattableString_ty) || (g.system_IFormattable_tcref.CanDeref && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit g.system_IFormattable_ty))) then @@ -7420,7 +7420,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn | None -> languageFeatureNotSupportedInLibraryError LanguageFeature.StringInterpolation m // ... or if that fails then may be a PrintfFormat by a type-directed rule.... - elif not (isObjTy g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy then + elif not (isObjTyAnyNullness g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy then // And if that succeeds, the printerTy and printerResultTy must be the same (there are no curried arguments) UnifyTypes cenv env m printerTy printerResultTy diff --git a/src/Compiler/Checking/InfoReader.fs b/src/Compiler/Checking/InfoReader.fs index f4a9f033c64..24a2d5bbf6e 100644 --- a/src/Compiler/Checking/InfoReader.fs +++ b/src/Compiler/Checking/InfoReader.fs @@ -1082,7 +1082,7 @@ let TryDestStandardDelegateType (infoReader: InfoReader) m ad delTy = let g = infoReader.g let (SigOfFunctionForDelegate(_, delArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad match delArgTys with - | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy) + | senderTy :: argTys when (isObjTyAnyNullness g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy) | _ -> None diff --git a/src/Compiler/Checking/MethodCalls.fs b/src/Compiler/Checking/MethodCalls.fs index 72363943549..ac4d92141d8 100644 --- a/src/Compiler/Checking/MethodCalls.fs +++ b/src/Compiler/Checking/MethodCalls.fs @@ -1319,7 +1319,7 @@ let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, d | Some einfo -> match delArgVals with | [] -> error(nonStandardEventError einfo.EventName m) - | h :: _ when not (isObjTy g h.Type) -> error(nonStandardEventError einfo.EventName m) + | h :: _ when not (isObjTyAnyNullness g h.Type) -> error(nonStandardEventError einfo.EventName m) | h :: t -> [exprForVal m h; mkRefTupledVars g m t] | None -> if isNil delArgTys then [mkUnit g m] else List.map (exprForVal m) delArgVals diff --git a/src/Compiler/Checking/NameResolution.fs b/src/Compiler/Checking/NameResolution.fs index 2eb5b14fa02..010e9e0cd8d 100644 --- a/src/Compiler/Checking/NameResolution.fs +++ b/src/Compiler/Checking/NameResolution.fs @@ -4422,14 +4422,14 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation let isUnseenDueToBasicObjRules = - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false - | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) + | "GetHashCode" -> isObjTyAnyNullness g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) | "ToString" -> false | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + if not (isObjTyAnyNullness g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it false elif minfo.IsInstance then @@ -4440,7 +4440,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso true | _ -> // filter out self methods of obj type - isObjTy g minfo.ApparentEnclosingType + isObjTyAnyNullness g minfo.ApparentEnclosingType let result = not isUnseenDueToBasicObjRules && @@ -5121,14 +5121,14 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation let isUnseenDueToBasicObjRules = - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false - | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) + | "GetHashCode" -> isObjTyAnyNullness g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) | "ToString" -> false | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + if not (isObjTyAnyNullness g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it false elif minfo.IsInstance then @@ -5139,7 +5139,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( true | _ -> // filter out self methods of obj type - isObjTy g minfo.ApparentEnclosingType + isObjTyAnyNullness g minfo.ApparentEnclosingType let result = not isUnseenDueToBasicObjRules && not minfo.IsInstance = statics && diff --git a/src/Compiler/Checking/NicePrint.fs b/src/Compiler/Checking/NicePrint.fs index 812837a3edd..09e8708b894 100644 --- a/src/Compiler/Checking/NicePrint.fs +++ b/src/Compiler/Checking/NicePrint.fs @@ -2191,7 +2191,7 @@ module TastDefinitionPrinting = let inherits = [ if not (suppressInheritanceAndInterfacesForTyInSimplifiedDisplays g amap m ty) then match GetSuperTypeOfType g amap m ty with - | Some superTy when not (isObjTy g superTy) && not (isValueTypeTy g superTy) -> + | Some superTy when not (isObjTyAnyNullness g superTy) && not (isValueTypeTy g superTy) -> superTy | _ -> () ] diff --git a/src/Compiler/Checking/TypeHierarchy.fs b/src/Compiler/Checking/TypeHierarchy.fs index ddccdddd637..9bf7c2ec892 100644 --- a/src/Compiler/Checking/TypeHierarchy.fs +++ b/src/Compiler/Checking/TypeHierarchy.fs @@ -67,7 +67,7 @@ let GetSuperTypeOfType g amap m ty = Some (instType (mkInstForAppTy g ty) (superOfTycon g tcref.Deref)) elif isArrayTy g ty then Some g.system_Array_ty - elif isRefTy g ty && not (isObjTy g ty) then + elif isRefTy g ty && not (isObjTyAnyNullness g ty) then Some g.obj_ty_noNulls elif isStructTupleTy g ty then Some g.system_Value_ty diff --git a/src/Compiler/Checking/TypeRelations.fs b/src/Compiler/Checking/TypeRelations.fs index b52a1da1574..498fd3e3bb8 100644 --- a/src/Compiler/Checking/TypeRelations.fs +++ b/src/Compiler/Checking/TypeRelations.fs @@ -117,7 +117,7 @@ let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = | _ -> // F# reference types are subtypes of type 'obj' - (isObjTy g ty1 && (canCoerce = CanCoerce || isRefTy g ty2)) + (isObjTyAnyNullness g ty1 && (canCoerce = CanCoerce || isRefTy g ty2)) || (isAppTy g ty2 && (canCoerce = CanCoerce || isRefTy g ty2) && diff --git a/src/Compiler/Checking/infos.fs b/src/Compiler/Checking/infos.fs index 23afa7bece5..18add6588d0 100644 --- a/src/Compiler/Checking/infos.fs +++ b/src/Compiler/Checking/infos.fs @@ -207,7 +207,7 @@ type OptionalArgInfo = if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) - elif isObjTy g ty then + elif isObjTyAnyNullness g ty then match ilParam.Marshal with | Some(ILNativeType.IUnknown | ILNativeType.IDispatch | ILNativeType.Interface) -> Constant ILFieldInit.Null | _ -> @@ -296,7 +296,7 @@ let CrackParamAttribsInfo g (ty: TType, argInfo: ArgReprInfo) = | None -> // Do a type-directed analysis of the type to determine the default value to pass. // Similar rules as OptionalArgInfo.FromILParameter are applied here, except for the COM and byref-related stuff. - CallerSide (if isObjTy g ty then MissingValue else DefaultValue) + CallerSide (if isObjTyAnyNullness g ty then MissingValue else DefaultValue) | Some attr -> let defaultValue = OptionalArgInfo.ValueOfDefaultParameterValueAttrib attr match defaultValue with @@ -364,7 +364,9 @@ type ILFieldInit with | :? uint32 as i -> ILFieldInit.UInt32 i | :? int64 as i -> ILFieldInit.Int64 i | :? uint64 as i -> ILFieldInit.UInt64 i - | _ -> error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(try !!v.ToString() with _ -> "?"), m)) + | _ -> + let txt = match v with | null -> "?" | v -> try !!v.ToString() with _ -> "?" + error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(txt), m)) /// Compute the OptionalArgInfo for a provided parameter. @@ -382,7 +384,7 @@ let OptionalArgInfoOfProvidedParameter (amap: ImportMap) m (provParam : Tainted< if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) - elif isObjTy g ty then MissingValue + elif isObjTyAnyNullness g ty then MissingValue else DefaultValue let paramTy = ImportProvidedType amap m (provParam.PApply((fun p -> p.ParameterType), m)) diff --git a/src/Compiler/CodeGen/IlxGen.fs b/src/Compiler/CodeGen/IlxGen.fs index 82572ea888a..2f3db5be2ad 100644 --- a/src/Compiler/CodeGen/IlxGen.fs +++ b/src/Compiler/CodeGen/IlxGen.fs @@ -3782,11 +3782,11 @@ and GenCoerce cenv cgbuf eenv (e, tgtTy, m, srcTy) sequel = else GenExpr cenv cgbuf eenv e Continue - if not (isObjTy g srcTy) then + if not (isObjTyAnyNullness g srcTy) then let ilFromTy = GenType cenv m eenv.tyenv srcTy CG.EmitInstr cgbuf (pop 1) (Push [ g.ilg.typ_Object ]) (I_box ilFromTy) - if not (isObjTy g tgtTy) then + if not (isObjTyAnyNullness g tgtTy) then let ilToTy = GenType cenv m eenv.tyenv tgtTy CG.EmitInstr cgbuf (pop 1) (Push [ ilToTy ]) (I_unbox_any ilToTy) @@ -12118,7 +12118,7 @@ let LookupGeneratedValue (cenv: cenv) (ctxt: ExecutionContext) eenv (v: Val) = None // Invoke the set_Foo method for a declaration with a value. Used to create variables with values programmatically in fsi.exe. -let SetGeneratedValue (ctxt: ExecutionContext) eenv isForced (v: Val) (value: obj) = +let SetGeneratedValue (ctxt: ExecutionContext) eenv isForced (v: Val) (value: objnull) = try match StorageForVal v.Range v eenv with | StaticPropertyWithField(fspec, _, hasLiteralAttr, _, _, _, _f, ilSetterMethRef, _) -> diff --git a/src/Compiler/DependencyManager/DependencyProvider.fs b/src/Compiler/DependencyManager/DependencyProvider.fs index 709899e9a05..a241880e620 100644 --- a/src/Compiler/DependencyManager/DependencyProvider.fs +++ b/src/Compiler/DependencyManager/DependencyProvider.fs @@ -160,19 +160,19 @@ type ReflectionDependencyManagerProvider let instance = if not (isNull (theType.GetConstructor([| typeof; typeof |]))) then - Activator.CreateInstance(theType, [| outputDir :> obj; useResultsCache :> obj |]) + Activator.CreateInstance(theType, [| outputDir :> objnull; useResultsCache :> objnull |]) else - Activator.CreateInstance(theType, [| outputDir :> obj |]) + Activator.CreateInstance(theType, [| outputDir :> objnull |]) - let nameProperty = nameProperty.GetValue >> string - let keyProperty = keyProperty.GetValue >> string + let nameProperty (x: objnull) = x |> nameProperty.GetValue |> string + let keyProperty (x: objnull) = x |> keyProperty.GetValue |> string - let helpMessagesProperty = - let toStringArray (o: obj) = o :?> string[] + let helpMessagesProperty (x: objnull) = + let toStringArray (o: objnull) = o :?> string[] match helpMessagesProperty with - | Some helpMessagesProperty -> helpMessagesProperty.GetValue >> toStringArray - | None -> fun _ -> [||] + | Some helpMessagesProperty -> x |> helpMessagesProperty.GetValue |> toStringArray + | None -> [||] static member InstanceMaker(theType: Type, outputDir: string option, useResultsCache: bool) = match @@ -453,14 +453,18 @@ type ReflectionDependencyManagerProvider None, [||] match method with + | None -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) | Some m -> - let result = m.Invoke(instance, arguments) + match m.Invoke(instance, arguments) with + | null -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) // Verify the number of arguments returned in the tuple returned by resolvedependencies, it can be: // 1 - object with properties // 3 - (bool * string list * string list) // Support legacy api return shape (bool, seq, seq) --- original paket packagemanager - if FSharpType.IsTuple(result.GetType()) then + | result when FSharpType.IsTuple(result.GetType()) |> not -> + ReflectionDependencyManagerProvider.MakeResultFromObject(result) + | result -> // Verify the number of arguments returned in the tuple returned by resolvedependencies, it can be: // 3 - (bool * string list * string list) let success, sourceFiles, packageRoots = @@ -474,10 +478,6 @@ type ReflectionDependencyManagerProvider | _ -> false, seqEmpty, seqEmpty ReflectionDependencyManagerProvider.MakeResultFromFields(success, [||], [||], Seq.empty, sourceFiles, packageRoots) - else - ReflectionDependencyManagerProvider.MakeResultFromObject(result) - - | None -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) /// Provides DependencyManagement functions. /// Class is IDisposable diff --git a/src/Compiler/Driver/GraphChecking/Graph.fs b/src/Compiler/Driver/GraphChecking/Graph.fs index 210ca927c7f..6bfb1199181 100644 --- a/src/Compiler/Driver/GraphChecking/Graph.fs +++ b/src/Compiler/Driver/GraphChecking/Graph.fs @@ -83,7 +83,7 @@ module internal Graph = graph |> Seq.iter (fun (KeyValue(file, deps)) -> printfn $"{file} -> {deps |> Array.map nodePrinter |> join}") - let print (graph: Graph<'Node>) : unit = + let print (graph: Graph<'Node> when 'Node: not null) : unit = printCustom graph (fun node -> node.ToString() |> string) let serialiseToMermaid (graph: Graph) = diff --git a/src/Compiler/Driver/GraphChecking/Graph.fsi b/src/Compiler/Driver/GraphChecking/Graph.fsi index a93e429d2fe..2caf421dc54 100644 --- a/src/Compiler/Driver/GraphChecking/Graph.fsi +++ b/src/Compiler/Driver/GraphChecking/Graph.fsi @@ -20,7 +20,7 @@ module internal Graph = /// Create a reverse of the graph. val reverse<'Node when 'Node: equality> : originalGraph: Graph<'Node> -> Graph<'Node> /// Print the contents of the graph to the standard output. - val print: graph: Graph<'Node> -> unit + val print: graph: Graph<'Node> -> unit when 'Node: not null /// Create a simple Mermaid graph val serialiseToMermaid: graph: Graph -> string /// Create a simple Mermaid graph and save it under the path specified. diff --git a/src/Compiler/Facilities/prim-parsing.fs b/src/Compiler/Facilities/prim-parsing.fs index 3088a5579ed..bb61e76e5f3 100644 --- a/src/Compiler/Facilities/prim-parsing.fs +++ b/src/Compiler/Facilities/prim-parsing.fs @@ -14,7 +14,7 @@ exception Accept of obj [] type internal IParseState - (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: obj[], lexbuf: LexBuffer) = + (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: objnull[], lexbuf: LexBuffer) = member _.LexBuffer = lexbuf member _.InputRange index = @@ -125,7 +125,7 @@ type Stack<'a>(n) = member buf.PrintStack() = for i = 0 to (count - 1) do - Console.Write("{0}{1}", contents[i], (if i = count - 1 then ":" else "-")) + Console.Write("{0}{1}", contents[i] :> objnull, (if i = count - 1 then ":" else "-")) module Flags = #if DEBUG @@ -231,7 +231,7 @@ module internal Implementation = [] [] type ValueInfo = - val value: obj + val value: objnull val startPos: Position val endPos: Position @@ -269,7 +269,7 @@ module internal Implementation = // The 100 here means a maximum of 100 elements for each rule let ruleStartPoss = (Array.zeroCreate 100: Position[]) let ruleEndPoss = (Array.zeroCreate 100: Position[]) - let ruleValues = (Array.zeroCreate 100: obj[]) + let ruleValues = (Array.zeroCreate 100: objnull[]) let lhsPos = (Array.zeroCreate 2: Position[]) let reductions = tables.reductions let cacheSize = 7919 // the 1000'th prime diff --git a/src/Compiler/Interactive/fsi.fs b/src/Compiler/Interactive/fsi.fs index 10991bb59f7..74fcc37340c 100644 --- a/src/Compiler/Interactive/fsi.fs +++ b/src/Compiler/Interactive/fsi.fs @@ -4693,7 +4693,7 @@ type FsiEvaluationSession let lexResourceManager = LexResourceManager() /// The lock stops the type checker running at the same time as the server intellisense implementation. - let tcLockObject = box 7 // any new object will do + let tcLockObject = box 7 |> Unchecked.nonNull // any new object will do let resolveAssemblyRef (aref: ILAssemblyRef) = // Explanation: This callback is invoked during compilation to resolve assembly references diff --git a/src/Compiler/Symbols/Exprs.fs b/src/Compiler/Symbols/Exprs.fs index 15b1bb2a3f6..91480597cc2 100644 --- a/src/Compiler/Symbols/Exprs.fs +++ b/src/Compiler/Symbols/Exprs.fs @@ -121,7 +121,7 @@ type E = | ValueSet of FSharpMemberOrFunctionOrValue * FSharpExpr | Unused | DefaultValue of FSharpType - | Const of obj * FSharpType + | Const of objnull * FSharpType | AddressOf of FSharpExpr | Sequential of FSharpExpr * FSharpExpr | IntegerForLoop of FSharpExpr * FSharpExpr * FSharpExpr * bool * DebugPointAtFor * DebugPointAtInOrTo diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 22c27eeb9b0..8d62a724972 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -108,7 +108,7 @@ module LexbufLocalXmlDocStore = |> unbox let ClearXmlDoc (lexbuf: Lexbuf) = - lexbuf.BufferLocalStore[xmlDocKey] <- box (XmlDocCollector()) + lexbuf.BufferLocalStore[xmlDocKey] <- box (XmlDocCollector()) |> Unchecked.nonNull /// Called from the lexer to save a single line of XML doc comment. let SaveXmlDocLine (lexbuf: Lexbuf, lineText, range: range) = diff --git a/src/Compiler/TypedTree/TypeProviders.fs b/src/Compiler/TypedTree/TypeProviders.fs index 78baba4ee9d..5c81312e135 100644 --- a/src/Compiler/TypedTree/TypeProviders.fs +++ b/src/Compiler/TypedTree/TypeProviders.fs @@ -979,7 +979,7 @@ type ProvidedExprType = | ProvidedTryFinallyExpr of ProvidedExpr * ProvidedExpr | ProvidedLambdaExpr of ProvidedVar * ProvidedExpr | ProvidedCallExpr of ProvidedExpr option * ProvidedMethodInfo * ProvidedExpr[] - | ProvidedConstantExpr of obj * ProvidedType + | ProvidedConstantExpr of objnull * ProvidedType | ProvidedDefaultExpr of ProvidedType | ProvidedNewTupleExpr of ProvidedExpr[] | ProvidedTupleGetExpr of ProvidedExpr * int diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index e7c4576b24e..186c3655312 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -1853,7 +1853,20 @@ let isArray1DTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) - let isUnitTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.unit_tcr_canon tcref | _ -> false) -let isObjTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) +let isObjTyAnyNullness g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) + +let isObjNullTy g ty = + ty + |> stripTyEqns g + |> (function TType_app(tcref, _, n) when (not g.checkNullness) || (n.TryEvaluate() <> ValueSome(NullnessInfo.WithoutNull)) + -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) + +let isObjTyWithoutNull (g:TcGlobals) ty = + g.checkNullness && + ty + |> stripTyEqns g + |> (function TType_app(tcref, _, n) when (n.TryEvaluate() = ValueSome(NullnessInfo.WithoutNull)) + -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) let isValueTypeTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Value_tcref tcref | _ -> false) diff --git a/src/Compiler/TypedTree/TypedTreeOps.fsi b/src/Compiler/TypedTree/TypedTreeOps.fsi index 8c17d530762..85c2adaab91 100755 --- a/src/Compiler/TypedTree/TypedTreeOps.fsi +++ b/src/Compiler/TypedTree/TypedTreeOps.fsi @@ -1666,8 +1666,14 @@ val rankOfArrayTyconRef: TcGlobals -> TyconRef -> int /// Determine if a type is the F# unit type val isUnitTy: TcGlobals -> TType -> bool -/// Determine if a type is the System.Object type -val isObjTy: TcGlobals -> TType -> bool +/// Determine if a type is the System.Object type with any nullness qualifier +val isObjTyAnyNullness: TcGlobals -> TType -> bool + +/// Determine if a type is the (System.Object | null) type. Allows either nullness if null checking is disabled. +val isObjNullTy: TcGlobals -> TType -> bool + +/// Determine if a type is a strictly non-nullable System.Object type. If nullness checking is disabled, this returns false. +val isObjTyWithoutNull: TcGlobals -> TType -> bool /// Determine if a type is the System.ValueType type val isValueTypeTy: TcGlobals -> TType -> bool diff --git a/src/Compiler/Utilities/FileSystem.fs b/src/Compiler/Utilities/FileSystem.fs index cb8c1cdbea8..a541234199e 100644 --- a/src/Compiler/Utilities/FileSystem.fs +++ b/src/Compiler/Utilities/FileSystem.fs @@ -157,7 +157,7 @@ type ByteArrayMemory(bytes: byte[], offset, length) = type SafeUnmanagedMemoryStream = inherit UnmanagedMemoryStream - val mutable private holder: obj + val mutable private holder: objnull val mutable private isDisposed: bool new(addr, length, holder) = diff --git a/src/Compiler/Utilities/illib.fs b/src/Compiler/Utilities/illib.fs index 6c5a52a2fd8..e09c650e39b 100644 --- a/src/Compiler/Utilities/illib.fs +++ b/src/Compiler/Utilities/illib.fs @@ -1139,7 +1139,7 @@ module IPartialEqualityComparer = member _.GetHashCode(Wrap x) = per.GetHashCode x } // Wrap a Wrap _ around all keys in case the key type is itself a type using null as a representation - let dict = Dictionary, obj>(wper) + let dict = Dictionary, _>(wper) seq |> List.filter (fun v -> diff --git a/src/Compiler/Utilities/sformat.fs b/src/Compiler/Utilities/sformat.fs index 9279bf093d0..f6fc27b1e51 100644 --- a/src/Compiler/Utilities/sformat.fs +++ b/src/Compiler/Utilities/sformat.fs @@ -1012,7 +1012,7 @@ module Display = // Recursive descent let rec nestedObjL depthLim prec (x: obj, ty: Type) = objL ShowAll depthLim prec (x, ty) - and objL showMode depthLim prec (x: obj, ty: Type) = + and objL showMode depthLim prec (x: objnull, ty: Type) = let info = Value.GetValueInfo bindingFlags (x, ty) try if depthLim <= 0 || exceededPrintSize () then @@ -1337,9 +1337,6 @@ module Display = if word = "map" - && (match v with - | null -> false - | _ -> true) && tyv.IsGenericType && tyv.GetGenericTypeDefinition() = typedefof> then diff --git a/src/Compiler/Utilities/sr.fs b/src/Compiler/Utilities/sr.fs index 9473cc8d78e..10a615846e3 100644 --- a/src/Compiler/Utilities/sr.fs +++ b/src/Compiler/Utilities/sr.fs @@ -27,7 +27,7 @@ module internal DiagnosticMessage = open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators - let mkFunctionValue (tys: System.Type[]) (impl: obj -> obj) = + let mkFunctionValue (tys: System.Type[]) (impl: objnull -> objnull) = FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys[0], tys[1]), impl) let funTyC = typeof obj>.GetGenericTypeDefinition() diff --git a/src/FSharp.Build/FSharpEmbedResourceText.fs b/src/FSharp.Build/FSharpEmbedResourceText.fs index ac0adf8329d..061715184de 100644 --- a/src/FSharp.Build/FSharpEmbedResourceText.fs +++ b/src/FSharp.Build/FSharpEmbedResourceText.fs @@ -295,7 +295,7 @@ open Printf #endif - static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = + static let mkFunctionValue (tys: System.Type[]) (impl:objnull->objnull) = FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs new file mode 100644 index 00000000000..06c0b1f3031 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs @@ -0,0 +1,19 @@ +module MyLibrary +let strictlyNotNull (x:obj) = () + +let myGenericFunction1 (p:_|null) = + match p with + | null -> () + | p -> strictlyNotNull p + +let myGenericFunction2 p = + match p with + | Null -> () + | NonNull p -> strictlyNotNull p + +let myGenericFunction3 p = + match p with + | null -> () + // By the time we typecheck `| null`, we assign T to be a nullable type. Imagine there could be plenty of code before this pattern match got to be typechecked. + // As of now, the inference decision in the middle of a function cannot suddenly switch from (T which supports null) (T | null, where T is not nullable) + | pnn -> strictlyNotNull (pnn |> Unchecked.nonNull) \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.net472.bsl b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.net472.bsl new file mode 100644 index 00000000000..0e958b024af --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.net472.bsl @@ -0,0 +1,222 @@ + + + + + +.assembly extern runtime { } +.assembly extern FSharp.Core { } +.assembly assembly +{ + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.module assembly.dll + +.imagebase {value} +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 +.corflags 0x00000001 + + + + + +.class public abstract auto ansi sealed MyLibrary + extends [runtime]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .method public static void strictlyNotNull(object x) cil managed + { + + .maxstack 8 + IL_0000: ret + } + + .method public static void myGenericFunction1(!!a p) cil managed + { + .param type a + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + !!a V_1) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: box !!a + IL_0008: brfalse.s IL_000c + + IL_000a: br.s IL_000d + + IL_000c: ret + + IL_000d: ldloc.0 + IL_000e: stloc.1 + IL_000f: ldloc.1 + IL_0010: box !!a + IL_0015: call void MyLibrary::strictlyNotNull(object) + IL_001a: ret + } + + .method public static void myGenericFunction2(!!a p) cil managed + { + .param type a + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 V_1, + !!a V_2, + !!a V_3) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: stloc.2 + IL_0004: ldloc.2 + IL_0005: box !!a + IL_000a: brfalse.s IL_000e + + IL_000c: br.s IL_0016 + + IL_000e: ldnull + IL_000f: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2::NewChoice1Of2(!0) + IL_0014: br.s IL_001c + + IL_0016: ldloc.2 + IL_0017: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2::NewChoice2Of2(!1) + IL_001c: stloc.1 + IL_001d: ldloc.1 + IL_001e: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2 + IL_0023: brfalse.s IL_0027 + + IL_0025: br.s IL_0028 + + IL_0027: ret + + IL_0028: ldloc.1 + IL_0029: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2 + IL_002e: call instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2::get_Item() + IL_0033: stloc.3 + IL_0034: ldloc.3 + IL_0035: box !!a + IL_003a: call void MyLibrary::strictlyNotNull(object) + IL_003f: ret + } + + .method public static void myGenericFunction3(!!a p) cil managed + { + .param type a + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + !!a V_1, + !!a V_2, + !!a V_3) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: box !!a + IL_0008: brfalse.s IL_000c + + IL_000a: br.s IL_000d + + IL_000c: ret + + IL_000d: ldloc.0 + IL_000e: stloc.1 + IL_000f: ldloc.1 + IL_0010: stloc.2 + IL_0011: ldloc.2 + IL_0012: stloc.3 + IL_0013: ldloc.3 + IL_0014: box !!a + IL_0019: call void MyLibrary::strictlyNotNull(object) + IL_001e: ret + } + +} + +.class private abstract auto ansi sealed ''.$MyLibrary + extends [runtime]System.Object +{ +} + +.class private auto ansi beforefieldinit System.Runtime.CompilerServices.NullableAttribute + extends [runtime]System.Attribute +{ + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field public uint8[] NullableFlags + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .method public specialname rtspecialname instance void .ctor(uint8 scalarByteValue) cil managed + { + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [runtime]System.Attribute::.ctor() + IL_0006: ldarg.0 + IL_0007: ldc.i4.1 + IL_0008: newarr [runtime]System.Byte + IL_000d: dup + IL_000e: ldc.i4.0 + IL_000f: ldarg.1 + IL_0010: stelem.i1 + IL_0011: stfld uint8[] System.Runtime.CompilerServices.NullableAttribute::NullableFlags + IL_0016: ret + } + + .method public specialname rtspecialname instance void .ctor(uint8[] NullableFlags) cil managed + { + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [runtime]System.Attribute::.ctor() + IL_0006: ldarg.0 + IL_0007: ldarg.1 + IL_0008: stfld uint8[] System.Runtime.CompilerServices.NullableAttribute::NullableFlags + IL_000d: ret + } + +} + +.class private auto ansi beforefieldinit System.Runtime.CompilerServices.NullableContextAttribute + extends [runtime]System.Attribute +{ + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field public uint8 Flag + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .method public specialname rtspecialname instance void .ctor(uint8 Flag) cil managed + { + .custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [runtime]System.Attribute::.ctor() + IL_0006: ldarg.0 + IL_0007: ldarg.1 + IL_0008: stfld uint8 System.Runtime.CompilerServices.NullableContextAttribute::Flag + IL_000d: ret + } + +} + + + + + + diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.netcore.bsl b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.netcore.bsl new file mode 100644 index 00000000000..ca54c9be1ee --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/GenericCode.fs.il.netcore.bsl @@ -0,0 +1,157 @@ + + + + + +.assembly extern runtime { } +.assembly extern FSharp.Core { } +.assembly assembly +{ + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.module assembly.dll + +.imagebase {value} +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 +.corflags 0x00000001 + + + + + +.class public abstract auto ansi sealed MyLibrary + extends [runtime]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .custom instance void [runtime]System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .method public static void strictlyNotNull(object x) cil managed + { + + .maxstack 8 + IL_0000: ret + } + + .method public static void myGenericFunction1(!!a p) cil managed + { + .param type a + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + !!a V_1) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: box !!a + IL_0008: brfalse.s IL_000c + + IL_000a: br.s IL_000d + + IL_000c: ret + + IL_000d: ldloc.0 + IL_000e: stloc.1 + IL_000f: ldloc.1 + IL_0010: box !!a + IL_0015: call void MyLibrary::strictlyNotNull(object) + IL_001a: ret + } + + .method public static void myGenericFunction2(!!a p) cil managed + { + .param type a + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 V_1, + !!a V_2, + !!a V_3) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: stloc.2 + IL_0004: ldloc.2 + IL_0005: box !!a + IL_000a: brfalse.s IL_000e + + IL_000c: br.s IL_0016 + + IL_000e: ldnull + IL_000f: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2::NewChoice1Of2(!0) + IL_0014: br.s IL_001c + + IL_0016: ldloc.2 + IL_0017: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2::NewChoice2Of2(!1) + IL_001c: stloc.1 + IL_001d: ldloc.1 + IL_001e: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2 + IL_0023: brfalse.s IL_0027 + + IL_0025: br.s IL_0028 + + IL_0027: ret + + IL_0028: ldloc.1 + IL_0029: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2 + IL_002e: call instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2/Choice2Of2::get_Item() + IL_0033: stloc.3 + IL_0034: ldloc.3 + IL_0035: box !!a + IL_003a: call void MyLibrary::strictlyNotNull(object) + IL_003f: ret + } + + .method public static void myGenericFunction3(!!a p) cil managed + { + .param type a + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) + .param [1] + .custom instance void [runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = ( 01 00 02 00 00 ) + + .maxstack 3 + .locals init (!!a V_0, + !!a V_1, + !!a V_2, + !!a V_3) + IL_0000: ldarg.0 + IL_0001: stloc.0 + IL_0002: ldloc.0 + IL_0003: box !!a + IL_0008: brfalse.s IL_000c + + IL_000a: br.s IL_000d + + IL_000c: ret + + IL_000d: ldloc.0 + IL_000e: stloc.1 + IL_000f: ldloc.1 + IL_0010: stloc.2 + IL_0011: ldloc.2 + IL_0012: stloc.3 + IL_0013: ldloc.3 + IL_0014: box !!a + IL_0019: call void MyLibrary::strictlyNotNull(object) + IL_001e: ret + } + +} + +.class private abstract auto ansi sealed ''.$MyLibrary + extends [runtime]System.Object +{ +} + + + + + + diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/NullnessMetadata.fs b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/NullnessMetadata.fs index 3476cf07b2e..f0ebdfa0c34 100644 --- a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/NullnessMetadata.fs +++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Nullness/NullnessMetadata.fs @@ -89,6 +89,12 @@ let ``SupportsNull`` compilation = |> withNoWarn 52 |> verifyCompilation DoNotOptimize +[] +let ``GenericCode`` compilation = + compilation + |> withNoWarn 52 + |> verifyCompilation DoNotOptimize + module Interop = open System.IO diff --git a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/NullableReferenceTypesTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/NullableReferenceTypesTests.fs index de6d1c888ca..1edfbfd7961 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/NullableReferenceTypesTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/NullableReferenceTypesTests.fs @@ -17,6 +17,49 @@ let typeCheckWithStrictNullness cu = |> withNullnessOptions |> typecheck + + +[] +let ``Can convert generic value to objnull arg`` () = + FSharp """module TestLib + +let writeObj(tw:System.IO.TextWriter, a:'a) = + tw.Write(a) + +writeObj(System.IO.TextWriter.Null,null) + """ + |> asLibrary + |> typeCheckWithStrictNullness + |> shouldSucceed + +[] +let ``Can pass nulll to objnull arg`` () = + FSharp """module TestLib +let doStuff args = + let ty = typeof + let m = ty.GetMethod("ToString") |> Unchecked.nonNull + m.Invoke(null,args) + """ + |> asLibrary + |> typeCheckWithStrictNullness + |> shouldSucceed + +[] +let ``Can cast from objTy to interfaceTy`` () = + FSharp """module TestLib +open System +let safeHolder : IDisposable = + { new obj() with + override x.Finalize() = (x :?> IDisposable).Dispose() + interface IDisposable with + member x.Dispose() = + GC.SuppressFinalize x + } + """ + |> asLibrary + |> typeCheckWithStrictNullness + |> shouldSucceed + [] let ``Does not duplicate warnings`` () = FSharp """ @@ -28,6 +71,66 @@ let getLength (x: string | null) = x.Length |> shouldFail |> withDiagnostics [Error 3261, Line 3, Col 36, Line 3, Col 44, "Nullness warning: The types 'string' and 'string | null' do not have compatible nullability."] +[] +let ``Does report warning on obj to static member`` () = + FSharp """ +type Test() = + member _.XX(o:obj) = () + static member X(o: obj) = () + static member XString(x:string) = () +let x: obj | null = null +Test.X x // warning expected +let y2 = Test.X(x) // warning also expected +Test.X(null:(obj|null)) // warning also expected +let t = Test() +t.XX(x) +Test.XString(null) +Test.XString("x":(string|null)) + """ + |> asLibrary + |> typeCheckWithStrictNullness + |> shouldFail + |> withDiagnostics + [ Error 3261, Line 7, Col 8, Line 7, Col 9, "Nullness warning: The type 'obj | null' supports 'null' but a non-null type is expected." + Error 3261, Line 7, Col 1, Line 7, Col 9, "Nullness warning: The types 'obj' and 'obj | null' do not have compatible nullability." + Error 3261, Line 8, Col 17, Line 8, Col 18, "Nullness warning: The type 'obj | null' supports 'null' but a non-null type is expected." + Error 3261, Line 8, Col 10, Line 8, Col 19, "Nullness warning: The types 'obj' and 'obj | null' do not have compatible nullability." + Error 3261, Line 9, Col 8, Line 9, Col 23, "Nullness warning: The type 'obj | null' supports 'null' but a non-null type is expected." + Error 3261, Line 9, Col 1, Line 9, Col 24, "Nullness warning: The types 'obj' and 'obj | null' do not have compatible nullability." + Error 3261, Line 11, Col 6, Line 11, Col 7, "Nullness warning: The type 'obj | null' supports 'null' but a non-null type is expected." + Error 3261, Line 11, Col 1, Line 11, Col 8, "Nullness warning: The types 'obj' and 'obj | null' do not have compatible nullability." + Error 3261, Line 12, Col 14, Line 12, Col 18, "Nullness warning: The type 'string' does not support 'null'." + Error 3261, Line 13, Col 14, Line 13, Col 31, "Nullness warning: The types 'string' and 'string | null' do not have equivalent nullability."] + +[] +let ``Typar infered to nonnull obj`` () = + + FSharp """module Tests +let asObj(x:obj) = x +let asObjNull(x:objnull) = x + +let genericWithoutNull x = asObj x +let genericWithNull x = asObjNull x + +let result0 = genericWithoutNull null +let result1 = genericWithoutNull ("":(obj|null)) +let result2 = genericWithoutNull 15 +let result3 = genericWithoutNull "xxx" +let result4 = genericWithoutNull ("xxx":(string|null)) +let result5 = genericWithNull null +let result6 = genericWithNull 15 +let result7 = genericWithNull "xxx" +let result8 = genericWithNull ("":(obj|null)) + + """ + |> asLibrary + |> typeCheckWithStrictNullness + |> shouldFail + |> withDiagnostics + [ Error 43, Line 8, Col 34, Line 8, Col 38, "The constraints 'null' and 'not null' are inconsistent" + Error 3261, Line 9, Col 35, Line 9, Col 48, "Nullness warning: The type 'obj | null' supports 'null' but a non-null type is expected." + Error 3261, Line 12, Col 35, Line 12, Col 54, "Nullness warning: The type 'string | null' supports 'null' but a non-null type is expected."] + [] let ``Cannot pass possibly null value to a strict function``() = @@ -608,10 +711,16 @@ strictFunc("hi") |> ignore """ [] let ``Supports null in generic code`` () = FSharp """module MyLibrary -let myGenericFunction p = +let myGenericFunctionForInnerNotNull (p:_|null) = match p with | null -> () - | p -> printfn "%s" (p.ToString()) + | nnp -> printfn "%s" (nnp.ToString()) + +let myGenericFunctionSupportingNull (p) = + match p with + | null -> 0 + | nnp -> hash nnp + [] type X(p:int) = @@ -619,20 +728,15 @@ type X(p:int) = let myValOfX : X = null -myGenericFunction "HiThere" -myGenericFunction ("HiThere":string | null) -myGenericFunction (System.DateTime.Now) -myGenericFunction 123 -myGenericFunction myValOfX +myGenericFunctionForInnerNotNull "HiThere" +myGenericFunctionForInnerNotNull ("HiThere":string | null) +myGenericFunctionSupportingNull myValOfX |> ignore +myGenericFunctionSupportingNull ("HiThere":string | null) |> ignore """ |> asLibrary |> typeCheckWithStrictNullness - |> shouldFail - |> withDiagnostics - [Error 3261, Line 13, Col 19, Line 13, Col 28, "Nullness warning: The type 'string' does not support 'null'." - Error 193, Line 15, Col 20, Line 15, Col 39, "The type 'System.DateTime' does not have 'null' as a proper value" - Error 1, Line 16, Col 19, Line 16, Col 22, "The type 'int' does not have 'null' as a proper value"] + |> shouldSucceed [] let ``Null assignment in generic code`` () = diff --git a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs index 2757ab30aea..69b554bd48f 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs @@ -120,9 +120,9 @@ System.Console.WriteLine("a") System.Console.WriteLine("a", (null: obj[])) // Expected to give a Nullness warning KonsoleWithNulls.WriteLine("Hello world") -KonsoleWithNulls.WriteLine(null) // WRONG: gives an incorrect Nullness warning for String | null and String | null +KonsoleWithNulls.WriteLine(null) KonsoleWithNulls.WriteLine("Hello","world") -KonsoleWithNulls.WriteLine("Hello","world","there") // // WRONG: gives an incorrect Nullness warning for String | null and String | null +KonsoleWithNulls.WriteLine("Hello","world","there") KonsoleNoNulls.WriteLine("Hello world") try @@ -169,7 +169,7 @@ with :? System.ArgumentNullException -> () // Param array cases KonsoleNoNulls.WriteLine("Hello","world","there") -KonsoleWithNulls.WriteLine("Hello","world",null) // Expected to give a Nullness warning +KonsoleWithNulls.WriteLine("Hello","world",null) // Expected to give no Nullness warning KonsoleNoNulls.WriteLine("Hello","world",null) // Expected to give a Nullness warning System.Console.WriteLine("a", (null: obj[] | null)) System.Console.WriteLine("a", (null: (obj | null)[] | null)) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs.checknulls_on.err.bsl b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs.checknulls_on.err.bsl index 5154ce43e79..709c3c309b3 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs.checknulls_on.err.bsl +++ b/tests/FSharp.Compiler.ComponentTests/Language/Nullness/using-nullness-syntax-positive.fs.checknulls_on.err.bsl @@ -31,5 +31,6 @@ using-nullness-syntax-positive.fs (154,40)-(154,44) typecheck error Nullness war using-nullness-syntax-positive.fs (159,36)-(159,40) typecheck error Nullness warning: The type 'String' does not support 'null'. using-nullness-syntax-positive.fs (162,41)-(162,45) typecheck error Nullness warning: The type 'String' does not support 'null'. using-nullness-syntax-positive.fs (164,37)-(164,41) typecheck error Nullness warning: The type 'String' does not support 'null'. +using-nullness-syntax-positive.fs (173,42)-(173,46) typecheck error The constraints 'null' and 'not null' are inconsistent using-nullness-syntax-positive.fs (183,14)-(183,16) typecheck error Nullness warning: The type 'string' does not support 'null'. using-nullness-syntax-positive.fs (189,17)-(189,26) typecheck error Nullness warning: The type 'String' does not support 'null'. \ No newline at end of file diff --git a/tests/fsharp/core/libtest/test.fsx b/tests/fsharp/core/libtest/test.fsx index 6df6e6e4432..fae232ae5e9 100644 --- a/tests/fsharp/core/libtest/test.fsx +++ b/tests/fsharp/core/libtest/test.fsx @@ -559,9 +559,9 @@ do test "cwewvewho0" (match box(Some 3) with :? option -> false | _ - do test "cwewvewho-" (match box([3]) with :? list as v -> (v = [3]) | _ -> false) do test "cwewvewhoa" (match box([3]) with :? list as v -> false | _ -> true) -do test "cwewvewhos" (match (null:obj) with :? list as v -> false | _ -> true) +do test "cwewvewhos" (match (null:obj) with :? list as v -> false | _ -> true) -let pattest<'a> (obj:obj) fail (succeed : 'a -> bool) = match obj with :? 'a as x -> succeed x | _ -> fail() +let pattest<'a> (obj:objnull) fail (succeed : 'a -> bool) = match obj with :? 'a as x -> succeed x | _ -> fail() do test "cwewvewhoq" (pattest (box(1)) (fun () -> false) (fun v -> v = 1)) do test "cwewvewhow" (pattest (null) (fun () -> true ) (fun _ -> false)) diff --git a/tests/fsharp/core/subtype/test.fsx b/tests/fsharp/core/subtype/test.fsx index 820c8566502..c813ee3ff3a 100644 --- a/tests/fsharp/core/subtype/test.fsx +++ b/tests/fsharp/core/subtype/test.fsx @@ -1768,7 +1768,7 @@ module GenericPropertyConstraintSolvedByRecord = /// overload, even before the full signature of the trait constraint was known. module MethodOverloadingForTraitConstraintsIsNotDeterminedUntilSignatureIsKnown = type X = - static member Method (a: obj) = 1 + static member Method (a: objnull) = 1 static member Method (a: int) = 2 static member Method (a: int64) = 3 @@ -2339,7 +2339,7 @@ module TestSubtypeMatching11 = [] type E() = inherit A() - let toName (x: obj * obj) = + let toName (x: objnull * objnull) = match x with | null, :? E -> "0E" | (:? A), :? E -> "AE" @@ -2418,7 +2418,7 @@ module TestSubtypeMatching12 = type C() = interface IC - let toName (x: obj) = + let toName (x: objnull) = match x with | null -> "null" | :? IA when false -> "IA fail" @@ -2444,7 +2444,7 @@ module TestSubtypeMatching13 = type C() = interface IC - let toName (x: obj) = + let toName (x: objnull) = match x with | null when false -> "null" | :? IA -> "IA" From b187b806f713e05f0b478ba78dfd7140087f436d Mon Sep 17 00:00:00 2001 From: Esben Bjerre Date: Fri, 4 Oct 2024 13:09:35 +0200 Subject: [PATCH 30/37] support decimal literal attribute (#17769) --- .../.FSharp.Compiler.Service/9.0.200.md | 1 + src/Compiler/Checking/PostInferenceChecks.fs | 3 +- src/Compiler/CodeGen/IlxGen.fs | 68 +++++++++++- src/Compiler/TypedTree/TcGlobals.fs | 1 + src/Compiler/TypedTree/TcGlobals.fsi | 2 + src/Compiler/TypedTree/TypedTreeOps.fs | 26 +++-- .../LetBindings/Basic/Basic.fs | 15 ++- .../LetBindings/Basic/E_Literals04.fs | 13 +-- .../PatternMatching/Decimal/Decimal.fs | 26 +++++ .../Decimal/incompleteMatchesLiteral01.fs | 11 ++ .../PatternMatching/Decimal/literal01.fs | 26 +++++ .../EmittedIL/Literals.fs | 103 ++++++++++++++---- .../FSharp.Compiler.ComponentTests.fsproj | 2 + .../Interop/Literals.fs | 35 ++++++ .../Language/CodeQuotationTests.fs | 19 ++++ 15 files changed, 299 insertions(+), 52 deletions(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/Decimal.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/incompleteMatchesLiteral01.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/literal01.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Interop/Literals.fs diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index 688dd4bc702..e58c882938b 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -8,6 +8,7 @@ ### Added +* Support literal attribute on decimals ([PR #17769](https://github.com/dotnet/fsharp/pull/17769)) ### Changed diff --git a/src/Compiler/Checking/PostInferenceChecks.fs b/src/Compiler/Checking/PostInferenceChecks.fs index e9860a76efa..645f43fe3cb 100644 --- a/src/Compiler/Checking/PostInferenceChecks.fs +++ b/src/Compiler/Checking/PostInferenceChecks.fs @@ -1958,7 +1958,8 @@ and CheckAttribArgExpr cenv env expr = | Const.Single _ | Const.Char _ | Const.Zero - | Const.String _ -> () + | Const.String _ + | Const.Decimal _ -> () | _ -> if cenv.reportErrors then errorR (Error (FSComp.SR.tastNotAConstantExpression(), m)) diff --git a/src/Compiler/CodeGen/IlxGen.fs b/src/Compiler/CodeGen/IlxGen.fs index 2f3db5be2ad..2a1c876b8f5 100644 --- a/src/Compiler/CodeGen/IlxGen.fs +++ b/src/Compiler/CodeGen/IlxGen.fs @@ -8563,10 +8563,15 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = let ilFieldDef = mkILStaticField (fspec.Name, fty, None, None, access) + let isDecimalConstant = + match vref.LiteralValue with + | Some(Const.Decimal _) -> true + | _ -> false + let ilFieldDef = match vref.LiteralValue with - | Some konst -> ilFieldDef.WithLiteralDefaultValue(Some(GenFieldInit m konst)) - | None -> ilFieldDef + | Some konst when not isDecimalConstant -> ilFieldDef.WithLiteralDefaultValue(Some(GenFieldInit m konst)) + | _ -> ilFieldDef let ilFieldDef = let isClassInitializer = (cgbuf.MethodName = ".cctor") @@ -8578,6 +8583,7 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = || not isClassInitializer || hasLiteralAttr ) + || isDecimalConstant ) let ilAttribs = @@ -8590,6 +8596,64 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = let ilAttribs = GenAdditionalAttributesForTy g vspec.Type @ ilAttribs + let ilAttribs = + if isDecimalConstant then + match vref.LiteralValue with + | Some(Const.Decimal d) -> + match System.Decimal.GetBits d with + | [| lo; med; hi; signExp |] -> + let scale = (min (((signExp &&& 0xFF0000) >>> 16) &&& 0xFF) 28) |> byte + let sign = if (signExp &&& 0x80000000) <> 0 then 1uy else 0uy + + let attrib = + mkILCustomAttribute ( + g.attrib_DecimalConstantAttribute.TypeRef, + [ + g.ilg.typ_Byte + g.ilg.typ_Byte + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Int32 + ], + [ + ILAttribElem.Byte scale + ILAttribElem.Byte sign + ILAttribElem.UInt32(uint32 hi) + ILAttribElem.UInt32(uint32 med) + ILAttribElem.UInt32(uint32 lo) + ], + [] + ) + + let ilInstrs = + [ + mkLdcInt32 lo + mkLdcInt32 med + mkLdcInt32 hi + mkLdcInt32 (int32 sign) + mkLdcInt32 (int32 scale) + mkNormalNewobj ( + mkILCtorMethSpecForTy ( + fspec.ActualType, + [ + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Bool + g.ilg.typ_Byte + ] + ) + ) + mkNormalStsfld fspec + ] + + CG.EmitInstrs cgbuf (pop 0) (Push0) ilInstrs + [ attrib ] + | _ -> failwith "unreachable" + | _ -> failwith "unreachable" + else + ilAttribs + let ilFieldDef = ilFieldDef.With(customAttrs = mkILCustomAttrs (ilAttribs @ [ g.DebuggerBrowsableNeverAttribute ])) diff --git a/src/Compiler/TypedTree/TcGlobals.fs b/src/Compiler/TypedTree/TcGlobals.fs index 2c065437f2b..531ef79d264 100644 --- a/src/Compiler/TypedTree/TcGlobals.fs +++ b/src/Compiler/TypedTree/TcGlobals.fs @@ -1490,6 +1490,7 @@ type TcGlobals( member val attrib_CallerFilePathAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerFilePathAttribute" member val attrib_CallerMemberNameAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerMemberNameAttribute" member val attrib_SkipLocalsInitAttribute = findSysAttrib "System.Runtime.CompilerServices.SkipLocalsInitAttribute" + member val attrib_DecimalConstantAttribute = findSysAttrib "System.Runtime.CompilerServices.DecimalConstantAttribute" member val attribs_Unsupported = v_attribs_Unsupported member val attrib_ProjectionParameterAttribute = mk_MFCore_attrib "ProjectionParameterAttribute" diff --git a/src/Compiler/TypedTree/TcGlobals.fsi b/src/Compiler/TypedTree/TcGlobals.fsi index 950d5217500..b7d5a892d06 100644 --- a/src/Compiler/TypedTree/TcGlobals.fsi +++ b/src/Compiler/TypedTree/TcGlobals.fsi @@ -474,6 +474,8 @@ type internal TcGlobals = member attrib_SkipLocalsInitAttribute: BuiltinAttribInfo + member attrib_DecimalConstantAttribute: BuiltinAttribInfo + member attrib_StructAttribute: BuiltinAttribInfo member attrib_StructLayoutAttribute: BuiltinAttribInfo diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index 186c3655312..71f26dbf95b 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -10033,7 +10033,7 @@ let EvalArithUnOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt3 | _ -> error (Error ( FSComp.SR.tastNotAConstantExpression(), m)) with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) -let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64, opSingle, opDouble) (arg1: Expr) (arg2: Expr) = +let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64, opSingle, opDouble, opDecimal) (arg1: Expr) (arg2: Expr) = // At compile-time we check arithmetic let m = unionRanges arg1.Range arg2.Range try @@ -10048,6 +10048,7 @@ let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt | Expr.Const (Const.UInt64 x1, _, ty), Expr.Const (Const.UInt64 x2, _, _) -> Expr.Const (Const.UInt64 (opUInt64 x1 x2), m, ty) | Expr.Const (Const.Single x1, _, ty), Expr.Const (Const.Single x2, _, _) -> Expr.Const (Const.Single (opSingle x1 x2), m, ty) | Expr.Const (Const.Double x1, _, ty), Expr.Const (Const.Double x2, _, _) -> Expr.Const (Const.Double (opDouble x1 x2), m, ty) + | Expr.Const (Const.Decimal x1, _, ty), Expr.Const (Const.Decimal x2, _, _) -> Expr.Const (Const.Decimal (opDecimal x1 x2), m, ty) | _ -> error (Error ( FSComp.SR.tastNotAConstantExpression(), m)) with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) @@ -10079,9 +10080,10 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = | Const.Single _ | Const.Char _ | Const.Zero - | Const.String _ -> + | Const.String _ + | Const.Decimal _ -> x - | Const.Decimal _ | Const.IntPtr _ | Const.UIntPtr _ | Const.Unit -> + | Const.IntPtr _ | Const.UIntPtr _ | Const.Unit -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), m)) x @@ -10097,7 +10099,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((|||), (|||), (|||), (|||), (|||), (|||), (|||), (|||), ignore2, ignore2) v1 (EvalAttribArgExpr suppressLangFeatureCheck g arg2) + EvalArithBinOp ((|||), (|||), (|||), (|||), (|||), (|||), (|||), (|||), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr suppressLangFeatureCheck g arg2) | _ -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -10112,7 +10114,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = Expr.Const (Const.Char (x1 + x2), m, ty) | _ -> checkFeature() - EvalArithBinOp (Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+)) v1 v2 + EvalArithBinOp (Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+)) v1 v2 | SpecificBinopExpr g g.unchecked_subtraction_vref (arg1, arg2) -> checkFeature() let v1, v2 = EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1, EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2 @@ -10121,16 +10123,16 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = | Expr.Const (Const.Char x1, m, ty), Expr.Const (Const.Char x2, _, _) -> Expr.Const (Const.Char (x1 - x2), m, ty) | _ -> - EvalArithBinOp (Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-)) v1 v2 + EvalArithBinOp (Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-)) v1 v2 | SpecificBinopExpr g g.unchecked_multiply_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp (Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp (Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.unchecked_division_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp ((/), (/), (/), (/), (/), (/), (/), (/), (/), (/)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((/), (/), (/), (/), (/), (/), (/), (/), (/), (/), (/)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.unchecked_modulus_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp ((%), (%), (%), (%), (%), (%), (%), (%), (%), (%)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((%), (%), (%), (%), (%), (%), (%), (%), (%), (%), (%)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.bitwise_shift_left_vref (arg1, arg2) -> checkFeature() EvalArithShiftOp ((<<<), (<<<), (<<<), (<<<), (<<<), (<<<), (<<<), (<<<)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) @@ -10143,7 +10145,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -10153,7 +10155,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error (FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -10163,7 +10165,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | FloatConstExpr -> - EvalArithBinOp (ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ( ** ), ( ** )) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp (ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ( ** ), ( ** ), ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error (FSComp.SR.tastNotAConstantExpression(), x.Range)) x diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/Basic.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/Basic.fs index d67f22efdc8..c0a19c9ad3e 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/Basic.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/Basic.fs @@ -144,13 +144,12 @@ module LetBindings_Basic = |> verifyCompile |> shouldFail |> withDiagnostics [ - (Error 267, Line 11, Col 18, Line 11, Col 19, "This is not a valid constant expression or custom attribute value") - (Error 837, Line 11, Col 13, Line 11, Col 31, "This is not a valid constant expression") - (Error 267, Line 14, Col 13, Line 14, Col 17, "This is not a valid constant expression or custom attribute value") - (Error 267, Line 17, Col 13, Line 17, Col 15, "This is not a valid constant expression or custom attribute value") - (Error 267, Line 20, Col 13, Line 20, Col 17, "This is not a valid constant expression or custom attribute value") - (Error 267, Line 23, Col 13, Line 23, Col 18, "This is not a valid constant expression or custom attribute value") - (Warning 3178, Line 26, Col 13, Line 26, Col 26, "This is not valid literal expression. The [] attribute will be ignored.") + (Error 267, Line 10, Col 18, Line 10, Col 19, "This is not a valid constant expression or custom attribute value") + (Error 837, Line 10, Col 13, Line 10, Col 31, "This is not a valid constant expression") + (Error 267, Line 16, Col 13, Line 16, Col 15, "This is not a valid constant expression or custom attribute value") + (Error 267, Line 19, Col 13, Line 19, Col 17, "This is not a valid constant expression or custom attribute value") + (Error 267, Line 22, Col 13, Line 22, Col 18, "This is not a valid constant expression or custom attribute value") + (Warning 3178, Line 25, Col 13, Line 25, Col 26, "This is not valid literal expression. The [] attribute will be ignored.") ] // SOURCE=E_Pathological01.fs SCFLAGS=--test:ErrorRanges # E_Pathological01.fs @@ -303,4 +302,4 @@ type C() = |> withDiagnostics [ (Warning 3582, Line 4, Col 5, Line 4, Col 12, "This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses.") (Warning 3582, Line 5, Col 5, Line 5, Col 11, "This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses.") - ] + ] \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/E_Literals04.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/E_Literals04.fs index aa3395e0b6f..c253d840657 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/E_Literals04.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/LetBindings/Basic/E_Literals04.fs @@ -1,11 +1,10 @@ // #Regression #Conformance #DeclarationElements #LetBindings -//This is not a valid constant expression or custom attribute value$ -//This is not a valid constant expression$ -//This is not a valid constant expression or custom attribute value$ -//This is not a valid constant expression or custom attribute value$ -//This is not a valid constant expression or custom attribute value$ -//This is not a valid constant expression or custom attribute value$ -//This is not valid literal expression. The \[\] attribute will be ignored\.$ +//This is not a valid constant expression or custom attribute value$ +//This is not a valid constant expression$ +//This is not a valid constant expression or custom attribute value$ +//This is not a valid constant expression or custom attribute value$ +//This is not a valid constant expression or custom attribute value$ +//This is not valid literal expression. The \[\] attribute will be ignored\.$ [] let lit01 = (let x = "2" in x) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/Decimal.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/Decimal.fs new file mode 100644 index 00000000000..1f168db110f --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/Decimal.fs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Conformance.PatternMatching + +open Xunit +open FSharp.Test +open FSharp.Test.Compiler + +module Decimal = + + [] + let ``Decimal - literal01.fs - --test:ErrorRanges`` compilation = + compilation + |> asFsx + |> withOptions ["--test:ErrorRanges";] + |> compile + |> shouldSucceed + + [] + let ``Decimal - incompleteMatchesLiteral01.fs - --test:ErrorRanges`` compilation = + compilation + |> asFs + |> withOptions ["--test:ErrorRanges"] + |> typecheck + |> shouldFail + |> withSingleDiagnostic (Warning 25, Line 7, Col 11, Line 7, Col 13, "Incomplete pattern matches on this expression. For example, the value '3M' may indicate a case not covered by the pattern(s).") \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/incompleteMatchesLiteral01.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/incompleteMatchesLiteral01.fs new file mode 100644 index 00000000000..2397eeee743 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/incompleteMatchesLiteral01.fs @@ -0,0 +1,11 @@ +[] +let One = 1m +[] +let Two = 2m + +let test() = + match 3m with + | 0m -> false + | One | Two -> false + +exit 0 \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/literal01.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/literal01.fs new file mode 100644 index 00000000000..764958b9bd7 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/PatternMatching/Decimal/literal01.fs @@ -0,0 +1,26 @@ +// #Conformance #PatternMatching +#light + +// Pattern match decimal literals + +[] +let Decimal1 = 5m + +[] +let Decimal2 = 42.42m + +let testDecimal x = + match x with + | Decimal1 -> 1 + | Decimal2 -> 2 + | _ -> 0 + +if testDecimal 1m <> 0 then exit 1 + +if testDecimal Decimal1 <> 1 then exit 1 +if testDecimal 5m <> 1 then exit 1 + +if testDecimal Decimal2 <> 2 then exit 1 +if testDecimal 42.42m <> 2 then exit 1 + +exit 0 \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Literals.fs b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Literals.fs index 9ac49148a78..d2dc41a3235 100644 --- a/tests/FSharp.Compiler.ComponentTests/EmittedIL/Literals.fs +++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/Literals.fs @@ -176,36 +176,95 @@ let [] x = System.Int32.MaxValue + 1 } [] - let ``Compilation fails when using decimal arithmetic in literal``() = + let ``Arithmetic can be used for constructing decimal literals``() = FSharp """ module LiteralArithmetic -let [] x = 1m + 1m +[] +let x = 1m + 2m """ |> withLangVersion80 |> compile - |> shouldFail - |> withResults [ - { Error = Error 267 - Range = { StartLine = 4 - StartColumn = 21 - EndLine = 4 - EndColumn = 23 } - Message = "This is not a valid constant expression or custom attribute value" } - { Error = Error 267 - Range = { StartLine = 4 - StartColumn = 26 - EndLine = 4 - EndColumn = 28 } - Message = "This is not a valid constant expression or custom attribute value" } - { Error = Error 267 - Range = { StartLine = 4 - StartColumn = 21 - EndLine = 4 - EndColumn = 28 } - Message = "This is not a valid constant expression or custom attribute value" } + |> shouldSucceed + |> verifyIL [ + """.field public static initonly valuetype [runtime]System.Decimal x""" + """.custom instance void [runtime]System.Runtime.CompilerServices.DecimalConstantAttribute::.ctor(uint8, + uint8, + int32, + int32, + int32) = ( 01 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 + 00 00 )""" + """.maxstack 8""" + """IL_0000: ldc.i4.3""" + """IL_0001: ldc.i4.0""" + """IL_0002: ldc.i4.0""" + """IL_0003: ldc.i4.0""" + """IL_0004: ldc.i4.0""" + """IL_0005: newobj instance void [runtime]System.Decimal::.ctor(int32, + int32, + int32, + bool, + uint8)""" + """IL_000a: stsfld valuetype [runtime]System.Decimal LiteralArithmetic::x""" + """IL_000f: ret""" + ] + + [] + let ``Pattern matching decimal literal``() = + FSharp """ +module PatternMatch + +[] +let x = 5m + +let test () = + match x with + | 5m -> 0 + | _ -> 1 + """ + |> withLangVersion80 + |> compile + |> shouldSucceed + |> verifyIL [ + """.field public static initonly valuetype [runtime]System.Decimal x""" + """ .custom instance void [runtime]System.Runtime.CompilerServices.DecimalConstantAttribute::.ctor(uint8, + uint8, + int32, + int32, + int32) = ( 01 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 + 00 00 )""" + """IL_0016: call bool [netstandard]System.Decimal::op_Equality(valuetype [netstandard]System.Decimal, + valuetype [netstandard]System.Decimal)""" + """.maxstack 8""" + """IL_0000: ldc.i4.5""" + """IL_0001: ldc.i4.0""" + """IL_0002: ldc.i4.0""" + """IL_0003: ldc.i4.0""" + """IL_0004: ldc.i4.0""" + """IL_0005: newobj instance void [runtime]System.Decimal::.ctor(int32, + int32, + int32, + bool, + uint8)""" + """IL_000a: stsfld valuetype [runtime]System.Decimal PatternMatch::x""" + """IL_000f: ret""" ] + [] + let ``Multiple decimals literals can be created``() = + FSharp """ +module DecimalLiterals + +[] +let x = 41m + +[] +let y = 42m + """ + |> withLangVersion80 + |> compile + |> shouldSucceed + [] let ``Compilation fails when using arithmetic with a non-literal in literal``() = FSharp """ diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 03ff28e096a..4b50b28aa12 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -116,6 +116,7 @@ + @@ -258,6 +259,7 @@ + diff --git a/tests/FSharp.Compiler.ComponentTests/Interop/Literals.fs b/tests/FSharp.Compiler.ComponentTests/Interop/Literals.fs new file mode 100644 index 00000000000..5eeea2822b4 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Interop/Literals.fs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Interop + +open Xunit +open FSharp.Test.Compiler + +module ``Literals interop`` = + + [] + let ``Instantiate F# decimal literal from C#`` () = + let FSLib = + FSharp """ +namespace Interop.FS + +module DecimalLiteral = + [] + let x = 7m + """ + |> withName "FSLib" + + let app = + CSharp """ +using System; +using Interop.FS; +public class C { + public Decimal y = DecimalLiteral.x; +} + """ + |> withReferences [FSLib] + |> withName "CSharpApp" + + app + |> compile + |> shouldSucceed \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Language/CodeQuotationTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/CodeQuotationTests.fs index dc98a4be095..90a4a188e4f 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/CodeQuotationTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/CodeQuotationTests.fs @@ -39,3 +39,22 @@ let z : unit = |> withLangVersion50 |> compileAndRun |> shouldSucceed + + [] + let ``Quotation on decimal literal compiles and runs`` () = + FSharp """ +open Microsoft.FSharp.Quotations.DerivedPatterns + +[] +let x = 7m + +let expr = <@ x @> + +match expr with +| Decimal n -> printfn "%M" n +| _ -> failwith (string expr) + """ + |> asExe + |> withLangVersion80 + |> compileAndRun + |> shouldSucceed \ No newline at end of file From e017a716e02936b8a3253475b3ec00a6655fab27 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 7 Oct 2024 13:21:58 +0100 Subject: [PATCH 31/37] Better error reporting for `return, yield, return! and yield!` (#17792) * Better error reporting for `yield` and `yield!` * format code * Update SyntaxTree Tests * release notes * Update baselines * update test * update tests * update tests * update tests * fix * extra tests * fantomas * update tests * update release notes * more tests * more updates * more tests * more tests * more tests * format code * update tests * more tests --------- Co-authored-by: Petr --- .../.FSharp.Compiler.Service/9.0.200.md | 1 + docs/release-notes/.VisualStudio/17.12.md | 3 +- .../CheckComputationExpressions.fs | 27 ++-- .../Checking/Expressions/CheckExpressions.fs | 12 +- .../Expressions/CheckSequenceExpressions.fs | 17 +- .../Service/FSharpParseFileResults.fs | 4 +- src/Compiler/Service/ServiceStructure.fs | 4 +- src/Compiler/SyntaxTree/SyntaxTree.fs | 4 +- src/Compiler/SyntaxTree/SyntaxTree.fsi | 4 +- src/Compiler/SyntaxTree/SyntaxTreeOps.fs | 4 +- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 19 +++ src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 18 +++ src/Compiler/pars.fsy | 18 ++- .../ErrorMessages/TypeMismatchTests.fs | 2 +- .../Language/ComputationExpressionTests.fs | 151 ++++++++++++++++++ .../Language/SequenceExpressionTests.fs | 27 +++- ...ervice.SurfaceArea.netstandard20.debug.bsl | 18 ++- ...vice.SurfaceArea.netstandard20.release.bsl | 18 ++- tests/fsharp/typecheck/sigs/neg104.vsbsl | 2 +- tests/fsharp/typecheck/sigs/neg107.bsl | 20 +-- tests/fsharp/typecheck/sigs/neg107.vsbsl | 20 +-- tests/fsharp/typecheck/sigs/neg20.bsl | 2 +- tests/fsharp/typecheck/sigs/neg59.bsl | 4 +- tests/fsharp/typecheck/sigs/neg61.bsl | 4 +- .../fsharp/typecheck/sigs/version50/neg20.bsl | 2 +- .../ComputationExpressions/E_MissingReturn.fs | 2 +- .../E_MissingReturnFrom.fs | 2 +- .../ComputationExpressions/E_MissingYield.fs | 2 +- .../E_MissingYieldFrom.fs | 2 +- ...atStartsAtAndAndEndsAfterExpression.fs.bsl | 12 +- ...geStartsAtAndAndEndsAfterExpression.fs.bsl | 12 +- .../Expression/List - Comprehension 01.fs.bsl | 5 +- .../Expression/List - Comprehension 02.fs.bsl | 3 +- .../SyntaxTree/Expression/Rarrow 01.fs.bsl | 4 +- .../SyntaxTree/Expression/Rarrow 02.fs.bsl | 2 +- .../SyntaxTree/Expression/Rarrow 03.fs.bsl | 5 +- ...BangContainsTheRangeOfTheEqualsSign.fs.bsl | 11 +- .../SyntaxTree/Expression/WhileBang 01.fs.bsl | 5 +- .../SyntaxTree/Expression/WhileBang 02.fs.bsl | 5 +- .../SyntaxTree/Expression/WhileBang 03.fs.bsl | 4 +- .../SyntaxTree/Expression/WhileBang 04.fs.bsl | 4 +- .../SyntaxTree/Expression/WhileBang 05.fs.bsl | 4 +- .../SyntaxTree/Expression/WhileBang 06.fs.bsl | 4 +- .../CodeFixes/RemoveReturnOrYield.fs | 6 +- .../CodeFixes/RemoveReturnOrYieldTests.fs | 47 ++++++ 45 files changed, 435 insertions(+), 111 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index e58c882938b..28f20ca2be2 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -16,6 +16,7 @@ * Remove non-functional useSyntaxTreeCache option. ([PR #17768](https://github.com/dotnet/fsharp/pull/17768)) * Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) * Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779)) +* Better ranges for CE `return, yield, return! and yield!` error reporting. ([PR #17792](https://github.com/dotnet/fsharp/pull/17792)) * Better ranges for CE `match!`. ([PR #17789](https://github.com/dotnet/fsharp/pull/17789)) ### Breaking Changes diff --git a/docs/release-notes/.VisualStudio/17.12.md b/docs/release-notes/.VisualStudio/17.12.md index 83df7173b2e..690ec481a20 100644 --- a/docs/release-notes/.VisualStudio/17.12.md +++ b/docs/release-notes/.VisualStudio/17.12.md @@ -5,9 +5,10 @@ ### Added ### Changed +* Fix unwanted navigation on hover [PR #17592](https://github.com/dotnet/fsharp/pull/17592) +* Update `RemoveReturnOrYield` code fix range calculation [PR #17792](https://github.com/dotnet/fsharp/pull/17792) * Fix unwanted navigation on hover [PR #17592](https://github.com/dotnet/fsharp/pull/17592)) * Remove non-functional useSyntaxTreeCache option. ([PR #17768](https://github.com/dotnet/fsharp/pull/17768)) - ### Breaking Changes * Enable FSharp 9.0 Language Version ([Issue #17497](https://github.com/dotnet/fsharp/issues/17438)), [PR](https://github.com/dotnet/fsharp/pull/17500))) diff --git a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs index d328f6a310a..c1aa4dafc5d 100644 --- a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs @@ -1545,7 +1545,9 @@ let rec TryTranslateComputationExpression let dataCompPrior = translatedCtxt ( - TranslateComputationExpressionNoQueryOps ceenv (SynExpr.YieldOrReturn((true, false), varSpaceExpr, mClause)) + TranslateComputationExpressionNoQueryOps + ceenv + (SynExpr.YieldOrReturn((true, false), varSpaceExpr, mClause, SynExprYieldOrReturnTrivia.Zero)) ) // Rebind using for ... @@ -1576,7 +1578,9 @@ let rec TryTranslateComputationExpression let isYield = not (customOperationMaintainsVarSpaceUsingBind ceenv nm) translatedCtxt ( - TranslateComputationExpressionNoQueryOps ceenv (SynExpr.YieldOrReturn((isYield, false), varSpaceExpr, mClause)) + TranslateComputationExpressionNoQueryOps + ceenv + (SynExpr.YieldOrReturn((isYield, false), varSpaceExpr, mClause, SynExprYieldOrReturnTrivia.Zero)) ) // Now run the consumeCustomOpClauses @@ -2374,7 +2378,7 @@ let rec TryTranslateComputationExpression Some(translatedCtxt callExpr) - | SynExpr.YieldOrReturnFrom((true, _), synYieldExpr, m) -> + | SynExpr.YieldOrReturnFrom((true, _), synYieldExpr, _, { YieldOrReturnFromKeyword = m }) -> let yieldFromExpr = mkSourceExpr synYieldExpr ceenv.sourceMethInfo ceenv.builderValName @@ -2392,7 +2396,8 @@ let rec TryTranslateComputationExpression then error (Error(FSComp.SR.tcRequireBuilderMethod ("YieldFrom"), m)) - let yieldFromCall = mkSynCall "YieldFrom" m [ yieldFromExpr ] ceenv.builderValName + let yieldFromCall = + mkSynCall "YieldFrom" synYieldExpr.Range [ yieldFromExpr ] ceenv.builderValName let yieldFromCall = if IsControlFlowExpression synYieldExpr then @@ -2402,7 +2407,7 @@ let rec TryTranslateComputationExpression Some(translatedCtxt yieldFromCall) - | SynExpr.YieldOrReturnFrom((false, _), synReturnExpr, m) -> + | SynExpr.YieldOrReturnFrom((false, _), synReturnExpr, _, { YieldOrReturnFromKeyword = m }) -> let returnFromExpr = mkSourceExpr synReturnExpr ceenv.sourceMethInfo ceenv.builderValName @@ -2424,7 +2429,7 @@ let rec TryTranslateComputationExpression error (Error(FSComp.SR.tcRequireBuilderMethod ("ReturnFrom"), m)) let returnFromCall = - mkSynCall "ReturnFrom" m [ returnFromExpr ] ceenv.builderValName + mkSynCall "ReturnFrom" synReturnExpr.Range [ returnFromExpr ] ceenv.builderValName let returnFromCall = if IsControlFlowExpression synReturnExpr then @@ -2434,7 +2439,7 @@ let rec TryTranslateComputationExpression Some(translatedCtxt returnFromCall) - | SynExpr.YieldOrReturn((isYield, _), synYieldOrReturnExpr, m) -> + | SynExpr.YieldOrReturn((isYield, _), synYieldOrReturnExpr, _, { YieldOrReturnKeyword = m }) -> let methName = (if isYield then "Yield" else "Return") if ceenv.isQuery && not isYield then @@ -2452,10 +2457,10 @@ let rec TryTranslateComputationExpression ceenv.builderTy ) then - error (Error(FSComp.SR.tcRequireBuilderMethod (methName), m)) + error (Error(FSComp.SR.tcRequireBuilderMethod methName, m)) let yieldOrReturnCall = - mkSynCall methName m [ synYieldOrReturnExpr ] ceenv.builderValName + mkSynCall methName synYieldOrReturnExpr.Range [ synYieldOrReturnExpr ] ceenv.builderValName let yieldOrReturnCall = if IsControlFlowExpression synYieldOrReturnExpr then @@ -2759,7 +2764,7 @@ and TranslateComputationExpressionBind /// The inner option indicates if a custom operation is involved inside and convertSimpleReturnToExpr (ceenv: ComputationExpressionContext<'a>) comp varSpace innerComp = match innerComp with - | SynExpr.YieldOrReturn((false, _), returnExpr, m) -> + | SynExpr.YieldOrReturn((false, _), returnExpr, m, _) -> let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnExpr) Some(returnExpr, None) @@ -2901,7 +2906,7 @@ and TranslateComputationExpression (ceenv: ComputationExpressionContext<'a>) fir with | minfo :: _ when MethInfoHasAttribute ceenv.cenv.g m ceenv.cenv.g.attrib_DefaultValueAttribute minfo -> SynExpr.ImplicitZero m - | _ -> SynExpr.YieldOrReturn((false, true), SynExpr.Const(SynConst.Unit, m), m) + | _ -> SynExpr.YieldOrReturn((false, true), SynExpr.Const(SynConst.Unit, m), m, SynExprYieldOrReturnTrivia.Zero) let letBangBind = SynExpr.LetOrUseBang( diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index 3a01eaa2efe..4325d503206 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -5991,16 +5991,16 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy.Commit, env.AccessRights) TcQuotationExpr cenv overallTy env tpenv (oper, raw, ast, isFromQueryExpression, m) - | SynExpr.YieldOrReturn ((isTrueYield, _), _, m) - | SynExpr.YieldOrReturnFrom ((isTrueYield, _), _, m) when isTrueYield -> + | SynExpr.YieldOrReturn ((isTrueYield, _), _, _m, { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom ((isTrueYield, _), _, _m, { YieldOrReturnFromKeyword = m }) when isTrueYield -> error(Error(FSComp.SR.tcConstructRequiresListArrayOrSequence(), m)) - | SynExpr.YieldOrReturn ((_, isTrueReturn), _, m) - | SynExpr.YieldOrReturnFrom ((_, isTrueReturn), _, m) when isTrueReturn -> + | SynExpr.YieldOrReturn ((_, isTrueReturn), _, _m, { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom ((_, isTrueReturn), _, _m, { YieldOrReturnFromKeyword = m }) when isTrueReturn -> error(Error(FSComp.SR.tcConstructRequiresComputationExpressions(), m)) - | SynExpr.YieldOrReturn (_, _, m) - | SynExpr.YieldOrReturnFrom (_, _, m) + | SynExpr.YieldOrReturn (trivia = { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom (trivia = { YieldOrReturnFromKeyword = m }) | SynExpr.ImplicitZero m -> error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) diff --git a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs index b627eef2922..781060c8af4 100644 --- a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs @@ -353,43 +353,44 @@ let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallT Some(combinatorExpr, tpenv) - | SynExpr.YieldOrReturnFrom((isYield, _), synYieldExpr, m) -> + | SynExpr.YieldOrReturnFrom(flags = (isYield, _); expr = synYieldExpr; trivia = { YieldOrReturnFromKeyword = m }) -> let env = { env with eIsControlFlow = false } let resultExpr, genExprTy, tpenv = TcExprOfUnknownType cenv env tpenv synYieldExpr if not isYield then errorR (Error(FSComp.SR.tcUseYieldBangForMultipleResults (), m)) - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css synYieldExpr.Range NoTrace genOuterTy genExprTy - let resultExpr = mkCoerceExpr (resultExpr, genOuterTy, m, genExprTy) + let resultExpr = + mkCoerceExpr (resultExpr, genOuterTy, synYieldExpr.Range, genExprTy) let resultExpr = if IsControlFlowExpression synYieldExpr then resultExpr else - mkDebugPoint m resultExpr + mkDebugPoint resultExpr.Range resultExpr Some(resultExpr, tpenv) - | SynExpr.YieldOrReturn((isYield, _), synYieldExpr, m) -> + | SynExpr.YieldOrReturn(flags = (isYield, _); expr = synYieldExpr; trivia = { YieldOrReturnKeyword = m }) -> let env = { env with eIsControlFlow = false } let genResultTy = NewInferenceType g if not isYield then errorR (Error(FSComp.SR.tcSeqResultsUseYield (), m)) - UnifyTypes cenv env m genOuterTy (mkSeqTy cenv.g genResultTy) + UnifyTypes cenv env synYieldExpr.Range genOuterTy (mkSeqTy cenv.g genResultTy) let resultExpr, tpenv = TcExprFlex cenv flex true genResultTy env tpenv synYieldExpr - let resultExpr = mkCallSeqSingleton cenv.g m genResultTy resultExpr + let resultExpr = mkCallSeqSingleton cenv.g synYieldExpr.Range genResultTy resultExpr let resultExpr = if IsControlFlowExpression synYieldExpr then resultExpr else - mkDebugPoint m resultExpr + mkDebugPoint synYieldExpr.Range resultExpr Some(resultExpr, tpenv) diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs index d00b5fe7934..2623cbde347 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/Compiler/Service/FSharpParseFileResults.fs @@ -573,11 +573,11 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! checkRange m yield! walkExpr isControlFlow innerExpr - | SynExpr.YieldOrReturn(_, e, m) -> + | SynExpr.YieldOrReturn(_, e, m, _) -> yield! checkRange m yield! walkExpr false e - | SynExpr.YieldOrReturnFrom(_, e, _) + | SynExpr.YieldOrReturnFrom(_, e, _, _) | SynExpr.DoBang(expr = e) -> yield! checkRange e.Range yield! walkExpr false e diff --git a/src/Compiler/Service/ServiceStructure.fs b/src/Compiler/Service/ServiceStructure.fs index 6ca45aa6961..5fab5ef9eb5 100644 --- a/src/Compiler/Service/ServiceStructure.fs +++ b/src/Compiler/Service/ServiceStructure.fs @@ -246,11 +246,11 @@ module Structure = rcheck Scope.New Collapse.Below r e.Range parseExpr e - | SynExpr.YieldOrReturn(_, e, r) -> + | SynExpr.YieldOrReturn(_, e, r, _) -> rcheck Scope.YieldOrReturn Collapse.Below r r parseExpr e - | SynExpr.YieldOrReturnFrom(_, e, r) -> + | SynExpr.YieldOrReturnFrom(_, e, r, _) -> rcheck Scope.YieldOrReturnBang Collapse.Below r r parseExpr e diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index f97fe05234d..fc0c811e55d 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -704,9 +704,9 @@ type SynExpr = | SequentialOrImplicitYield of debugPoint: DebugPointAtSequential * expr1: SynExpr * expr2: SynExpr * ifNotStmt: SynExpr * range: range - | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnTrivia - | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia | LetOrUseBang of bindDebugPoint: DebugPointAtBinding * diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index 99138631957..45b03ad3b75 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -877,12 +877,12 @@ type SynExpr = /// F# syntax: yield expr /// F# syntax: return expr /// Computation expressions only - | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnTrivia /// F# syntax: yield! expr /// F# syntax: return! expr /// Computation expressions only - | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia /// F# syntax: let! pat = expr in expr /// F# syntax: use! pat = expr in expr diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs index 680986ea503..8dc46313341 100644 --- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs +++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs @@ -883,8 +883,8 @@ let rec synExprContainsError inpExpr = | SynExpr.InferredDowncast(e, _) | SynExpr.Lazy(e, _) | SynExpr.TraitCall(_, _, e, _) - | SynExpr.YieldOrReturn(_, e, _) - | SynExpr.YieldOrReturnFrom(_, e, _) + | SynExpr.YieldOrReturn(_, e, _, _) + | SynExpr.YieldOrReturnFrom(_, e, _, _) | SynExpr.DoBang(e, _, _) | SynExpr.Fixed(e, _) | SynExpr.DebugPoint(_, _, e) diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 7e03572719e..10aee262292 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -117,6 +117,25 @@ type SynExprMatchBangTrivia = WithKeyword: range } +[] +type SynExprYieldOrReturnTrivia = + { + YieldOrReturnKeyword: range + } + + static member Zero: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = Range.Zero } + +[] +type SynExprYieldOrReturnFromTrivia = + { + YieldOrReturnFromKeyword: range + } + + static member Zero: SynExprYieldOrReturnFromTrivia = + { + YieldOrReturnFromKeyword = Range.Zero + } + [] type SynExprDoBangTrivia = { DoBangKeyword: range } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 3c678a72679..fff834beb41 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -177,6 +177,24 @@ type SynExprDoBangTrivia = DoBangKeyword: range } +/// Represents additional information for SynExpr.YieldOrReturn +[] +type SynExprYieldOrReturnTrivia = + { + /// The syntax range of the `yield` or `return` keyword. + YieldOrReturnKeyword: range + } + + static member Zero: SynExprYieldOrReturnTrivia + +/// Represents additional information for SynExpr.YieldOrReturnFrom +[] +type SynExprYieldOrReturnFromTrivia = + { + /// The syntax range of the `yield!` or `return!` keyword. + YieldOrReturnFromKeyword: range + } + /// Represents additional information for SynExpr.AnonRecd [] type SynExprAnonRecdTrivia = diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 656b75c39ff..185bd1ed842 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4402,18 +4402,22 @@ declExpr: exprFromParseError (SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, $2, arbExpr ("forLoopCollection", mFor), arbExpr ("forLoopBody3", mForLoopBodyArb), mForLoopAll)) } | YIELD declExpr - { SynExpr.YieldOrReturn(($1, not $1), $2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn(($1, not $1), $2, (unionRanges (rhs parseState 1) $2.Range), trivia) } | YIELD_BANG declExpr - { SynExpr.YieldOrReturnFrom(($1, not $1), $2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom(($1, not $1), $2, (unionRanges (rhs parseState 1) $2.Range), trivia) } | YIELD recover { let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturn(($1, not $1), arbExpr ("yield", mYieldAll), mYieldAll) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn(($1, not $1), arbExpr ("yield", mYieldAll), mYieldAll, trivia) } | YIELD_BANG recover { let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturnFrom(($1, not $1), arbExpr ("yield!", mYieldAll), mYieldAll) } + let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom(($1, not $1), arbExpr ("yield!", mYieldAll), mYieldAll, trivia) } | BINDER headBindingPattern EQUALS typedSequentialExprBlock IN opt_OBLOCKSEP moreBinders typedSequentialExprBlock %prec expr_let { let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) @@ -4458,7 +4462,8 @@ declExpr: { errorR(Error(FSComp.SR.parsArrowUseIsLimited(), lhs parseState)) let mArrow = rhs parseState 1 let expr = $2 mArrow - SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range)) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range), trivia) } | declExpr COLON_QMARK typ { SynExpr.TypeTest($1, $3, unionRanges $1.Range $3.Range) } @@ -5456,7 +5461,8 @@ arrowThenExprR: | RARROW typedSequentialExprBlockR { let mArrow = rhs parseState 1 let expr = $2 mArrow - SynExpr.YieldOrReturn((true, false), expr, unionRanges mArrow expr.Range) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = mArrow } + SynExpr.YieldOrReturn((true, false), expr, (unionRanges mArrow expr.Range), trivia) } forLoopBinder: | parenPattern IN declExpr diff --git a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeMismatchTests.fs b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeMismatchTests.fs index 34263b3f7bc..53cb33b5b78 100644 --- a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeMismatchTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeMismatchTests.fs @@ -347,7 +347,7 @@ let f4 = |> withDiagnostics [ (Error 1, Line 6, Col 9, Line 6, Col 16, "This expression was expected to have type\n 'int' \nbut here has type\n 'string' ") (Error 1, Line 12, Col 13, Line 12, Col 16, "This expression was expected to have type\n 'int' \nbut here has type\n 'string' ") - (Error 193, Line 21, Col 9, Line 21, Col 24, "Type constraint mismatch. The type \n 'int list' \nis not compatible with type\n 'string seq' \n") + (Error 193, Line 21, Col 16, Line 21, Col 24, "Type constraint mismatch. The type \n 'int list' \nis not compatible with type\n 'string seq' \n") (Error 1, Line 28, Col 9, Line 28, Col 12, "This expression was expected to have type\n 'int64' \nbut here has type\n 'float' ") ] diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 319d79aa8ea..9d276c13629 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -493,4 +493,155 @@ let run r2 r3 = |> shouldFail |> withDiagnostics [ (Error 750, Line 3, Col 5, Line 3, Col 11, "This construct may only be used within computation expressions") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Yield' method`` () = + Fsx """ +let f3 = + async { + if true then + yield "a" + else + yield "b" + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 5, Col 13, Line 5, Col 18, "This control construct may only be used if the computation expression builder defines a 'Yield' method") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'YieldFrom' method`` () = + Fsx """ +let f3 = + async { + if true then + yield! "a" + else + yield "b" + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 5, Col 13, Line 5, Col 19, "This control construct may only be used if the computation expression builder defines a 'YieldFrom' method") + ] + + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Return' method`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + match r2 with + | Ok x -> return x + | Error e -> return e + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 24, Col 19, Line 24, Col 25, "This control construct may only be used if the computation expression builder defines a 'Return' method") + ] + + + [] + let ``This control construct may only be used if the computation expression builder defines a 'ReturnFrom' method`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + match r2 with + | Ok x -> return! x + | Error e -> return e + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 24, Col 19, Line 24, Col 26, "This control construct may only be used if the computation expression builder defines a 'ReturnFrom' method") + ] + + [] + let ``Type constraint mismatch when using return!`` () = + Fsx """ +open System.Threading.Tasks + +let maybeTask = task { return false } + +let indexHandler (): Task = + task { + return! maybeTask + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 193, Line 8, Col 17, Line 8, Col 26, "Type constraint mismatch. The type \n 'TaskCode' \nis not compatible with type\n 'TaskCode' \n") + ] + + [] + let ``Type constraint mismatch when using return`` () = + Fsx """ +open System.Threading.Tasks + +let maybeTask = task { return false } + +let indexHandler (): Task = + task { + return maybeTask + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 1, Line 8, Col 16, Line 8, Col 25, "This expression was expected to have type + 'string' +but here has type + 'Task' ") ] \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressionTests.fs index 982ae0c820b..8247eaf60e3 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressionTests.fs @@ -442,4 +442,29 @@ let typedSeq = |> withErrorCode 30 |> withDiagnosticMessageMatches "Value restriction: The value 'typedSeq' has an inferred generic type" |> withDiagnosticMessageMatches "val typedSeq: '_a seq" - \ No newline at end of file + +[] +let ``yield may only be used within list, array, and sequence expressions``() = + Fsx """ +let f1 = yield [ 3; 4 ] +let f2 = yield! [ 3; 4 ] + """ + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 747, Line 2, Col 10, Line 2, Col 15, "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"); + (Error 747, Line 3, Col 10, Line 3, Col 16, "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") + ] + +[] +let ``return may only be used within list, array, and sequence expressions``() = + Fsx """ +let f1 = return [ 3; 4 ] +let f2 = return! [ 3; 4 ] + """ + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 748, Line 2, Col 10, Line 2, Col 16, "This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'."); + (Error 748, Line 3, Col 10, Line 3, Col 17, "This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'.") + ] \ No newline at end of file diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index da62302304a..42ec38ee366 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -7668,8 +7668,22 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTyped(FSharp.C FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewUpcast(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewWhile(FSharp.Compiler.Syntax.DebugPointAtWhile, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewWhileBang(FSharp.Compiler.Syntax.DebugPointAtWhile, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturn(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturnFrom(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr+YieldOrReturn: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+YieldOrReturn: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia trivia +FSharp.Compiler.Syntax.SynExpr+YieldOrReturnFrom: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+YieldOrReturnFrom: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia trivia +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturn(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturnFrom(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia) +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: FSharp.Compiler.Text.Range YieldOrReturnFromKeyword +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: FSharp.Compiler.Text.Range get_YieldOrReturnFromKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: Void .ctor(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.Text.Range YieldOrReturnKeyword +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.Text.Range get_YieldOrReturnKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+AddressOf FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+AnonRecd FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+App diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index da62302304a..42ec38ee366 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -7668,8 +7668,22 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTyped(FSharp.C FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewUpcast(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewWhile(FSharp.Compiler.Syntax.DebugPointAtWhile, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewWhileBang(FSharp.Compiler.Syntax.DebugPointAtWhile, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturn(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturnFrom(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr+YieldOrReturn: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+YieldOrReturn: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia trivia +FSharp.Compiler.Syntax.SynExpr+YieldOrReturnFrom: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+YieldOrReturnFrom: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia trivia +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturn(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewYieldOrReturnFrom(System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia) +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: FSharp.Compiler.Text.Range YieldOrReturnFromKeyword +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: FSharp.Compiler.Text.Range get_YieldOrReturnFromKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnFromTrivia: Void .ctor(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.Text.Range YieldOrReturnKeyword +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: FSharp.Compiler.Text.Range get_YieldOrReturnKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprYieldOrReturnTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+AddressOf FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+AnonRecd FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+App diff --git a/tests/fsharp/typecheck/sigs/neg104.vsbsl b/tests/fsharp/typecheck/sigs/neg104.vsbsl index 8a6059aa128..165b4348e35 100644 --- a/tests/fsharp/typecheck/sigs/neg104.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg104.vsbsl @@ -27,4 +27,4 @@ neg104.fs(20,9,20,15): typecheck error FS0025: Incomplete pattern matches on thi neg104.fs(23,9,23,15): typecheck error FS0025: Incomplete pattern matches on this expression. -neg104.fs(35,9,35,18): typecheck error FS0748: This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. +neg104.fs(35,9,35,15): typecheck error FS0748: This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. diff --git a/tests/fsharp/typecheck/sigs/neg107.bsl b/tests/fsharp/typecheck/sigs/neg107.bsl index 30b24d25c59..580233b4775 100644 --- a/tests/fsharp/typecheck/sigs/neg107.bsl +++ b/tests/fsharp/typecheck/sigs/neg107.bsl @@ -33,11 +33,11 @@ neg107.fsx(28,55,28,66): typecheck error FS0425: The type of a first-class funct neg107.fsx(30,49,30,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(30,57,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,64,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(31,70,31,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(31,78,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,85,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(32,13,32,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. @@ -49,13 +49,13 @@ neg107.fsx(32,48,32,53): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,63,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,63,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,63,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,63,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(32,48,32,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs @@ -69,13 +69,13 @@ neg107.fsx(33,56,33,61): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,71,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,71,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,71,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,71,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(33,56,33,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs diff --git a/tests/fsharp/typecheck/sigs/neg107.vsbsl b/tests/fsharp/typecheck/sigs/neg107.vsbsl index 30b24d25c59..580233b4775 100644 --- a/tests/fsharp/typecheck/sigs/neg107.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg107.vsbsl @@ -33,11 +33,11 @@ neg107.fsx(28,55,28,66): typecheck error FS0425: The type of a first-class funct neg107.fsx(30,49,30,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(30,57,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,64,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(31,70,31,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(31,78,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,85,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(32,13,32,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. @@ -49,13 +49,13 @@ neg107.fsx(32,48,32,53): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,63,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,63,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,63,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(32,56,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,63,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(32,48,32,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs @@ -69,13 +69,13 @@ neg107.fsx(33,56,33,61): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,71,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,71,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,71,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,64,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,71,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(33,56,33,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs diff --git a/tests/fsharp/typecheck/sigs/neg20.bsl b/tests/fsharp/typecheck/sigs/neg20.bsl index ea20ab65acf..5229dcaacf6 100644 --- a/tests/fsharp/typecheck/sigs/neg20.bsl +++ b/tests/fsharp/typecheck/sigs/neg20.bsl @@ -67,7 +67,7 @@ but given a 'B list' The type 'A' does not match the type 'B' -neg20.fs(80,23,80,39): typecheck error FS0193: Type constraint mismatch. The type +neg20.fs(80,30,80,39): typecheck error FS0193: Type constraint mismatch. The type 'C list' is not compatible with type 'B seq' diff --git a/tests/fsharp/typecheck/sigs/neg59.bsl b/tests/fsharp/typecheck/sigs/neg59.bsl index 624750b9352..a938f0d271c 100644 --- a/tests/fsharp/typecheck/sigs/neg59.bsl +++ b/tests/fsharp/typecheck/sigs/neg59.bsl @@ -41,6 +41,6 @@ neg59.fs(113,15,113,25): typecheck error FS3140: 'while' expressions may not be neg59.fs(118,15,118,25): typecheck error FS3140: 'while' expressions may not be used in queries -neg59.fs(124,17,124,25): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(124,17,124,23): typecheck error FS3144: 'return' and 'return!' may not be used in queries -neg59.fs(128,17,128,26): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(128,17,128,24): typecheck error FS3144: 'return' and 'return!' may not be used in queries diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 91291a6cb94..b0e6b151a2c 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -63,9 +63,9 @@ neg61.fs(97,13,97,17): typecheck error FS3143: 'let!', 'use!' and 'do!' expressi neg61.fs(102,13,102,16): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries -neg61.fs(107,13,107,21): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg61.fs(107,13,107,19): typecheck error FS3144: 'return' and 'return!' may not be used in queries -neg61.fs(111,13,111,24): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg61.fs(111,13,111,20): typecheck error FS3144: 'return' and 'return!' may not be used in queries neg61.fs(114,13,114,21): typecheck error FS3145: 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. diff --git a/tests/fsharp/typecheck/sigs/version50/neg20.bsl b/tests/fsharp/typecheck/sigs/version50/neg20.bsl index 169c18e8573..394f7777b2a 100644 --- a/tests/fsharp/typecheck/sigs/version50/neg20.bsl +++ b/tests/fsharp/typecheck/sigs/version50/neg20.bsl @@ -98,7 +98,7 @@ but given a 'B list' The type 'A' does not match the type 'B' -neg20.fs(80,23,80,39): typecheck error FS0193: Type constraint mismatch. The type +neg20.fs(80,30,80,39): typecheck error FS0193: Type constraint mismatch. The type 'C list' is not compatible with type 'B seq' diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturn.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturn.fs index a0bb521f1af..5010e70386b 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturn.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturn.fs @@ -1,6 +1,6 @@ // #Regression #Conformance #DataExpressions #ComputationExpressions // Regression test for FSHARP1.0:6149 -//This control construct may only be used if the computation expression builder defines a 'Return' method$ +//This control construct may only be used if the computation expression builder defines a 'Return' method$ type R = S of string diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturnFrom.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturnFrom.fs index 24f20ffb9ac..f8185a9b7fa 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturnFrom.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingReturnFrom.fs @@ -1,6 +1,6 @@ // #Regression #Conformance #DataExpressions #ComputationExpressions // Regression test for FSHARP1.0:6149 -//This control construct may only be used if the computation expression builder defines a 'ReturnFrom' method$ +//This control construct may only be used if the computation expression builder defines a 'ReturnFrom' method$ type R = S of string diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYield.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYield.fs index b731412bfa6..7251faf3978 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYield.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYield.fs @@ -1,6 +1,6 @@ // #Regression #Conformance #DataExpressions #ComputationExpressions // Regression test for FSHARP1.0:6149 -//This control construct may only be used if the computation expression builder defines a 'Yield' method$ +//This control construct may only be used if the computation expression builder defines a 'Yield' method$ type R = S of string diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYieldFrom.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYieldFrom.fs index 63ada5cd6be..3777c375f2b 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYieldFrom.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingYieldFrom.fs @@ -1,6 +1,6 @@ // #Regression #Conformance #DataExpressions #ComputationExpressions // Regression test for FSHARP1.0:6149 -//This control construct may only be used if the computation expression builder defines a 'YieldFrom' method$ +//This control construct may only be used if the computation expression builder defines a 'YieldFrom' method$ type R = S of string diff --git a/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl b/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl index 72f8528c23f..16e62c6c1aa 100644 --- a/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl +++ b/tests/service/data/SyntaxTree/ComputationExpression/MultipleSynExprAndBangHaveRangeThatStartsAtAndAndEndsAfterExpression.fs.bsl @@ -39,10 +39,12 @@ ImplFile (5,4--5,24), { AndBangKeyword = (5,4--5,8) EqualsRange = (5,13--5,14) InKeyword = None })], - YieldOrReturn ((false, true), Ident bar, (6,4--6,14)), - (3,4--6,14), { LetOrUseBangKeyword = (3,4--3,8) - EqualsRange = Some (3,13--3,14) }), - (2,6--7,1)), (2,0--7,1)), (2,0--7,1))], PreXmlDocEmpty, [], - None, (2,0--7,1), { LeadingKeyword = None })], (true, true), + YieldOrReturn + ((false, true), Ident bar, (6,4--6,14), + { YieldOrReturnKeyword = (6,4--6,10) }), (3,4--6,14), + { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,13--3,14) }), (2,6--7,1)), + (2,0--7,1)), (2,0--7,1))], PreXmlDocEmpty, [], None, (2,0--7,1), + { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl b/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl index d0dd3083e64..9ee7e15f532 100644 --- a/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl +++ b/tests/service/data/SyntaxTree/ComputationExpression/SynExprAndBangRangeStartsAtAndAndEndsAfterExpression.fs.bsl @@ -28,10 +28,12 @@ ImplFile (5,4--5,24), { AndBangKeyword = (5,4--5,8) EqualsRange = (5,13--5,14) InKeyword = None })], - YieldOrReturn ((false, true), Ident bar, (7,4--7,14)), - (3,4--7,14), { LetOrUseBangKeyword = (3,4--3,8) - EqualsRange = Some (3,13--3,14) }), - (2,6--8,1)), (2,0--8,1)), (2,0--8,1))], PreXmlDocEmpty, [], - None, (2,0--8,1), { LeadingKeyword = None })], (true, true), + YieldOrReturn + ((false, true), Ident bar, (7,4--7,14), + { YieldOrReturnKeyword = (7,4--7,10) }), (3,4--7,14), + { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,13--3,14) }), (2,6--8,1)), + (2,0--8,1)), (2,0--8,1))], PreXmlDocEmpty, [], None, (2,0--8,1), + { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/List - Comprehension 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/List - Comprehension 01.fs.bsl index 7cc9b348848..517c835a63a 100644 --- a/tests/service/data/SyntaxTree/Expression/List - Comprehension 01.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/List - Comprehension 01.fs.bsl @@ -12,8 +12,9 @@ ImplFile Named (SynIdent (x, None), false, None, (3,6--3,7)), ArrayOrList (false, [], (3,11--3,13)), YieldOrReturn - ((true, false), Const (Unit, (3,17--3,19)), (3,14--3,19)), - (3,2--3,19)), (3,0--3,21)), (3,0--3,21))], + ((true, false), Const (Unit, (3,17--3,19)), (3,14--3,19), + { YieldOrReturnKeyword = (3,14--3,16) }), (3,2--3,19)), + (3,0--3,21)), (3,0--3,21))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/List - Comprehension 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/List - Comprehension 02.fs.bsl index 1a89da1b0fb..9897592fb0a 100644 --- a/tests/service/data/SyntaxTree/Expression/List - Comprehension 02.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/List - Comprehension 02.fs.bsl @@ -15,7 +15,8 @@ ImplFile ((true, false), ArbitraryAfterError ("typedSequentialExprBlockR1", (3,16--3,16)), - (3,14--3,16)), (3,2--3,16)), (3,0--3,18)), (3,0--3,18))], + (3,14--3,16), { YieldOrReturnKeyword = (3,14--3,16) }), + (3,2--3,16)), (3,0--3,18)), (3,0--3,18))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,18), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/Rarrow 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/Rarrow 01.fs.bsl index 9d7e7af2125..c3c454436ce 100644 --- a/tests/service/data/SyntaxTree/Expression/Rarrow 01.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Rarrow 01.fs.bsl @@ -5,8 +5,8 @@ ImplFile ([Module], false, NamedModule, [Expr (YieldOrReturn - ((true, true), Const (Int32 1, (3,3--3,4)), (3,0--3,4)), - (3,0--3,4))], + ((true, true), Const (Int32 1, (3,3--3,4)), (3,0--3,4), + { YieldOrReturnKeyword = (3,0--3,2) }), (3,0--3,4))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,4), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/Rarrow 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/Rarrow 02.fs.bsl index 54570b38728..3a0af632862 100644 --- a/tests/service/data/SyntaxTree/Expression/Rarrow 02.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Rarrow 02.fs.bsl @@ -7,7 +7,7 @@ ImplFile (YieldOrReturn ((true, true), ArbitraryAfterError ("typedSequentialExprBlockR1", (3,2--3,2)), - (3,0--3,2)), (3,0--3,2))], + (3,0--3,2), { YieldOrReturnKeyword = (3,0--3,2) }), (3,0--3,2))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/Rarrow 03.fs.bsl b/tests/service/data/SyntaxTree/Expression/Rarrow 03.fs.bsl index e0d4104ac0a..ceae74bf09b 100644 --- a/tests/service/data/SyntaxTree/Expression/Rarrow 03.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Rarrow 03.fs.bsl @@ -9,8 +9,9 @@ ImplFile YieldOrReturn ((true, true), ArbitraryAfterError - ("typedSequentialExprBlockR1", (3,5--3,5)), (3,3--3,5)), - (3,0--3,5)), (3,0--3,5))], + ("typedSequentialExprBlockR1", (3,5--3,5)), (3,3--3,5), + { YieldOrReturnKeyword = (3,3--3,5) }), (3,0--3,5), + { YieldOrReturnKeyword = (3,0--3,2) }), (3,0--3,5))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,5), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl index a0f54029820..0264686482c 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseBangContainsTheRangeOfTheEqualsSign.fs.bsl @@ -26,10 +26,11 @@ ImplFile EqualsRange = (4,11--4,12) InKeyword = None })], YieldOrReturn - ((false, true), Const (Unit, (5,11--5,13)), (5,4--5,13)), - (3,4--5,13), { LetOrUseBangKeyword = (3,4--3,8) - EqualsRange = Some (3,11--3,12) }), - (2,5--6,1)), (2,0--6,1)), (2,0--6,1))], PreXmlDocEmpty, [], - None, (2,0--6,1), { LeadingKeyword = None })], (true, true), + ((false, true), Const (Unit, (5,11--5,13)), (5,4--5,13), + { YieldOrReturnKeyword = (5,4--5,10) }), (3,4--5,13), + { LetOrUseBangKeyword = (3,4--3,8) + EqualsRange = Some (3,11--3,12) }), (2,5--6,1)), + (2,0--6,1)), (2,0--6,1))], PreXmlDocEmpty, [], None, (2,0--6,1), + { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 01.fs.bsl index 936525524f3..deb6d27aa83 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 01.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 01.fs.bsl @@ -13,8 +13,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (3,22--3,26)), - (3,15--3,26)), (3,13--3,28)), (3,7--3,28)), - Const (Int32 2, (4,4--4,5)), (3,0--4,5)), (3,0--4,5)); + (3,15--3,26), { YieldOrReturnKeyword = (3,15--3,21) }), + (3,13--3,28)), (3,7--3,28)), Const (Int32 2, (4,4--4,5)), + (3,0--4,5)), (3,0--4,5)); Expr (Const (Int32 3, (6,0--6,1)), (6,0--6,1))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,1), { LeadingKeyword = Module (1,0--1,6) })], (true, true), diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 02.fs.bsl index b12f9b0df18..52eaca7bfdc 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 02.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 02.fs.bsl @@ -13,8 +13,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (3,22--3,26)), - (3,15--3,26)), (3,13--3,28)), (3,7--3,28)), - Const (Int32 2, (4,4--4,5)), (3,0--5,4)), (3,0--5,4)); + (3,15--3,26), { YieldOrReturnKeyword = (3,15--3,21) }), + (3,13--3,28)), (3,7--3,28)), Const (Int32 2, (4,4--4,5)), + (3,0--5,4)), (3,0--5,4)); Expr (Const (Int32 3, (7,0--7,1)), (7,0--7,1))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--7,1), { LeadingKeyword = Module (1,0--1,6) })], (true, true), diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 03.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 03.fs.bsl index a5793465b34..437c23a2c6b 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 03.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 03.fs.bsl @@ -20,7 +20,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (4,26--4,30)), - (4,19--4,30)), (4,17--4,32)), (4,11--4,32)), + (4,19--4,30), + { YieldOrReturnKeyword = (4,19--4,25) }), + (4,17--4,32)), (4,11--4,32)), ArbitraryAfterError ("whileBody1", (6,0--6,1)), (4,4--4,35)), (3,4--3,5), Yes (3,0--4,35), { LeadingKeyword = Let (3,0--3,3) InlineKeyword = None diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 04.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 04.fs.bsl index 863c8aaabfe..70db990cb0e 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 04.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 04.fs.bsl @@ -20,7 +20,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (4,26--4,30)), - (4,19--4,30)), (4,17--4,32)), (4,11--4,32)), + (4,19--4,30), + { YieldOrReturnKeyword = (4,19--4,25) }), + (4,17--4,32)), (4,11--4,32)), ArbitraryAfterError ("whileBody1", (5,0--5,0)), (4,4--4,35)), (3,4--3,5), Yes (3,0--4,35), { LeadingKeyword = Let (3,0--3,3) InlineKeyword = None diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 05.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 05.fs.bsl index e2f5875ef4b..a8b4a21543b 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 05.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 05.fs.bsl @@ -20,7 +20,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (4,26--4,30)), - (4,19--4,30)), (4,17--4,32)), (4,11--4,32)), + (4,19--4,30), + { YieldOrReturnKeyword = (4,19--4,25) }), + (4,17--4,32)), (4,11--4,32)), Const (Int32 2, (5,8--5,9)), (4,4--5,9)), (3,4--3,5), Yes (3,0--5,9), { LeadingKeyword = Let (3,0--3,3) InlineKeyword = None diff --git a/tests/service/data/SyntaxTree/Expression/WhileBang 06.fs.bsl b/tests/service/data/SyntaxTree/Expression/WhileBang 06.fs.bsl index 3c8ef1cbebf..df87ceb6a9d 100644 --- a/tests/service/data/SyntaxTree/Expression/WhileBang 06.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/WhileBang 06.fs.bsl @@ -20,7 +20,9 @@ ImplFile (false, YieldOrReturn ((false, true), Const (Bool true, (4,26--4,30)), - (4,19--4,30)), (4,17--4,32)), (4,11--4,32)), + (4,19--4,30), + { YieldOrReturnKeyword = (4,19--4,25) }), + (4,17--4,32)), (4,11--4,32)), Const (Int32 2, (5,4--5,5)), (4,4--5,5)), (3,4--3,5), Yes (3,0--5,5), { LeadingKeyword = Let (3,0--3,3) InlineKeyword = None diff --git a/vsintegration/src/FSharp.Editor/CodeFixes/RemoveReturnOrYield.fs b/vsintegration/src/FSharp.Editor/CodeFixes/RemoveReturnOrYield.fs index cbc22219a12..ec376552709 100644 --- a/vsintegration/src/FSharp.Editor/CodeFixes/RemoveReturnOrYield.fs +++ b/vsintegration/src/FSharp.Editor/CodeFixes/RemoveReturnOrYield.fs @@ -30,7 +30,11 @@ type internal RemoveReturnOrYieldCodeFixProvider [] () = parseResults.TryRangeOfExprInYieldOrReturn errorRange.Start |> ValueOption.ofOption |> ValueOption.map (fun exprRange -> RoslynHelpers.FSharpRangeToTextSpan(sourceText, exprRange)) - |> ValueOption.map (fun exprSpan -> [ TextChange(context.Span, sourceText.GetSubText(exprSpan).ToString()) ]) + |> ValueOption.map (fun exprSpan -> + [ + // meaning: keyword + spacing before the expression + TextChange(TextSpan(context.Span.Start, exprSpan.Start - context.Span.Start), "") + ]) |> ValueOption.map (fun changes -> let title = let text = sourceText.GetSubText(context.Span).ToString() diff --git a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/RemoveReturnOrYieldTests.fs b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/RemoveReturnOrYieldTests.fs index 23d5908d557..a93bd4f6a3a 100644 --- a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/RemoveReturnOrYieldTests.fs +++ b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/RemoveReturnOrYieldTests.fs @@ -102,3 +102,50 @@ let answer question = let actual = codeFix |> tryFix code Auto Assert.Equal(expected, actual) + +[] +let ``Handles spaces`` () = + let code = + """ +let answer question = + yield 42 +""" + + let expected = + Some + { + Message = "Remove 'yield'" + FixedCode = + """ +let answer question = + 42 +""" + } + + let actual = codeFix |> tryFix code Auto + + Assert.Equal(expected, actual) + +[] +let ``Handles new lines`` () = + let code = + """ +let answer question = + return! + 42 +""" + + let expected = + Some + { + Message = "Remove 'return!'" + FixedCode = + """ +let answer question = + 42 +""" + } + + let actual = codeFix |> tryFix code Auto + + Assert.Equal(expected, actual) From 8eec34b024f4b09090189e5f6396beb691abbf6d Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 7 Oct 2024 14:55:49 +0200 Subject: [PATCH 32/37] Rename TSACondig.gdntsa to TSAConfig.gdntsa --- eng/{TSACondig.gdntsa => TSAConfig.gdntsa} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename eng/{TSACondig.gdntsa => TSAConfig.gdntsa} (99%) diff --git a/eng/TSACondig.gdntsa b/eng/TSAConfig.gdntsa similarity index 99% rename from eng/TSACondig.gdntsa rename to eng/TSAConfig.gdntsa index 864c796b398..56d3d0d457a 100644 --- a/eng/TSACondig.gdntsa +++ b/eng/TSAConfig.gdntsa @@ -13,4 +13,4 @@ "areaPath": "DevDiv\\FSharp", "iterationPath": "DevDiv", "allTools": true -} \ No newline at end of file +} From c4850d624f3e3d053d5363bb2a2d8d8578ecfaff Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Mon, 7 Oct 2024 08:39:23 -0700 Subject: [PATCH 33/37] Merge release/dev17.12 to main (#17842) * Update azure-pipelines.yml * Refactor CE checking (#17464) (#17493) Co-authored-by: Vlad Zarytovskii Co-authored-by: vzarytovskii <1260985+vzarytovskii@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update azure-pipelines.yml * Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 2524346 (#17610) * Fixes #17447 -MethodAccessException on equality comparison of a record with private fields (#17467) * Fix17447 * tests + readme * fixes #17541 - Equals visibility for DU's (#17548) * update version number * Switch to new VMR control set (#17703) (port from main) (#17788) * Now that fsharp is on 9.0, we can switch to the new control set. Generally: - DotNetBuildFromSource -> DotNetBuildSourceOnly - Building a source-only build. - DotnetBuildFromSourceFlavor == Product -> DotNetBuildOrchestrator == true - Building in the VMR, could be source-only or MS's build. - ArcadeBuildFromSource -> DotNetBuildRepo == true -> Indicates an outer repo build. - ExcludeFromSourceBuild -> ExcludeFromSourceOnlyBuild * Split out source build args * Split out source build args * Remove unnecessary source build env var set * Add properties to the bootstrap compiler build * BuildRepo -> BuildInnerRepo * Only build proto repo in inner build * Additional VMR properties for completeness * Rename sourcebuild.props -> dotnetbuild.props --------- Co-authored-by: Petr * respect generic arity in method uniqueness * [17.12] Turn off realsig when building product and proto (#17808) * Bugfix : make sure nullness does not break XmlDoc info import for methods and types (#17741) * Remove nullness signal in string-based type encoding of a symbol (since it is used for xmldoc lookup) * release notes * Discard unused values * Rendering AllowsRefStruct for type parameters (#17706) * Update azure-pipelines.yml --------- Co-authored-by: Vlad Zarytovskii Co-authored-by: Petr Co-authored-by: Tomas Grosup Co-authored-by: Kevin Ransom (msft) Co-authored-by: vzarytovskii <1260985+vzarytovskii@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Kevin Ransom Co-authored-by: Matt Mitchell --- azure-pipelines.yml | 2 +- src/Compiler/xlf/FSComp.txt.cs.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.de.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.es.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.fr.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.it.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.ja.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.ko.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.pl.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.pt-BR.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.ru.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.tr.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.zh-Hans.xlf | 24 +++++++++---------- src/Compiler/xlf/FSComp.txt.zh-Hant.xlf | 24 +++++++++---------- src/Compiler/xlf/FSStrings.cs.xlf | 2 +- src/Compiler/xlf/FSStrings.de.xlf | 2 +- src/Compiler/xlf/FSStrings.es.xlf | 2 +- src/Compiler/xlf/FSStrings.fr.xlf | 2 +- src/Compiler/xlf/FSStrings.it.xlf | 2 +- src/Compiler/xlf/FSStrings.ja.xlf | 2 +- src/Compiler/xlf/FSStrings.ko.xlf | 2 +- src/Compiler/xlf/FSStrings.pl.xlf | 2 +- src/Compiler/xlf/FSStrings.pt-BR.xlf | 2 +- src/Compiler/xlf/FSStrings.ru.xlf | 2 +- src/Compiler/xlf/FSStrings.tr.xlf | 2 +- src/Compiler/xlf/FSStrings.zh-Hans.xlf | 2 +- src/Compiler/xlf/FSStrings.zh-Hant.xlf | 2 +- src/FSharp.Core/xlf/FSCore.cs.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.de.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.es.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.fr.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.it.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.ja.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.ko.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.pl.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.pt-BR.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.ru.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.tr.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.zh-Hans.xlf | 4 ++-- src/FSharp.Core/xlf/FSCore.zh-Hant.xlf | 4 ++-- .../xlf/FSDependencyManager.txt.cs.xlf | 2 +- .../xlf/FSDependencyManager.txt.de.xlf | 2 +- .../xlf/FSDependencyManager.txt.es.xlf | 2 +- .../xlf/FSDependencyManager.txt.fr.xlf | 2 +- .../xlf/FSDependencyManager.txt.it.xlf | 2 +- .../xlf/FSDependencyManager.txt.ja.xlf | 2 +- .../xlf/FSDependencyManager.txt.ko.xlf | 2 +- .../xlf/FSDependencyManager.txt.pl.xlf | 2 +- .../xlf/FSDependencyManager.txt.pt-BR.xlf | 2 +- .../xlf/FSDependencyManager.txt.ru.xlf | 2 +- .../xlf/FSDependencyManager.txt.tr.xlf | 2 +- .../xlf/FSDependencyManager.txt.zh-Hans.xlf | 2 +- .../xlf/FSDependencyManager.txt.zh-Hant.xlf | 2 +- .../Template/xlf/Tutorial.fsx.cs.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.de.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.es.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.fr.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.it.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.ja.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.ko.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.pl.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.pt-BR.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.ru.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.tr.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.zh-Hans.xlf | 8 +++---- .../Template/xlf/Tutorial.fsx.zh-Hant.xlf | 8 +++---- ...rosoft.VisualStudio.Package.Project.cs.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.de.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.es.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.fr.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.it.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.ja.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.ko.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.pl.xlf | 2 +- ...oft.VisualStudio.Package.Project.pt-BR.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.ru.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.tr.xlf | 2 +- ...t.VisualStudio.Package.Project.zh-Hans.xlf | 2 +- ...t.VisualStudio.Package.Project.zh-Hant.xlf | 2 +- .../Resources/xlf/WCF.cs.xlf | 2 +- .../Resources/xlf/WCF.de.xlf | 2 +- .../Resources/xlf/WCF.es.xlf | 2 +- .../Resources/xlf/WCF.fr.xlf | 2 +- .../Resources/xlf/WCF.it.xlf | 2 +- .../Resources/xlf/WCF.ja.xlf | 2 +- .../Resources/xlf/WCF.ko.xlf | 2 +- .../Resources/xlf/WCF.pl.xlf | 2 +- .../Resources/xlf/WCF.pt-BR.xlf | 2 +- .../Resources/xlf/WCF.ru.xlf | 2 +- .../Resources/xlf/WCF.tr.xlf | 2 +- .../Resources/xlf/WCF.zh-Hans.xlf | 2 +- .../Resources/xlf/WCF.zh-Hant.xlf | 2 +- 92 files changed, 287 insertions(+), 287 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 008ddfa8645..ee79daa9ebf 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,7 @@ variables: # (since for all *new* release branches we insert into VS main and for all *previous* releases we insert into corresponding VS release), # i.e. 'rel/d17.9' *or* 'main' in dotnet/fsharp/refs/heads/main and 'main' in F# dotnet/fsharp/refs/heads/release/dev17.10 (latest release branch) - name: VSInsertionTargetBranchName - value: main + value: rel/d17.12 - name: _TeamName value: FSharp - name: TeamName diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf index 2b1a9483def..958a1357ac9 100644 --- a/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -539,7 +539,7 @@ whitespace relaxation - uvolnění prázdných znaků + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - Ve specifikaci obnovitelného kódu došlo k omezené obecné konstrukci. + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - Ve specifikaci obnovitelného kódu došlo k „let rec“. + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Je třeba inicializovat následující požadované vlastnosti:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Neplatný obnovitelný kód. Ve specifikaci obnovitelného kódu došlo k „let rec“. + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Zadejte typ ladění: full, portable, embedded, pdbonly. ({0} je výchozí hodnota v případě, že není zadaný žádný typ ladění, a umožňuje připojení ladicího programu ke spuštěnému programu, portable je formát pro různé platformy, embedded je formát pro různé platformy vložený do výstupního souboru). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Rezidentní kompilační služba se nepoužila, protože došlo k potížím při komunikaci se serverem. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Při použití statických argumentů u poskytnutého typu došlo k chybě. + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Základní atribut TypeProviderAssembly sestavení {0} má neplatnou hodnotu {1}. Hodnotou by měl být platný název sestavení. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Při použití statických argumentů u poskytnuté metody došlo k chybě. + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Atribut CallerMemberNameAttribute použitý pro parametr {0} nebude mít žádný účinek. Přepisuje ho atribut CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Slouží k uvození bloku kódu, který může vygenerovat výjimku. Používá se společně s with nebo finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index a1b2532e4db..d7233a5d2fc 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -539,7 +539,7 @@ whitespace relaxation - Lockerung für Leerraum + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - In der fortsetzbaren Codespezifikation ist ein eingeschränktes generisches Konstrukt aufgetreten. + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - "Let rec" ist in der fortsetzbaren Codespezifikation aufgetreten. + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Die folgenden erforderlichen Eigenschaften müssen initialisiert werden:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Ungültiger fortsetzbarer Code. "Let rec" ist in der fortsetzbaren Codespezifikation aufgetreten + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Geben Sie den Debugtyp an: full, portable, embedded, pdbonly. ("{0}" ist der Standardwert, wenn kein Debugtyp angegeben wird, und ermöglicht das Anfügen eines Debuggers an ein aktuell ausgeführtes Programm. "portable" ist ein plattformübergreifendes Format, "embedded" ein plattformübergreifendes, in die Ausgabedatei eingebettetes Format). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Der residente Kompilierungsdienst wurde nicht verwendet, da bei der Kommunikation mit dem Server ein Problem aufgetreten ist. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Fehler beim Anwenden des statischen Arguments auf einen angegebenen Typ. + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Assembly '{0}' verfügt über ein TypeProviderAssembly-Attribut mit dem ungültigen Wert '{1}'. Beim Wert sollte es sich um einen gültigen Assemblynamen handeln. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Fehler beim Anwenden der statischen Argumente auf eine angegebene Methode. + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Das auf Parameter "{0}" angewendete CallerMemberNameAttribute hat keine Auswirkung. Es wird vom CallerFilePathAttribute überschrieben. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Wird verwendet, um einen Codeblock einzuführen, der unter Umständen eine Ausnahme generiert. Wird zusammen mit "with" oder "finally" verwendet. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index dd9cbb7fec6..1b3205ffa53 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -539,7 +539,7 @@ whitespace relaxation - relajación de espacio en blanco + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - En la especificación del código resumible aparecía una construcción genérica restringida + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - Se ha producido "let rec" en la especificación de código reanudable + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Se deben inicializar las siguientes propiedades necesarias:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Código reanudable no válido. Se ha producido "let rec" en la especificación de código reanudable + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Especifique el tipo de depuración: full, portable, embedded, pdbonly. ('{0}' es el valor predeterminado si no se especifica ningún tipo de depuración y permite conectar un depurador a un programa en ejecución, 'portable' es un formato multiplataforma, 'embedded' es un formato multiplataforma insertado en el archivo de salida). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - El servicio de compilación residente no se usó porque se produjo un problema en la comunicación con el servidor. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Error al aplicar los argumentos estáticos a un tipo proporcionado. + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - El ensamblado '{0}' tiene el atributo TypeProviderAssembly con el valor '{1}' no válido. El valor debe ser un nombre de ensamblado válido. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Se produjo un error al aplicar los argumentos estáticos a un método proporcionado + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - El CallerMemberNameAttribute aplicado al parámetro '{0}' no tendrá ningún efecto. Este se reemplaza por CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Se usa para incluir un bloque de código que puede generar una excepción. Se usa junto con with o finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index 2cc92e5f4d5..018180a8fb6 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -539,7 +539,7 @@ whitespace relaxation - assouplissement de la mise en retrait avec des espaces blancs + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - Une construction générique contrainte s'est produite dans la spécification de code de reprise + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - Un «let rec» s’est produit dans la spécification de code pouvant être repris + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Les propriétés requises suivantes doivent être initialisées :{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Code pouvant être reprise non valide. Un «let rec» s’est produit dans la spécification de code pouvant être repris + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Spécifiez le type de débogage : full, portable, embedded, pdbonly. ('{0}' est la valeur par défaut si aucun type de débogage n'est spécifié. Cette valeur permet d'attacher un débogueur à un programme en cours d'exécution, 'portable' est un format multiplateforme, 'embedded' est un format multiplateforme incorporé dans le fichier de sortie). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Le service de compilation résident n'a pas été utilisé en raison d'un problème lors de la communication avec le serveur. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Une erreur s'est produite lors de l'application des arguments statiques à un type fourni + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - L'assembly '{0}' a un attribut TypeProviderAssembly comportant la valeur non valide '{1}'. La valeur doit être un nom d'assembly valide + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Une erreur s'est produite durant l'application des arguments statiques à une méthode fournie + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - CallerMemberNameAttribute, qui est appliqué au paramètre '{0}', n'aura aucun effet. Il est remplacé par CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Permet d'introduire un bloc de code pouvant générer une exception. Utilisé avec with ou finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index 5b5793c4841..7cc3f46259b 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -539,7 +539,7 @@ whitespace relaxation - uso meno restrittivo degli spazi vuoti + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - Costrutto generico vincolato nella specifica del codice ripristinabile + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - È stata rilevata una funzione 'let rec' nella specifica del codice ripristinabile + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - È necessario inizializzare le proprietà obbligatorie seguenti:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Codice ripristinabile non valido. È stato rilevata una funzione 'let rec' nella specifica del codice ripristinabile + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Consente di specificare il tipo di debug: full, portable, embedded, pdbonly. '{0}' è l'impostazione predefinita se non viene specificato il tipo di debug e consente di associare un debugger a un programma in esecuzione. 'portable' è un formato multipiattaforma. 'embedded' è un formato multipiattaforma incorporato nel file di output. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Il servizio di compilazione residente non è stato usato perché si è verificato un problema nella comunicazione con il server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Errore durante l'applicazione degli argomenti statici a un tipo fornito + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Valore '{1}' non valido dell'attributo TypeProviderAssembly nell'assembly '{0}'. Il valore deve essere un nome di assembly valido. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Si è verificato un errore durante l'applicazione degli argomenti statici a un metodo fornito + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - CallerMemberNameAttribute applicato al parametro '{0}' non avrà alcun effetto. CallerFilePathAttribute ne eseguirà l'override. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Usata per introdurre un blocco di codice che potrebbe generare un'eccezione. Usata insieme a with o finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index d30efc74724..10c5f06f4ff 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -539,7 +539,7 @@ whitespace relaxation - 空白の緩和 + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - 再開可能なコード指定で制約付きジェネリック コンストラクトが発生しました + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - 再開可能なコード仕様で 'let rec' が発生しました + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - 次の必須プロパティを初期化する必要があります:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - 再開可能なコードが無効です。再開可能なコード仕様で 'let rec' が発生しました + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - デバッグの種類 full、portable、pdbonly を指定します (デバッグの種類が指定されない場合には '{0}' が既定で、実行中のプログラムにデバッガーを付加することができます。'portable' はクロスプラットフォーム形式、'embedded' は出力ファイルに埋め込まれたクロスプラットフォーム形式です)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - サーバーとの通信で問題が発生したため、常駐コンパイル サービスが使用されませんでした。 + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - 指定された型に静的引数を適用する際にエラーが発生しました + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - アセンブリ '{0}' の TypeProviderAssembly 属性に、無効な値 '{1}' が含まれています。この値は有効なアセンブリ名であることが必要です + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - 静的な引数を指定されたメソッドに適用する際エラーが発生しました + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - パラメーター '{0}' に適用された CallerMemberNameAttribute は、CallerFilePathAttribute.によってオーバーライドされるため無効となります。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - 例外を生成する可能性があるコード ブロックを開始するために使用します。with または finally と一緒に使用します。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index c9359c56807..94cd344f052 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -539,7 +539,7 @@ whitespace relaxation - 공백 완화 + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - 다시 시작 가능한 코드 사양에서 제약이 있는 제네릭 구문이 발생했습니다. + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - 다시 시작 가능한 코드 사양에서 'let rec'가 발생했습니다. + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - 다음 필수 속성을 초기화해야 합니다. {0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - 다시 시작 가능한 코드가 잘못되었습니다. 다시 시작 가능한 코드 사양에서 'let rec'가 발생했습니다. + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - 디버깅 형식(full, portable, embedded, pdbonly)을 지정합니다. '{0}'은(는) 디버깅 형식을 지정하지 않은 경우 기본값이며 디버거를 실행 중인 프로그램에 연결할 수 있습니다. 'portable'은 플랫폼 간 형식이고, 'embedded'는 출력 파일에 포함된 플랫폼 간 형식입니다. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - 서버와 통신하는 동안 문제가 발생하여 상주 컴파일 서비스를 사용하지 않았습니다. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - 제공된 형식에 정적 인수를 적용하는 동안 오류가 발생했습니다. + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - {0}' 어셈블리에 포함된 TypeProviderAssembly 특성의 값('{1}')이 잘못되었습니다. 값은 올바른 어셈블리 이름이어야 합니다. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - 제공된 메서드에 정적 인수를 적용하는 동안 오류가 발생했습니다. + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - {0}' 매개 변수에 적용되는 CallerMemberNameAttribute는 효과가 없습니다. CallerFilePathAttribute에서 재정의합니다. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - 예외를 생성할 수 있는 코드 블록을 지정하는 데 사용됩니다. with 또는 finally와 함께 사용됩니다. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index 933379b9f7b..01f2ff1d5e3 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -539,7 +539,7 @@ whitespace relaxation - rozluźnianie reguł dotyczących odstępów + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - W specyfikacji kodu z możliwością wznowienia wystąpiła ograniczona konstrukcja ogólna + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - W specyfikacji kodu z możliwością wznowienia, wystąpił błąd "let rec" + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Następujące wymagane właściwości muszą zostać zainicjowane:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Nieprawidłowy kod z możliwością wznowienia. W specyfikacji kodu z możliwością wznowienia wystąpił element "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Określ typ debugowania: full, portable, pdbonly. Wartość „{0}” jest wartością domyślną, jeśli nie określono typu debugowania, i umożliwia dołączenie debugera do działającego programu. Wartość „portable” określa format międzyplatformowy. Wartość „embedded” określa format międzyplatformowy osadzony w pliku wyjściowym. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Rezydentna usługa kompilacji nie została użyta, ponieważ wystąpił problem z komunikowaniem się z serwerem. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Wystąpił błąd podczas stosowania argumentów statycznych do udostępnionego typu + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Zestaw „{0}” ma atrybut TypeProviderAssembly z nieprawidłową wartością „{1}”. Wartość powinna być prawidłową nazwą zestawu + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Wystąpił błąd podczas stosowania argumentów statycznych dla podanej metody + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Zastosowanie elementu CallerMemberNameAttribute do parametru „{0}” nie odniesie żadnego skutku. Jest on przesłaniany przez element CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Używane do wprowadzania bloku kodu, który może generować wyjątek. Używane razem ze słowem kluczowym with lub finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index e6480e13025..63da6a667b1 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -539,7 +539,7 @@ whitespace relaxation - atenuação de espaço em branco + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - Um constructo genérico restrito ocorreu na especificação de código retomável + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - Ocorreu um "let rec" na especificação do código retomável + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - As seguintes propriedades necessárias precisam ser inicializadas:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Código inválido retomável. Ocorreu um "let rec" na especificação do código retomável + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Especificar tipo de depuração: completo, portátil, incorporado, somente PDB. ('{0}' será o padrão se nenhum tipo de depuração for especificado e permite anexar um depurador a um programa em execução; 'portátil' é um formato multiplataforma; 'incorporado' é um formato multiplataforma incorporado no arquivo de saída). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - O serviço de compilação residente não foi usado porque houve um problema de comunicação com o servidor. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Erro ao aplicar os argumentos estáticos a um tipo fornecido + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - O assembly '{0}' possui um atributo TypeProviderAssembly com valor inválido '{1}'. O valor deve ser um nome de assembly válido + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Ocorreu um erro ao aplicar os argumentos estáticos para um método fornecido + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - O CallerMemberNameAttribute aplicado ao parâmetro "{0}" não terá efeito. Ele é substituído pelo CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Usado para introduzir um bloco de código que pode gerar uma exceção. Usado junto com with ou finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 61c03885917..231bc83103b 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -539,7 +539,7 @@ whitespace relaxation - уменьшение строгости для пробелов + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - В спецификации возобновляемого кода возникла ограниченная универсальная конструкция + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - В спецификации возобновляемого кода возникла ошибка "let rec" + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Необходимо инициализировать следующие обязательные свойства:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Недопустимый возобновляемый код. В спецификации возобновляемого кода возникла ошибка "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Укажите тип отладки: full, portable, embedded, pdbonly (если тип отладки не указан, по умолчанию используется тип "{0}", позволяющий подключить отладчик к выполняющейся программе; тип portable представляет собой кроссплатформенный формат; тип embedded — кроссплатформенный формат, встроенный в выходной файл). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Служба резидентной компиляции не использовалась, поскольку возникла проблема при взаимодействии с сервером. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Ошибка при применении статических аргументов к предоставленному типу + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - У сборки "{0}" имеется атрибут TypeProviderAssembly с недопустимым значением "{1}". Значение должно представлять собой допустимое имя сборки + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Произошла ошибка при применении статических аргументов к предоставленному методу + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Атрибут CallerMemberNameAttribute, примененный для параметра "{0}", не будет действовать. Он будет переопределен атрибутом CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Используется для введения блока кода, который может создать исключение. Используется вместе с with или finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index 09c113ee3f1..a3bab7e5a92 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -539,7 +539,7 @@ whitespace relaxation - boşluk genişlemesi + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - Sürdürülebilir kod belirtiminde kısıtlanmış bir genel yapı oluştu + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - Sürdürülebilir kod belirtiminde 'let rec' oluştu + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - Aşağıdaki gerekli özelliklerin başlatılması gerekiyor:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - Geçersiz sürdürülebilir kod. Sürdürülebilir kod belirtiminde bir 'let rec' oluştu + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - Hata ayıklama türünü belirtin: full, portable, embedded, pdbonly. (Hata ayıklama türü belirtilmemişse '{0}' varsayılandır ve çalışan bir programa hata ayıklayıcı iliştirmeyi etkinleştirir. 'portable' bir çoklu platform biçimidir, 'embedded' çıkış dosyasına gömülü bir çoklu platform biçimidir). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - Sunucuyla iletişimde bir sorun oluştuğu için yerleşik derleme hizmeti kullanılmadı. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - Sağlanan türe statik bağımsız değişkenler uygulanırken bir hata oluştu + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - {0}' bütünleştirilmiş kodunun geçersiz '{1}' değerli TypeProviderAssembly özniteliği var. Bu değer geçerli bir bütünleştirilmiş kod adı olmalıdır + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - Sağlanan metoda statik bağımsız değişkenler uygulanırken bir sorun oluştu + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - {0}' parametresi için geçerli olan CallerMemberNameAttribute öğesinin hiçbir etkisi olmaz. CallerFilePathAttribute tarafından geçersiz kılındı. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - Özel durum oluşturabilen bir kod bloğunu tanıtmak için kullanılır. with veya finally ile birlikte kullanılır. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index d9573b5bed2..579ac9b79c3 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -539,7 +539,7 @@ whitespace relaxation - 空格松弛法 + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - 可恢复代码规范中发生受约束的泛型构造 + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - 可恢复代码规范中出现 "let rec" + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - 必须初始化以下必需属性: {0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - 可恢复代码无效。可恢复代码规范中出现 "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - 指定调试类型: full、portable、embedded、pdbonly。(若未指定调试类型,则默认为“{0}”,它允许将调试程序附加到正在运行的程序。"portable" 是跨平台格式,"embedded" 是嵌入到输出文件中的跨平台格式)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - 未使用驻留编译服务,因为与服务器通信时发生问题。 + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - 将静态参数应用于所提供类型时发生错误 + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - 程序集“{0}”的 TypeProviderAssembly 特性具有无效值“{1}”。该值应为有效的程序集名称 + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - 将静态参数应用于提供的方法时发生错误 + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - 应用于参数“{0}”的 CallerMemberNameAttribute 不会起作用。它已由 CallerFilePathAttribute 替代。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - 用于引入可能产生异常的代码块。与 with 或 finally 配合使用。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index 1a6c3de6ccf..09818a7487b 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -539,7 +539,7 @@ whitespace relaxation - 空白字元放寬 + whitespace relaxation @@ -1124,7 +1124,7 @@ A constrained generic construct occurred in the resumable code specification - 可繼續的程式碼規格中出現了限制式泛型建構 + A constrained generic construct occurred in the resumable code specification @@ -1139,7 +1139,7 @@ A 'let rec' occurred in the resumable code specification - 可繼續的程式碼規格中發生 'let rec' + A 'let rec' occurred in the resumable code specification @@ -1444,7 +1444,7 @@ The following required properties have to be initialized:{0} - 下列必要的屬性必須初始化:{0} + The following required properties have to be initialized:{0} @@ -1579,7 +1579,7 @@ Invalid resumable code. A 'let rec' occurred in the resumable code specification - 可繼續的程式碼無效。可繼續的程式碼規格中發生 'let rec' + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -5899,7 +5899,7 @@ Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). - 指定偵錯類型: full、portable、embedded、pdbonly。(如果未指定偵錯類型,即預設為 '{0}',並允許將偵錯工具附加到正在執行的程式,'portable' 為跨平台格式,'embedded' 為輸出檔案內嵌的跨平台格式)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging 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). @@ -7154,7 +7154,7 @@ The resident compilation service was not used because a problem occurred in communicating with the server. - 未使用常駐編譯服務,因為伺服器發生通訊問題。 + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7354,7 +7354,7 @@ An error occurred applying the static arguments to a provided type - 將靜態引數套用至提供的類型時發生錯誤 + An error occurred applying the static arguments to a provided type @@ -7419,7 +7419,7 @@ Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - 組件 '{0}' 的 TypeProviderAssembly 屬性值 '{1}' 無效。此值必須是有效的屬性名稱 + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -8004,7 +8004,7 @@ An error occurred applying the static arguments to a provided method - 將靜態引數套用至所提供的方法時,發生錯誤 + An error occurred applying the static arguments to a provided method @@ -8134,7 +8134,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - 套用至參數 '{0}' 的 CallerMemberNameAttribute 將不會有作用。CallerFilePathAttribute 會加以覆寫。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8449,7 +8449,7 @@ Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. - 用於引入可能會產生例外狀況的程式碼區塊。這會與 with 或 finally 並用。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. diff --git a/src/Compiler/xlf/FSStrings.cs.xlf b/src/Compiler/xlf/FSStrings.cs.xlf index 810091c59f0..86a6be9d7e0 100644 --- a/src/Compiler/xlf/FSStrings.cs.xlf +++ b/src/Compiler/xlf/FSStrings.cs.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} {1} se nedá definovat, protože název {2} a {3} {4} v tomto typu nebo modulu jsou v konfliktu. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.de.xlf b/src/Compiler/xlf/FSStrings.de.xlf index 12a7cc8d720..3b7f46a9769 100644 --- a/src/Compiler/xlf/FSStrings.de.xlf +++ b/src/Compiler/xlf/FSStrings.de.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} "{1}" kann nicht definiert werden, weil der Name "{2}" einen Konflikt mit {3} "{4}" in diesem Typ oder Modul verursacht. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.es.xlf b/src/Compiler/xlf/FSStrings.es.xlf index 85b2e6b1cd4..f2b6d8ed1ca 100644 --- a/src/Compiler/xlf/FSStrings.es.xlf +++ b/src/Compiler/xlf/FSStrings.es.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - No se puede definir el {0} '{1}' porque el nombre '{2}' está en conflicto con el {3} '{4}' de este tipo o módulo. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.fr.xlf b/src/Compiler/xlf/FSStrings.fr.xlf index b3627df28f8..f3621e55e63 100644 --- a/src/Compiler/xlf/FSStrings.fr.xlf +++ b/src/Compiler/xlf/FSStrings.fr.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Impossible de définir le {0} '{1}', car le nom '{2}' est en conflit avec le {3} '{4}' dans ce type ou module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.it.xlf b/src/Compiler/xlf/FSStrings.it.xlf index b042d7704b2..d67bbd27dca 100644 --- a/src/Compiler/xlf/FSStrings.it.xlf +++ b/src/Compiler/xlf/FSStrings.it.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Non è possibile definire {0} '{1}' perché il nome '{2}' è in conflitto con {3} '{4}' in questo tipo o modulo + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.ja.xlf b/src/Compiler/xlf/FSStrings.ja.xlf index 3b9c4d98e21..486c2fac349 100644 --- a/src/Compiler/xlf/FSStrings.ja.xlf +++ b/src/Compiler/xlf/FSStrings.ja.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 名前 '{2}' がこの型またはモジュールの {3} '{4}' と競合するため、{0} '{1}' を定義できません + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.ko.xlf b/src/Compiler/xlf/FSStrings.ko.xlf index 51c8cb1365f..506b9b9e2de 100644 --- a/src/Compiler/xlf/FSStrings.ko.xlf +++ b/src/Compiler/xlf/FSStrings.ko.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 이름 '{2}'이(가) 이 형식 또는 모듈의 {3} '{4}'과(와) 충돌하므로 {0} '{1}'을(를) 정의할 수 없습니다. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.pl.xlf b/src/Compiler/xlf/FSStrings.pl.xlf index 29e36ab5bc9..30f8155bfc8 100644 --- a/src/Compiler/xlf/FSStrings.pl.xlf +++ b/src/Compiler/xlf/FSStrings.pl.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Nie można zdefiniować elementu {0} „{1}”, ponieważ nazwa „{2}” powoduje konflikt z elementem {3} „{4}” w tym typie lub module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.pt-BR.xlf b/src/Compiler/xlf/FSStrings.pt-BR.xlf index b606d7339c5..cf7e3a94822 100644 --- a/src/Compiler/xlf/FSStrings.pt-BR.xlf +++ b/src/Compiler/xlf/FSStrings.pt-BR.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - O {0} '{1}' não pode ser definido porque o nome '{2}' conflita com {3} '{4}' neste tipo ou módulo + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.ru.xlf b/src/Compiler/xlf/FSStrings.ru.xlf index 6367fb6f835..34278a4b234 100644 --- a/src/Compiler/xlf/FSStrings.ru.xlf +++ b/src/Compiler/xlf/FSStrings.ru.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} "{1}" не удается определить, так как имя "{2}" конфликтует с {3} "{4}" в данном типе или модуле + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.tr.xlf b/src/Compiler/xlf/FSStrings.tr.xlf index 029b16cd9b5..a2601885c52 100644 --- a/src/Compiler/xlf/FSStrings.tr.xlf +++ b/src/Compiler/xlf/FSStrings.tr.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {2}' adı bu türde veya modülde {3} '{4}' ile çakıştığı için {0} '{1}' tanımlanamıyor + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.zh-Hans.xlf b/src/Compiler/xlf/FSStrings.zh-Hans.xlf index 54599b23672..66a54f3d2bb 100644 --- a/src/Compiler/xlf/FSStrings.zh-Hans.xlf +++ b/src/Compiler/xlf/FSStrings.zh-Hans.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 无法定义 {0}“{1}”,因为名称“{2}”与此类型或模块中的 {3}“{4}”冲突 + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/Compiler/xlf/FSStrings.zh-Hant.xlf b/src/Compiler/xlf/FSStrings.zh-Hant.xlf index c200aa576c1..35280cee60f 100644 --- a/src/Compiler/xlf/FSStrings.zh-Hant.xlf +++ b/src/Compiler/xlf/FSStrings.zh-Hant.xlf @@ -204,7 +204,7 @@ The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 無法定義 {0} '{1}',因為名稱 '{2}' 與這個類型或模組中的 {3} '{4}' 相衝突 + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module diff --git a/src/FSharp.Core/xlf/FSCore.cs.xlf b/src/FSharp.Core/xlf/FSCore.cs.xlf index 436ba705358..a122fa694dd 100644 --- a/src/FSharp.Core/xlf/FSCore.cs.xlf +++ b/src/FSharp.Core/xlf/FSCore.cs.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Dynamickému formátovacímu modulu byla předána chybná celočíselná hodnota. + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Chybný specifikátor formátu (přesnost) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.de.xlf b/src/FSharp.Core/xlf/FSCore.de.xlf index df2b28aaecb..28ad0276d47 100644 --- a/src/FSharp.Core/xlf/FSCore.de.xlf +++ b/src/FSharp.Core/xlf/FSCore.de.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Für den dynamischen Formatierer wurde ein ungültiger Integer bereitgestellt. + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Ungültiger Formatbezeichner (precision) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.es.xlf b/src/FSharp.Core/xlf/FSCore.es.xlf index a1e7d0f7fa8..55f8c1c965d 100644 --- a/src/FSharp.Core/xlf/FSCore.es.xlf +++ b/src/FSharp.Core/xlf/FSCore.es.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Se proporcionó un entero incorrecto a un formateador dinámico. + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Especificador de formato incorrecto (precisión). + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.fr.xlf b/src/FSharp.Core/xlf/FSCore.fr.xlf index ff8acfc83c4..a7499ae558b 100644 --- a/src/FSharp.Core/xlf/FSCore.fr.xlf +++ b/src/FSharp.Core/xlf/FSCore.fr.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Entier incorrect fourni au formateur dynamique + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Spécificateur de format incorrect (précision) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.it.xlf b/src/FSharp.Core/xlf/FSCore.it.xlf index 3643c1ce16c..a4abe452956 100644 --- a/src/FSharp.Core/xlf/FSCore.it.xlf +++ b/src/FSharp.Core/xlf/FSCore.it.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Intero non valido fornito al formattatore dinamico + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Identificatore di formato non valido (precision) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.ja.xlf b/src/FSharp.Core/xlf/FSCore.ja.xlf index 285dfb02872..147f7c018cd 100644 --- a/src/FSharp.Core/xlf/FSCore.ja.xlf +++ b/src/FSharp.Core/xlf/FSCore.ja.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - 動的フォーマッタに対して指定された整数が正しくありません + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - 書式指定子 (精度) が正しくありません + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.ko.xlf b/src/FSharp.Core/xlf/FSCore.ko.xlf index e5a88b267b0..8341b342f7a 100644 --- a/src/FSharp.Core/xlf/FSCore.ko.xlf +++ b/src/FSharp.Core/xlf/FSCore.ko.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - 동적 포맷터에 제공된 정수가 잘못되었습니다. + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - 잘못된 형식 지정자(전체 자릿수) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.pl.xlf b/src/FSharp.Core/xlf/FSCore.pl.xlf index a64948b4609..6ddd003084a 100644 --- a/src/FSharp.Core/xlf/FSCore.pl.xlf +++ b/src/FSharp.Core/xlf/FSCore.pl.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Do dynamicznego modułu formatującego została przekazana błędna liczba całkowita. + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Błędny specyfikator formatu (dokładności). + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.pt-BR.xlf b/src/FSharp.Core/xlf/FSCore.pt-BR.xlf index 591a8e6560f..956db72820d 100644 --- a/src/FSharp.Core/xlf/FSCore.pt-BR.xlf +++ b/src/FSharp.Core/xlf/FSCore.pt-BR.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Inteiro incorreto fornecido a formatador dinâmico + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Especificador de formato incorreto (precisão) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.ru.xlf b/src/FSharp.Core/xlf/FSCore.ru.xlf index edb281a0102..cb0ca39bd08 100644 --- a/src/FSharp.Core/xlf/FSCore.ru.xlf +++ b/src/FSharp.Core/xlf/FSCore.ru.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Динамическому форматтеру передано неверное целое + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Неверный спецификатор формата (точность) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.tr.xlf b/src/FSharp.Core/xlf/FSCore.tr.xlf index d0ab6c80129..b4c445d67ee 100644 --- a/src/FSharp.Core/xlf/FSCore.tr.xlf +++ b/src/FSharp.Core/xlf/FSCore.tr.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - Dinamik biçimlendiriciye yanlış tamsayı sağlandı + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - Hatalı biçim belirticisi (duyarlık) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.zh-Hans.xlf b/src/FSharp.Core/xlf/FSCore.zh-Hans.xlf index 498188f67af..dc922154be2 100644 --- a/src/FSharp.Core/xlf/FSCore.zh-Hans.xlf +++ b/src/FSharp.Core/xlf/FSCore.zh-Hans.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - 提供给动态格式化程序的整数错误 + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - 错误的格式说明符(精度) + Bad format specifier (precision) diff --git a/src/FSharp.Core/xlf/FSCore.zh-Hant.xlf b/src/FSharp.Core/xlf/FSCore.zh-Hant.xlf index 7e5727be136..9d2cb35be7a 100644 --- a/src/FSharp.Core/xlf/FSCore.zh-Hant.xlf +++ b/src/FSharp.Core/xlf/FSCore.zh-Hant.xlf @@ -564,7 +564,7 @@ Bad integer supplied to dynamic formatter - 提供給動態格式器的整數錯誤 + Bad integer supplied to dynamic formatter @@ -594,7 +594,7 @@ Bad format specifier (precision) - 不正確的格式修飾詞 (精確度) + Bad format specifier (precision) diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.cs.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.cs.xlf index 2f9b9728cd8..800c2e40248 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.cs.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.cs.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager se nemůže odkazovat na systémový balíček {0}. + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.de.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.de.xlf index 233c6a93dd3..f3762130515 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.de.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.de.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager kann nicht auf das Systempaket "{0}" verweisen. + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.es.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.es.xlf index 2f7b192634c..2851c230dab 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.es.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.es.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager no puede hacer referencia al paquete del sistema "{0}". + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.fr.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.fr.xlf index 5d83dfd795a..8ab1dccc35f 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.fr.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.fr.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager ne peut pas référencer le package système '{0}' + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.it.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.it.xlf index 9a40ea0246c..c605c4af3ba 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.it.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.it.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager non può fare riferimento al pacchetto di sistema '{0}' + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ja.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ja.xlf index 74a4a7a452c..2e19d06a10f 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ja.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ja.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager がシステム パッケージ '{0}' を参照できません + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ko.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ko.xlf index 9837ed7ad3a..01d252b6243 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ko.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ko.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager에서 시스템 패키지 '{0}'을(를) 참조할 수 없습니다. + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pl.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pl.xlf index 6b7b5475c99..4ae0d2e448e 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pl.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pl.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - Program PacketManager nie może odwoływać się do pakietu systemowego „{0}” + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pt-BR.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pt-BR.xlf index 2fb1ed02a8a..7e8409fd8d7 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pt-BR.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.pt-BR.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager não pode referenciar o pacote do sistema '{0}' + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ru.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ru.xlf index c1193b57c8b..dafbfb8243d 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ru.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.ru.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager не может ссылаться на системный пакет "{0}" + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.tr.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.tr.xlf index 5a870233d01..312793af714 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.tr.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.tr.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager, '{0}' Sistem Paketine başvuramıyor + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hans.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hans.xlf index 520ae8c35a4..7e04d921b0a 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hans.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hans.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager 无法引用系统包“{0}” + PackageManager cannot reference the System Package '{0}' diff --git a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hant.xlf b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hant.xlf index e8bde94aaff..d82293b0cf2 100644 --- a/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hant.xlf +++ b/src/FSharp.DependencyManager.Nuget/xlf/FSDependencyManager.txt.zh-Hant.xlf @@ -4,7 +4,7 @@ PackageManager cannot reference the System Package '{0}' - PackageManager 無法參考系統套件 '{0}' + PackageManager cannot reference the System Package '{0}' diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf index d43dc577c61..b969107b017 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Můžete upravit obsah elementu pole pomocí operátoru přiřazení s šipkou doleva. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Rozlišované sjednocení může také představovat hodnotu hrací karty. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Při vyjadřování dat se běžně používají záznamy i rozlišovaná sjednocení. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Rozlišovaná sjednocení podporují i rekurzivní definice. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf index a8a789025d7..e2023a345a0 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Sie können die Inhalte eines Arrayelements mithilfe des Zuweisungsoperators "Pfeil nach links" ändern. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Eine diskriminierte Union kann auch verwendet werden, um den Rang einer Spielkarte darzustellen. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Beim Darstellen von Daten werden häufig sowohl Datensätze als auch diskriminierte Unions verwendet. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Diskriminierte Unions unterstützen auch rekursive Definitionen. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf index 3041197dd6c..ce9964fbe25 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Puede modificar el contenido de un elemento de matriz mediante el operador de asignación de flecha izquierda. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - También se puede usar una unión discriminada para representar el rango de una carta. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Es habitual utilizar tanto registros como uniones discriminadas cuando se representan datos. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Las uniones discriminadas admiten también definiciones recursivas. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf index 79b126ad3f4..3c515e263e8 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Vous pouvez modifier le contenu d'un élément de tableau à l'aide de l'opérateur d'assignation flèche gauche. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Une union discriminée peut également servir à représenter le rang d'une carte à jouer. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Il est fréquent d'utiliser à la fois des enregistrements et des unions discriminées pour représenter des données. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Les unions discriminées prennent également en charge les définitions récursives. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf index 5b17d36350e..79c43274cc4 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - È possibile modificare il contenuto di un elemento di matrice usando l'operatore di assegnazione freccia sinistra. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - È possibile usare un'unione discriminata anche per rappresentare il valore di una carta da gioco. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Per la rappresentazione dei dati si usano in genere record e unioni discriminate. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Le unioni discriminate supportano anche definizioni ricorsive. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf index 3275255ba6a..33ba6422ea1 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - 左矢印代入演算子を使用して、配列要素の内容を変更できます。 + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - 判別共用体はトランプのランクを表すためにも使用できます。 + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - データを表すときには、レコードと判別共用体の両方を使用するのが一般的です。 + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - 判別共用体は再帰的な定義もサポートしています。 + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf index f6668949ef9..c5f198ffa1b 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - 왼쪽 화살표 대입 연산자를 사용하여 배열 요소의 내용을 수정할 수 있습니다. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - 구분된 공용 구조체를 사용하여 플레잉 카드의 순위를 나타낼 수도 있습니다. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - 일반적으로 레코드와 구분된 공용 구조체를 모두 사용하여 데이터를 나타냅니다. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - 구분된 공용 구조체는 재귀 정의도 지원합니다. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf index 80135046c87..5bdcd939c42 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Możesz zmodyfikować zawartość elementu tablicy za pomocą operatora przypisania „strzałka w lewo”. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Unii rozłącznej można również użyć do reprezentowania wartości karty do gry. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Często używa się rekordów i unii rozłącznych w przypadku reprezentowania danych. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Unie rozłączne obsługują również definicje rekursywne. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf index 433113974ba..736952384fc 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Você pode modificar o conteúdo de um elemento de matriz usando o operador de atribuição de seta para a esquerda. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Uma União Discriminada também pode ser usada para representar a classificação de uma carta de baralho. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - É comum usar Registros e Uniões Discriminadas ao representar dados. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Uniões Discriminadas também dão suporte a definições recursivas. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf index 21d0c088dd7..85b57d7d25a 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Изменить содержимое элемента массива можно с помощью оператора присваивания в виде стрелки влево. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Размеченное объединение также может использоваться для представления ранга игральной карты. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Как правило, при представлении данных используются как записи, так и размеченные объединения. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Размеченные объединения также поддерживают рекурсивные определения. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf index e16ddac1fd6..31a61d248a3 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - Bir dizi öğesinin içeriğini sol ok atama işlecini kullanarak değiştirebilirsiniz. + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - Bir iskambil kartının sırasını göstermek için bir Ayırt Edici Birleşim de kullanılabilir. + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - Verileri temsil ederken Kayıtları ve Ayırt Edici Birleşimleri birlikte kullanmak yaygındır. + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - Ayırt Edici Birleşimler ayrıca özyinelemeli tanımları da destekler. + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf index 070f72756fa..3520e8975c5 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - 可使用左箭头赋值运算符来修改数组元素的内容。 + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - 可区分联合还可用来表示纸牌的设置级别。 + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - 表示数据时同时使用记录和可区分联合是很常见的。 + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - 可区分联合还支持递归定义。 + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf index 9dc5b4cb19b..ceef6ffcd83 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf @@ -744,7 +744,7 @@ You can modify the contents of an array element by using the left arrow assignment operator. - 您可以使用向左鍵指派運算子來修改陣列元素的內容。 + You can modify the contents of an array element by using the left arrow assignment operator. @@ -1009,7 +1009,7 @@ A Discriminated Union can also be used to represent the rank of a playing card. - 差異聯集也可用以代表一張撲克牌的順位。 + A Discriminated Union can also be used to represent the rank of a playing card. @@ -1029,7 +1029,7 @@ It's common to use both Records and Discriminated Unions when representing data. - 代表資料時,通常會使用記錄與差異聯集。 + It's common to use both Records and Discriminated Unions when representing data. @@ -1089,7 +1089,7 @@ Discriminated Unions also support recursive definitions. - 差異聯集也支援遞迴定義。 + Discriminated Unions also support recursive definitions. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf index 918eaa00dd1..03000fae564 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Soubor {0} se nedá uložit, protože není otevřený v editoru. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.de.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.de.xlf index 2e55caa77b9..6fad4701b9b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.de.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - {0} kann nicht gespeichert werden, da sie nicht im Editor geöffnet ist. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.es.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.es.xlf index 653231ad5ac..be43129d5dd 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.es.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - No se puede guardar '{0}' mientras no esté abierto en el editor. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf index e9adf9f0495..d39840bf98d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Impossible d'enregistrer '{0}', car il n'est pas ouvert dans l'éditeur. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.it.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.it.xlf index 898ffd57a94..a670ee0b5eb 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.it.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Non è possibile salvare '{0}' perché non è aperto nell'editor. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf index 083d889314f..71c72fab37b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - '{0}' はエディターで開かれていないため、保存できません。 + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf index 55f3e53d51b..fe6c1427f3a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - '{0}'은(는) 편집기에 열려 있지 않으므로 저장할 수 없습니다. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf index 18625d46839..c04569fb685 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Nie można zapisać pliku „{0}”, ponieważ nie jest on otwarty w edytorze. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf index 9fa73a42708..3675c79cfac 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Não é possível salvar '{0}' porque não está aberto no editor. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf index 72a92f4a0da..05086731665 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - Не удается сохранить "{0}": файл не открыт в редакторе. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf index 54aaf598233..0951ab5fd9c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - '{0}' düzenleyicide açık olmadığından kaydedilemedi. + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf index ab86371cb21..43915ea3d1b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - 无法保存“{0}”,因为它未在编辑器中打开。 + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf index c0d9d60d48c..e1e78242403 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf @@ -79,7 +79,7 @@ Cannot save '{0}' as it is not open in the editor. - 因為 '{0}' 不是在編輯器中開啟的,所以無法儲存。 + Cannot save '{0}' as it is not open in the editor. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf index d21bda7ce61..25314d551e8 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Pro zobrazení operací služby vyberte její kontrakt. + Pro zobrazení operací služby vyberte její kontrakt. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf index 8708f62ecc4..26a027b9373 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Wählen Sie einen Dienstvertrag aus, um seine Abläufe anzuzeigen. + Wählen Sie einen Dienstvertrag aus, um seine Abläufe anzuzeigen. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf index 38b3575e7b2..f3cc2f9d02f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Seleccione un contrato de servicio para ver sus operaciones. + Seleccione un contrato de servicio para ver sus operaciones. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf index 114ba9c1282..45939fa9731 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Sélectionnez un contrat de service pour afficher ses opérations. + Sélectionnez un contrat de service pour afficher ses opérations. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf index 21ad2a8ed21..0c089a12fad 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Selezionare un contratto di servizio per visualizzarne le operazioni. + Selezionare un contratto di servizio per visualizzarne le operazioni. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ja.xlf index c9eb3786c4e..a8cf12c61fc 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ja.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - サービス コントラクトを選択して操作を表示します。 + サービス コントラクトを選択して操作を表示します。 This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf index 4034e9c1db5..1e50815dd99 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - 서비스 계약을 선택하여 해당 작업을 확인하세요. + 서비스 계약을 선택하여 해당 작업을 확인하세요. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf index 617b27ff745..3bba978e142 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Wybierz kontrakt usługi, aby wyświetlić jego operacje. + Wybierz kontrakt usługi, aby wyświetlić jego operacje. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf index 3192d1ed7d5..a4409c25843 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Selecione um contrato de serviço para exibir as operações. + Selecione um contrato de serviço para exibir as operações. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf index 0452ba7258a..59ca2f46eed 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - Чтобы просмотреть операции службы, выберете контракт службы. + Чтобы просмотреть операции службы, выберете контракт службы. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf index 26d060af8d0..e701e4334aa 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - İşlemlerini görüntülemek için bir hizmet sözleşmesi seçin. + İşlemlerini görüntülemek için bir hizmet sözleşmesi seçin. This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hans.xlf index cbdbf10daa2..a0d96560d7e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hans.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - 选择服务协定可查看其操作。 + 选择服务协定可查看其操作。 This is the message displayed when user selects non-contract nodes. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf index 7c896bf2e6c..bfc580c97b4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf @@ -159,7 +159,7 @@ Select a service contract to view its operations. - 選取要檢視其作業的服務合約。 + 選取要檢視其作業的服務合約。 This is the message displayed when user selects non-contract nodes. From e6854f5f8d81499742208bdf809bab50944d1d59 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 7 Oct 2024 18:43:13 +0200 Subject: [PATCH 34/37] Update TSAConfig.gdntsa --- eng/TSAConfig.gdntsa | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/TSAConfig.gdntsa b/eng/TSAConfig.gdntsa index 56d3d0d457a..f4621b68272 100644 --- a/eng/TSAConfig.gdntsa +++ b/eng/TSAConfig.gdntsa @@ -1,7 +1,7 @@ { "codebaseName": "FSharp-GitHub", "notificationAliases": [ - "mlinfraswat@microsoft.com" + "fsharp@microsoft.com" ], "codebaseAdmins": [ "EUROPE\\vlza", From 69fa88b1f7577e6efc5598854cc447887ed5b2e4 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Tue, 8 Oct 2024 11:38:39 +0200 Subject: [PATCH 35/37] 17.13 versioning (#17844) --- azure-pipelines.yml | 6 +++--- eng/Versions.props | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ee79daa9ebf..1e5aaebbdf9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,13 +29,13 @@ variables: # Should be 'current' release branch name, i.e. 'release/dev17.10' in dotnet/fsharp/refs/heads/main, 'release/dev17.10' in dotnet/fsharp/refs/heads/release/dev17.10 and 'release/dev17.9' in dotnet/fsharp/refs/heads/release/dev17.9 # Should **never** be 'main' in dotnet/fsharp/refs/heads/main, since it will start inserting to VS twice. - name: FSharpReleaseBranchName - value: release/dev17.12 + value: release/dev17.13 # VS Insertion branch name (NOT the same as F# branch) # Should be previous release branch or 'main' in 'main' and 'main' in release branch # (since for all *new* release branches we insert into VS main and for all *previous* releases we insert into corresponding VS release), # i.e. 'rel/d17.9' *or* 'main' in dotnet/fsharp/refs/heads/main and 'main' in F# dotnet/fsharp/refs/heads/release/dev17.10 (latest release branch) - name: VSInsertionTargetBranchName - value: rel/d17.12 + value: main - name: _TeamName value: FSharp - name: TeamName @@ -88,7 +88,7 @@ extends: # Signed build # #-------------------------------------------------------------------------------------------------------------------# # Localization: we only run it for specific release branches - - ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/release/dev17.12') }}: + - ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/release/dev17.13') }}: - template: /eng/common/templates-official/job/onelocbuild.yml@self parameters: MirrorRepo: fsharp diff --git a/eng/Versions.props b/eng/Versions.props index 614ced1604c..d89aec3f3cd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -43,7 +43,7 @@ $(FSCorePackageVersionValue)-$(PreReleaseVersionLabel).* - 12 + 13 9 $(FSBuildVersion) $(FSRevisionVersion) @@ -53,7 +53,7 @@ 17 - 12 + 13 $(VSMajorVersion).0 $(VSMajorVersion).$(VSMinorVersion).0 $(VSAssemblyVersionPrefix).0 From 2109d5d1294ee36bd84ffa829c9729a2debedfdc Mon Sep 17 00:00:00 2001 From: Martin <29605222+Martin521@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:02:20 +0200 Subject: [PATCH 36/37] fix parsing table cache bug (#17816) --- src/Compiler/Facilities/prim-parsing.fs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Compiler/Facilities/prim-parsing.fs b/src/Compiler/Facilities/prim-parsing.fs index bb61e76e5f3..7fb0d7fca41 100644 --- a/src/Compiler/Facilities/prim-parsing.fs +++ b/src/Compiler/Facilities/prim-parsing.fs @@ -151,7 +151,10 @@ module internal Implementation = //------------------------------------------------------------------------- // Read the tables written by FSYACC. - type AssocTable(elemTab: uint16[], offsetTab: uint16[], cache: int[], cacheSize: int) = + type AssocTable(elemTab: uint16[], offsetTab: uint16[], cache: int[]) = + + do Array.fill cache 0 cache.Length -1 + let cacheSize = cache.Length / 2 member t.ReadAssoc(minElemNum, maxElemNum, defaultValueOfAssoc, keyToFind) = // do a binary chop on the table @@ -273,13 +276,8 @@ module internal Implementation = let lhsPos = (Array.zeroCreate 2: Position[]) let reductions = tables.reductions let cacheSize = 7919 // the 1000'th prime - // Use a simpler hash table with faster lookup, but only one - // hash bucket per key. let actionTableCache = ArrayPool.Shared.Rent(cacheSize * 2) let gotoTableCache = ArrayPool.Shared.Rent(cacheSize * 2) - // Clear the arrays since ArrayPool does not - Array.Clear(actionTableCache, 0, actionTableCache.Length) - Array.Clear(gotoTableCache, 0, gotoTableCache.Length) use _cacheDisposal = { new IDisposable with @@ -289,10 +287,10 @@ module internal Implementation = } let actionTable = - AssocTable(tables.actionTableElements, tables.actionTableRowOffsets, actionTableCache, cacheSize) + AssocTable(tables.actionTableElements, tables.actionTableRowOffsets, actionTableCache) let gotoTable = - AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets, gotoTableCache, cacheSize) + AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets, gotoTableCache) let stateToProdIdxsTable = IdxToIdxListTable(tables.stateToProdIdxsTableElements, tables.stateToProdIdxsTableRowOffsets) From cffc9bf737138f6ecb585f67fdb0ca1b68eaa31c Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 8 Oct 2024 11:54:52 +0100 Subject: [PATCH 37/37] Regression test for #14304 (#17839) --- .../AttributeUsage/AttributeUsage.fs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs index f6d8a0cc530..9b7cdc5a053 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AttributeUsage.fs @@ -933,3 +933,36 @@ and [] |> verifyCompile |> shouldSucceed #endif + + [] // Regression for https://github.com/dotnet/fsharp/issues/14304 + let ``Construct an object with default and params parameters using parameterless constructor`` () = + Fsx """ +open System +open System.Runtime.InteropServices + +type DefaultAndParams([]x: int, [] value: string[]) = + inherit Attribute() + +type ParamsOnly([] value: string[]) = + inherit Attribute() + +type DefaultOnly([]x: int) = + inherit Attribute() + +[] +type Q1 = struct end + +[] // ok +type Q11 = struct end + +[] // ok +type Q12 = struct end + +[] +type Q2 = struct end + +[] +type Q3 = struct end + """ + |> typecheck + |> shouldSucceed \ No newline at end of file