Skip to content

Commit ad0743b

Browse files
committed
Add trivia and service test
1 parent 6dbd749 commit ad0743b

File tree

7 files changed

+49
-15
lines changed

7 files changed

+49
-15
lines changed

src/Compiler/Checking/CheckExpressions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5467,7 +5467,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE
54675467
TcNonControlFlowExpr env <| fun env ->
54685468
CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy.Commit, env.AccessRights)
54695469
TcConstExpr cenv overallTy env m tpenv synConst
5470-
| SynExpr.DotLambda (synExpr, m) ->
5470+
| SynExpr.DotLambda (synExpr, m, _) ->
54715471
let unaryArg = mkSynId m (cenv.synArgNameGenerator.New())
54725472
let svar = mkSynCompGenSimplePatVar unaryArg
54735473
let pushedExpr = pushUnaryArg synExpr unaryArg

src/Compiler/SyntaxTree/SyntaxTree.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ type SynExpr =
611611

612612
| DotGet of expr: SynExpr * rangeOfDot: range * longDotId: SynLongIdent * range: range
613613

614-
| DotLambda of expr: SynExpr * range: range
614+
| DotLambda of expr: SynExpr * range: range * trivia: SynExprDotLambdaTrivia
615615

616616
| DotSet of targetExpr: SynExpr * longDotId: SynLongIdent * rhsExpr: SynExpr * range: range
617617

src/Compiler/SyntaxTree/SyntaxTree.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ type SynExpr =
767767
| DotGet of expr: SynExpr * rangeOfDot: range * longDotId: SynLongIdent * range: range
768768

769769
/// F# syntax: _.ident.ident
770-
| DotLambda of expr: SynExpr * range: range
770+
| DotLambda of expr: SynExpr * range: range * trivia: SynExprDotLambdaTrivia
771771

772772
/// F# syntax: expr.ident...ident <- expr
773773
| DotSet of targetExpr: SynExpr * longDotId: SynLongIdent * rhsExpr: SynExpr * range: range

src/Compiler/SyntaxTree/SyntaxTrivia.fs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ type SynExprLambdaTrivia =
7575

7676
static member Zero: SynExprLambdaTrivia = { ArrowRange = None }
7777

78+
[<NoEquality; NoComparison>]
79+
type SynExprDotLambdaTrivia =
80+
{
81+
UnderscoreRange : range
82+
DotRange : range
83+
}
84+
7885
[<NoEquality; NoComparison>]
7986
type SynExprLetOrUseTrivia = { InKeyword: range option }
8087

src/Compiler/SyntaxTree/SyntaxTrivia.fsi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ type SynExprLambdaTrivia =
119119

120120
static member Zero: SynExprLambdaTrivia
121121

122+
/// Represents additional information for SynExpr.DotLambda
123+
[<NoEquality; NoComparison>]
124+
type SynExprDotLambdaTrivia =
125+
{
126+
UnderscoreRange : range
127+
DotRange : range
128+
}
129+
122130
/// Represents additional information for SynExpr.LetOrUse
123131
[<NoEquality; NoComparison>]
124132
type SynExprLetOrUseTrivia =

src/Compiler/pars.fsy

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4307,9 +4307,11 @@ argExpr:
43074307

43084308
atomicExpr:
43094309
| UNDERSCORE DOT atomicExpr %prec dot_lambda
4310-
{ let arg1 = lhs parseState
4311-
let arg2, hpa = $3
4312-
SynExpr.DotLambda(arg2, arg2.Range), false }
4310+
{ let arg1 = rhs parseState 1
4311+
let arg2 = rhs parseState 2
4312+
let arg3, hpa = $3
4313+
let trivia: SynExprDotLambdaTrivia = { UnderscoreRange = arg1; DotRange = arg2 }
4314+
SynExpr.DotLambda(arg3, unionRanges arg1 arg3.Range, trivia), false }
43134315

43144316
| atomicExpr HIGH_PRECEDENCE_BRACK_APP atomicExpr
43154317
{ let arg1, _ = $1

tests/service/SyntaxTreeTests/ExpressionTests.fs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ open FSharp.Compiler.Service.Tests.Common
44
open FSharp.Compiler.Syntax
55
open FSharp.Compiler.SyntaxTrivia
66
open NUnit.Framework
7-
8-
open Xunit
9-
// [<Fact>]
10-
// let ``Thomas`` () =
11-
// let ast = """_.ToString.ToString "b" """ |> getParseResults
12-
// let ast = """_.x""" |> getParseResults
13-
// let ast = """_.x()""" |> getParseResults
14-
// Assert.Fail (ast.ToString())
15-
167
[<Test>]
178
let ``SynExpr.Do contains the range of the do keyword`` () =
189
let ast = """let a =
@@ -502,3 +493,29 @@ type CFoo() =
502493
assertRange (7,4) (7, 67) m
503494
| _ -> Assert.Fail $"Could not get valid AST, got {ast}"
504495

496+
[<Test>]
497+
let ``SynExpr.DotLambda has correct ranges and trivia`` () =
498+
let ast =
499+
getParseResults """
500+
let e1 : obj [] -> string = _(*test*).(*test*)[5].ToString()
501+
"""
502+
503+
match ast with
504+
| ParsedInput.ImplFile(ParsedImplFileInput(contents = [
505+
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
506+
SynModuleDecl.Let(bindings =
507+
[SynBinding.SynBinding(expr =
508+
SynExpr.Typed(expr =
509+
SynExpr.DotLambda(
510+
SynExpr.App(range = innerRange),
511+
dlRange,
512+
{ UnderscoreRange = urange; DotRange = dRange }
513+
)))])
514+
])
515+
])) ->
516+
assertRange (2, 28) (2, 60) dlRange
517+
assertRange (2, 28) (2, 29) urange
518+
assertRange (2, 37) (2, 38) dRange
519+
assertRange (2, 46) (2, 60) innerRange
520+
Assert.Pass()
521+
| _ -> Assert.Fail $"Could not get valid AST, got {ast}"

0 commit comments

Comments
 (0)