Skip to content

Commit 10c803f

Browse files
authored
Merge pull request #12705 from dotnet/merges/main-to-release/dev17.2
Merge main to release/dev17.2
2 parents 8f0e95e + e9c26ff commit 10c803f

File tree

7 files changed

+88
-13
lines changed

7 files changed

+88
-13
lines changed

src/fsharp/SyntaxTree.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -953,9 +953,9 @@ type SynExprAndBang =
953953
isUse: bool *
954954
isFromSource: bool *
955955
pat: SynPat *
956-
equalsRange: range *
957956
body: SynExpr *
958-
range: range
957+
range: range *
958+
trivia: SynExprAndBangTrivia
959959

960960
[<NoEquality; NoComparison>]
961961
type SynExprRecordField =

src/fsharp/SyntaxTree.fsi

+2-2
Original file line numberDiff line numberDiff line change
@@ -1066,9 +1066,9 @@ type SynExprAndBang =
10661066
isUse: bool *
10671067
isFromSource: bool *
10681068
pat: SynPat *
1069-
equalsRange: range *
10701069
body: SynExpr *
1071-
range: range
1070+
range: range *
1071+
trivia: SynExprAndBangTrivia
10721072

10731073
[<NoEquality; NoComparison>]
10741074
type SynExprRecordField =

src/fsharp/SyntaxTrivia.fs

+5
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,8 @@ type SynMemberFlagsTrivia =
8181
AbstractRange = None
8282
StaticRange = None
8383
DefaultRange = None }
84+
85+
[<NoEquality; NoComparison>]
86+
type SynExprAndBangTrivia =
87+
{ EqualsRange: range
88+
InKeyword: range option }

src/fsharp/SyntaxTrivia.fsi

+10
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,13 @@ type SynMemberFlagsTrivia =
138138
DefaultRange: range option
139139
}
140140
static member Zero: SynMemberFlagsTrivia
141+
142+
/// Represents additional information for SynExprAndBang
143+
[<NoEquality; NoComparison>]
144+
type SynExprAndBangTrivia =
145+
{
146+
/// The syntax range of the `=` token.
147+
EqualsRange: range
148+
/// The syntax range of the `in` keyword.
149+
InKeyword: range option
150+
}

src/fsharp/pars.fsy

+5-4
Original file line numberDiff line numberDiff line change
@@ -3600,16 +3600,17 @@ moreBinders:
36003600
| AND_BANG headBindingPattern EQUALS typedSequentialExprBlock IN moreBinders %prec expr_let
36013601
{ let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *)
36023602
let mEquals = rhs parseState 3
3603-
let m = rhs parseState 1 (* TODO Pretty sure this is wrong *)
3604-
SynExprAndBang(spBind, $1, true, $2, mEquals, $4, m) :: $6 }
3603+
let m = unionRanges (rhs parseState 1) $4.Range
3604+
let mIn = rhs parseState 5
3605+
SynExprAndBang(spBind, $1, true, $2, $4, m, { EqualsRange = mEquals; InKeyword = Some mIn }) :: $6 }
36053606

36063607
| OAND_BANG headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP moreBinders %prec expr_let
36073608
{ let report, mIn = $5
36083609
report "and!" (rhs parseState 1) // report unterminated error
36093610
let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *)
36103611
let mEquals = rhs parseState 3
3611-
let m = rhs parseState 1 (* TODO Pretty sure this is wrong *)
3612-
SynExprAndBang(spBind, $1, true, $2, mEquals, $4, m) :: $7 }
3612+
let m = unionRanges (rhs parseState 1) $4.Range
3613+
SynExprAndBang(spBind, $1, true, $2, $4, m, { EqualsRange = mEquals; InKeyword = mIn }) :: $7 }
36133614

36143615
| %prec prec_no_more_attr_bindings
36153616
{ [] }

tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected

