dotnet / dotnet/fsharp

False positive `Open declaration can be removed` when using extension for builder

Open
#16,227 0 comments 2 reactions 0 assignees View on GitHub
Area-LangService-CodeFixes Bug Impact-Low
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 11h
Merged PRs (30d)
131

Description

Here is the half-done `maybe` CE
**Repro steps**

Here is the half-done `maybe` CE, extension for it that adds Bind-overload and usage attempt:
```fsharp
namespace Case1

module MaybeBuilder =

type MaybeBuilder() =
member inline _.Bind(optionValue: 'T option, f) =
match optionValue with
| None -> None
| Some value -> f value

member inline _.Return maybeNull =
if isNull maybeNull then None else Some maybeNull

member inline _.Delay f = f

member inline _.Run f = f()

let maybe = MaybeBuilder()

module MaybeBuilderExtension =

open MaybeBuilder

type MaybeBuilder with
member inline _.Bind(maybeNull: 'T, f) =
if isNull maybeNull then None else f maybeNull

module Usage =
open MaybeBuilder
open MaybeBuilderExtension // TODO: false positive

let foo (s: string) =
maybe {
let! a = s
return a
}
```

Visual Studio marks `open MaybeBuilderExtension` as safe to remove.
![2023-11-03_233943](https://github.com/dotnet/fsharp/assets/44954031/039dcb41-d880-4ded-ae59-9037a4f330f9)

However it would break compilation of code because we actually use `Bind` from extension.

**Expected behavior**

`open` for builder extension isn't marked as unnecessary.

**Actual behavior**

It's marked as unnecessary.

**Known workarounds**
.

**Related information**

.NET SDK: 7.0.403
Visual Studio 17.7.6

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.