Skip to content

Commit db4ad94

Browse files
DedSec256psfinaki
andauthored
Fix reporting IsFromComputationExpression for inappropriate symbols (#17375)
* wip * simplify * release notes * . * release notes --------- Co-authored-by: Petr <[email protected]>
1 parent 2eab49c commit db4ad94

File tree

4 files changed

+64
-6
lines changed

4 files changed

+64
-6
lines changed

docs/release-notes/.FSharp.Compiler.Service/9.0.100.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
### Fixed
22

33
* 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))
4+
* Fix reporting IsFromComputationExpression only for CE builder type constructors and let bindings. ([PR #17375](https://github.com/dotnet/fsharp/pull/17375))
45

56
### Added
67

src/Compiler/Checking/CheckComputationExpressions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ let TcComputationExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (mWhol
252252
// An unparameterized custom builder, e.g., `query`, `async`.
253253
| Expr.Val(vref, _, m)
254254
// A parameterized custom builder, e.g., `builder<…>`, `builder ()`.
255-
| Expr.App(funcExpr = Expr.Val(vref, _, m)) ->
255+
| Expr.App(funcExpr = Expr.Val(vref, _, m)) when not vref.IsMember || vref.IsConstructor ->
256256
let item = Item.CustomBuilder(vref.DisplayName, vref)
257257
CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights)
258258
valRefEq cenv.g vref cenv.g.query_value_vref

tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,20 @@ let _pythags = seqbuilder {{
135135
|> FSharp
136136
|> typecheck
137137
|> shouldSucceed
138+
139+
[<Fact>]
140+
let ``A CE returned from type member succeeds``() =
141+
FSharp """
142+
module ComputationExpressionTests
143+
type Builder () =
144+
member _.Bind(x, f) = f x
145+
member _.Return(x) = x
146+
147+
type A =
148+
static member Prop = Builder ()
149+
150+
let x = A.Prop { return 0 }
151+
"""
152+
|> compile
153+
|> shouldSucceed
154+
|> ignore

tests/FSharp.Compiler.Service.Tests/Symbols.fs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module FSharp.Compiler.Service.Tests.Symbols
22

3-
open System
43
open FSharp.Compiler.CodeAnalysis
54
open FSharp.Compiler.Service.Tests.Common
65
open FSharp.Compiler.Symbols
@@ -1090,19 +1089,32 @@ let builder = Builder ()
10901089
let x = builder { return 3 }
10911090
let y = builder
10921091
let z = Builder () { return 3 }
1092+
1093+
type A () =
1094+
let builder = Builder ()
1095+
let _ = builder { return 3 }
1096+
1097+
static member Builder = Builder ()
1098+
1099+
type System.Object with
1100+
static member Builder = Builder ()
1101+
1102+
let c = A.Builder { return 3 }
1103+
let d = System.Object.Builder { return 3 }
10931104
"""
1105+
shouldEqual checkResults.Diagnostics [||]
10941106

10951107
shouldEqual
10961108
[
10971109
// type Builder () =
10981110
(2, 5), false
10991111

1100-
// … = Builder ()
1101-
(6, 14), false
1102-
11031112
// let builder = …
11041113
(6, 4), false
11051114

1115+
// … = Builder ()
1116+
(6, 14), false
1117+
11061118
// let x = builder { return 3 }
11071119
(8, 8), false // Item.Value _
11081120
(8, 8), true // Item.CustomBuilder _
@@ -1112,9 +1124,37 @@ let z = Builder () { return 3 }
11121124

11131125
// let z = Builder () { return 3 }
11141126
(10, 8), false
1127+
1128+
// let builder = …
1129+
(13, 8), false
1130+
1131+
// … = Builder ()
1132+
(13, 18), false
1133+
1134+
// let x = builder { return 3 }
1135+
(14, 12), false // Item.Value _
1136+
(14, 12), true // Item.CustomBuilder _
1137+
1138+
// static member Builder = …
1139+
(16, 18), false
1140+
1141+
// … = Builder ()
1142+
(16, 28), false
1143+
1144+
// static member Builder = …
1145+
(19, 18), false
1146+
1147+
// … = Builder ()
1148+
(19, 28), false
1149+
1150+
// A.Builder { return 3 }
1151+
(21, 8), false
1152+
1153+
// System.Object.Builder { return 3 }
1154+
(22, 8), false
11151155
]
11161156
[
1117-
for symbolUse in checkResults.GetAllUsesOfAllSymbolsInFile() do
1157+
for symbolUse in checkResults.GetAllUsesOfAllSymbolsInFile() |> Seq.sortBy (fun x -> x.Range.StartLine, x.Range.StartColumn) do
11181158
match symbolUse.Symbol.DisplayName with
11191159
| "Builder" | "builder" -> (symbolUse.Range.StartLine, symbolUse.Range.StartColumn), symbolUse.IsFromComputationExpression
11201160
| _ -> ()

0 commit comments

Comments
 (0)