Skip to content

Commit

Permalink
Merge pull request #12705 from dotnet/merges/main-to-release/dev17.2
Browse files Browse the repository at this point in the history
Merge main to release/dev17.2
  • Loading branch information
dotnet-bot authored Feb 7, 2022
2 parents 8f0e95e + e9c26ff commit 10c803f
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -953,9 +953,9 @@ type SynExprAndBang =
isUse: bool *
isFromSource: bool *
pat: SynPat *
equalsRange: range *
body: SynExpr *
range: range
range: range *
trivia: SynExprAndBangTrivia

[<NoEquality; NoComparison>]
type SynExprRecordField =
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -1066,9 +1066,9 @@ type SynExprAndBang =
isUse: bool *
isFromSource: bool *
pat: SynPat *
equalsRange: range *
body: SynExpr *
range: range
range: range *
trivia: SynExprAndBangTrivia

[<NoEquality; NoComparison>]
type SynExprRecordField =
Expand Down
5 changes: 5 additions & 0 deletions src/fsharp/SyntaxTrivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,8 @@ type SynMemberFlagsTrivia =
AbstractRange = None
StaticRange = None
DefaultRange = None }

[<NoEquality; NoComparison>]
type SynExprAndBangTrivia =
{ EqualsRange: range
InKeyword: range option }
10 changes: 10 additions & 0 deletions src/fsharp/SyntaxTrivia.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,13 @@ type SynMemberFlagsTrivia =
DefaultRange: range option
}
static member Zero: SynMemberFlagsTrivia

/// Represents additional information for SynExprAndBang
[<NoEquality; NoComparison>]
type SynExprAndBangTrivia =
{
/// The syntax range of the `=` token.
EqualsRange: range
/// The syntax range of the `in` keyword.
InKeyword: range option
}
9 changes: 5 additions & 4 deletions src/fsharp/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -3600,16 +3600,17 @@ moreBinders:
| AND_BANG headBindingPattern EQUALS typedSequentialExprBlock IN moreBinders %prec expr_let
{ let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *)
let mEquals = rhs parseState 3
let m = rhs parseState 1 (* TODO Pretty sure this is wrong *)
SynExprAndBang(spBind, $1, true, $2, mEquals, $4, m) :: $6 }
let m = unionRanges (rhs parseState 1) $4.Range
let mIn = rhs parseState 5
SynExprAndBang(spBind, $1, true, $2, $4, m, { EqualsRange = mEquals; InKeyword = Some mIn }) :: $6 }

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

| %prec prec_no_more_attr_bindings
{ [] }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7052,11 +7052,11 @@ FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.DebugPointAtBindin
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.DebugPointAtBinding get_debugPoint()
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExpr body
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynExpr get_body()
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)
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)
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynPat get_pat()
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Syntax.SynPat pat
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range equalsRange
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range get_equalsRange()
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia get_trivia()
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia trivia
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range get_range()
FSharp.Compiler.Syntax.SynExprAndBang: FSharp.Compiler.Text.Range range
FSharp.Compiler.Syntax.SynExprAndBang: Int32 Tag
Expand Down Expand Up @@ -9077,6 +9077,13 @@ FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOpti
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange()
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: System.String ToString()
FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range)
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: FSharp.Compiler.Text.Range EqualsRange
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: FSharp.Compiler.Text.Range get_EqualsRange()
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword()
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: System.String ToString()
FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range])
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean IsElif
FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean get_IsElif()
Expand Down
56 changes: 54 additions & 2 deletions tests/service/Symbols.fs
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,7 @@ comp {
SynModuleDecl.DoExpr(expr = SynExpr.App(argExpr =
SynExpr.ComputationExpr(expr =
SynExpr.LetOrUseBang(equalsRange = Some mLetBangEquals
andBangs = [ SynExprAndBang(equalsRange = mAndBangEquals) ]))))
andBangs = [ SynExprAndBang(trivia= { EqualsRange = mAndBangEquals }) ]))))
])
])) ->
assertRange (3, 11) (3, 12) mLetBangEquals
Expand Down Expand Up @@ -3246,4 +3246,56 @@ let meh =
assertRange (7, 8) (7, 14) mMember3
| _ ->
Assert.Fail "Could not get valid AST"


module ComputationExpressions =
[<Test>]
let ``SynExprAndBang range starts at and! and ends after expression`` () =
let ast =
getParseResults """
async {
let! bar = getBar ()
and! foo = getFoo ()
return bar
}
"""

match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
SynExprAndBang(range = mAndBang)
]))))
])
])) ->
assertRange (5, 4) (5, 24) mAndBang
| _ ->
Assert.Fail "Could not get valid AST"

[<Test>]
let ``multiple SynExprAndBang have range that starts at and! and ends after expression`` () =
let ast =
getParseResults """
async {
let! bar = getBar ()
and! foo = getFoo () in
and! meh = getMeh ()
return bar
}
"""

match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
SynExprAndBang(range = mAndBang1; trivia={ InKeyword = Some mIn })
SynExprAndBang(range = mAndBang2)
]))))
])
])) ->
assertRange (4, 4) (4, 24) mAndBang1
assertRange (4, 25) (4, 27) mIn
assertRange (5, 4) (5, 24) mAndBang2
| _ ->
Assert.Fail "Could not get valid AST"

0 comments on commit 10c803f

Please sign in to comment.