+10-3
Original file line numberDiff line numberDiff line change
@@ -7052,11 +7052,11 @@ FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.DebugPointAtBindin
70527052
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.DebugPointAtBinding get_debugPoint()
70537053
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExpr body
70547054
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExpr get_body()
7055-
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExprAndBang NewSynExprAndBang(FSharp.Compiler.Syntax.DebugPointAtBinding, Boolean, Boolean, FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
7055+
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExprAndBang NewSynExprAndBang(FSharp.Compiler.Syntax.DebugPointAtBinding, Boolean, Boolean, FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia)
70567056
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynPat get_pat()
70577057
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynPat pat
7058-
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range equalsRange
7059-
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range get_equalsRange()
7058+
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia get_trivia()
7059+
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia trivia
70607060
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range get_range()
70617061
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range range
70627062
FSharp.Compiler.Syntax.SynExprAndBang: Int32 Tag
@@ -9077,6 +9077,13 @@ FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOpti
90779077
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange()
90789078
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: System.String ToString()
90799079
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range)
9080+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia
9081+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: FSharp.Compiler.Text.Range EqualsRange
9082+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: FSharp.Compiler.Text.Range get_EqualsRange()
9083+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword
9084+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword()
9085+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: System.String ToString()
9086+
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range])
90809087
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia
90819088
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean IsElif
90829089
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean get_IsElif()

tests/service/Symbols.fs

+54-2
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ comp {
703703
SynModuleDecl.DoExpr(expr = SynExpr.App(argExpr =
704704
SynExpr.ComputationExpr(expr =
705705
SynExpr.LetOrUseBang(equalsRange = Some mLetBangEquals
706-
andBangs = [ SynExprAndBang(equalsRange = mAndBangEquals) ]))))
706+
andBangs = [ SynExprAndBang(trivia= { EqualsRange = mAndBangEquals }) ]))))
707707
])
708708
])) ->
709709
assertRange (3, 11) (3, 12) mLetBangEquals
@@ -3246,4 +3246,56 @@ let meh =
32463246
assertRange (7, 8) (7, 14) mMember3
32473247
| _ ->
32483248
Assert.Fail "Could not get valid AST"
3249-
3249+
3250+
module ComputationExpressions =
3251+
[<Test>]
3252+
let ``SynExprAndBang range starts at and! and ends after expression`` () =
3253+
let ast =
3254+
getParseResults """
3255+
async {
3256+
let! bar = getBar ()
3257+
3258+
and! foo = getFoo ()
3259+
3260+
return bar
3261+
}
3262+
"""
3263+
3264+
match ast with
3265+
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
3266+
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
3267+
SynModuleDecl.DoExpr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
3268+
SynExprAndBang(range = mAndBang)
3269+
]))))
3270+
])
3271+
])) ->
3272+
assertRange (5, 4) (5, 24) mAndBang
3273+
| _ ->
3274+
Assert.Fail "Could not get valid AST"
3275+
3276+
[<Test>]
3277+
let ``multiple SynExprAndBang have range that starts at and! and ends after expression`` () =
3278+
let ast =
3279+
getParseResults """
3280+
async {
3281+
let! bar = getBar ()
3282+
and! foo = getFoo () in
3283+
and! meh = getMeh ()
3284+
return bar
3285+
}
3286+
"""
3287+
3288+
match ast with
3289+
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
3290+
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
3291+
SynModuleDecl.DoExpr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
3292+
SynExprAndBang(range = mAndBang1; trivia={ InKeyword = Some mIn })
3293+
SynExprAndBang(range = mAndBang2)
3294+
]))))
3295+
])
3296+
])) ->
3297+
assertRange (4, 4) (4, 24) mAndBang1
3298+
assertRange (4, 25) (4, 27) mIn
3299+
assertRange (5, 4) (5, 24) mAndBang2
3300+
| _ ->
3301+
Assert.Fail "Could not get valid AST"

0 commit comments

Comments
 (0)