diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md index 7d4162f804..8e55f0e3b6 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md @@ -1,5 +1,6 @@ ### Fixed +* Suppress hover/symbol resolution for wildcard `_` patterns inside `member _.…` bodies that incorrectly showed `val _: T` tooltip. ([PR #19760](https://github.com/dotnet/fsharp/pull/19760)) * Honor `--nowarn` and `--warnaserror` for warnings emitted during command-line option parsing ([Issue #19576](https://github.com/dotnet/fsharp/issues/19576), [PR #19776](https://github.com/dotnet/fsharp/pull/19776)) * Fix `[]` prefix attributes being silently dropped on class members, and fix false-positive `AllowMultiple=false` errors when `[]` and `[]` are applied to the same binding. ([Issue #17904](https://github.com/dotnet/fsharp/issues/17904), [Issue #19020](https://github.com/dotnet/fsharp/issues/19020), [PR #19738](https://github.com/dotnet/fsharp/pull/19738)) * Fix attributes on return type of unparenthesized tuple methods being silently dropped from IL. ([Issue #462](https://github.com/dotnet/fsharp/issues/462), [PR #19714](https://github.com/dotnet/fsharp/pull/19714)) diff --git a/src/Compiler/Service/FSharpCheckerResults.fs b/src/Compiler/Service/FSharpCheckerResults.fs index 6e9c1ced07..271d9ae25e 100644 --- a/src/Compiler/Service/FSharpCheckerResults.fs +++ b/src/Compiler/Service/FSharpCheckerResults.fs @@ -1631,11 +1631,18 @@ type internal TypeCheckInfo | None -> ValueNone | _ -> ValueNone + // Wildcard _ should not resolve to the member's synthetic self-identifier via fallback. + let isDiscardIdentifier = + match residueOpt, origLongIdentOpt with + | None, Some [ "_" ] -> true + | _ -> false + match nameResItems with | NameResResult.Cancel(denv, m) -> Some([], denv, m) | NameResResult.Members(FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m)) -> // lookup based on name resolution results successful Some(items |> List.map (CompletionItem (getType ()) ValueNone), denv, m) + | _ when isDiscardIdentifier -> None | _ -> match origLongIdentOpt with | None -> None diff --git a/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs b/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs index 2947e09f56..9742daf0bf 100644 --- a/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs +++ b/tests/FSharp.Compiler.Service.Tests/TooltipTests.fs @@ -399,6 +399,9 @@ let assertNameTagInTooltip expectedTag expectedName (tooltip: ToolTipText) = let desc = tags |> Array.map (fun t -> sprintf "(%A, %s)" t.Tag t.Text) |> String.concat ", " Assert.True(found, sprintf "Expected tag %A with text '%s' in tooltip, but found: %s" expectedTag expectedName desc) +let assertToolTipIsEmpty (ToolTipText(items)) = + Assert.Empty items + let normalize (s: string) = s.Replace("\r\n", "\n").Replace("\n\n", "\n") [] @@ -594,6 +597,43 @@ let y = normaliz{caret}e' 5 |> assertAndGetSingleToolTipText |> Assert.shouldBeEquivalentTo "val normalize': x: int -> int" +[] +let ``Wildcard lambda parameter inside member with underscore instance identifier has no tooltip`` () = + Checker.getTooltip """ +type T () = + member _.M () = + fun _{caret} -> () +""" + |> assertToolTipIsEmpty + +[] +let ``Wildcard let binding inside member with underscore instance identifier has no tooltip`` () = + Checker.getTooltip """ +type T () = + member _.N () = + let _{caret} = () in () +""" + |> assertToolTipIsEmpty + +[] +let ``Wildcard match pattern inside member with underscore instance identifier has no tooltip`` () = + Checker.getTooltip """ +type T () = + member _.M (x: int) = + match x with + | _{caret} -> () +""" + |> assertToolTipIsEmpty + +[] +let ``Named self-identifier is not affected by wildcard discard fix`` () = + Checker.getTooltip """ +type T () = + member thi{caret}s.M () = () +""" + |> assertAndGetSingleToolTipText + |> Assert.shouldContain "T" + // https://github.com/dotnet/fsharp/issues/13194 [] let ``Sig file XML doc fallback works for member whose name contains a single quote`` () =