Skip to content

Commit

Permalink
Initial support of SynExpr.DotLambda.
Browse files Browse the repository at this point in the history
  • Loading branch information
nojaf committed Jul 4, 2023
1 parent 21bda5b commit 1cb489b
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 3 deletions.
3 changes: 2 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ Some common use cases include:

<!-- Versions -->
<PropertyGroup>
<FCSCommitHash>9c8b4192966e6554adc5dcc8973f2a23c8fa2722</FCSCommitHash>
<FCSRepo>tboby/fsharp-1</FCSRepo>
<FCSCommitHash>33aeee8b463b649e5caed356aab6d4f2bf6b73bf</FCSCommitHash>
<StreamJsonRpcVersion>2.8.28</StreamJsonRpcVersion>
<FSharpCoreVersion>6.0.1</FSharpCoreVersion>
</PropertyGroup>
Expand Down
7 changes: 5 additions & 2 deletions build.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,10 @@ let fsharpCompilerHash =
let xDoc = XElement.Load(__SOURCE_DIRECTORY__ </> "Directory.Build.props")
xDoc.XPathSelectElements("//FCSCommitHash") |> Seq.head |> (fun xe -> xe.Value)

let fcsRepo =
let xDoc = XElement.Load(__SOURCE_DIRECTORY__ </> "Directory.Build.props")
xDoc.XPathSelectElements("//FCSRepo") |> Seq.head |> (fun xe -> xe.Value)

let updateFileRaw (file: FileInfo) =
let lines = File.ReadAllLines file.FullName
let updatedLines =
Expand All @@ -213,8 +217,7 @@ let downloadCompilerFile commitHash relativePath =
file.Directory.Create()
let fs = file.Create()
let fileName = Path.GetFileName(relativePath)
let url =
$"https://raw.githubusercontent.com/dotnet/fsharp/{commitHash}/{relativePath}"
let url = $"https://raw.githubusercontent.com/{fcsRepo}/{commitHash}/{relativePath}"
let! response =
Http.AsyncRequestStream(
url,
Expand Down
50 changes: 50 additions & 0 deletions src/Fantomas.Core.Tests/DotLambdaTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module Fantomas.Core.Tests.DotLambdaTests

open NUnit.Framework
open FsUnit
open Fantomas.Core.Tests.TestHelpers

[<Test>]
let ``function call`` () =
formatSourceString
false
"""
let x = "a" |> _.ToString ()
"""
config
|> prepend newline
|> should
equal
"""
let x = "a" |> _.ToString()
"""

[<Test>]
let ``property call`` () =
formatSourceString
false
"""
let x = "a" |> _.Length
"""
config
|> prepend newline
|> should
equal
"""
let x = "a" |> _.Length
"""

[<Test>]
let ``property of function invocation`` () =
formatSourceString
false
"""
let c = _.ToString().Length
"""
config
|> prepend newline
|> should
equal
"""
let c = _.ToString ().Length
"""
1 change: 1 addition & 0 deletions src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
<Compile Include="CursorTests.fs" />
<Compile Include="MultipleDefineCombinationsTests.fs" />
<Compile Include="ParenthesesTests.fs" />
<Compile Include="DotLambdaTests.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Fantomas.Core\Fantomas.Core.fsproj" />
Expand Down
6 changes: 6 additions & 0 deletions src/Fantomas.Core/ASTTransformer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1557,6 +1557,12 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
|> Expr.IndexRange
| SynExpr.IndexFromEnd(e, _) -> ExprIndexFromEndNode(mkExpr creationAide e, exprRange) |> Expr.IndexFromEnd
| SynExpr.Typar(typar, _) -> mkSynTypar typar |> Expr.Typar
| SynExpr.DotLambda(
expr = e
trivia = { DotRange = mDot
UnderscoreRange = mUnderscore }) ->
ExprDotLambda(stn "_" mUnderscore, stn "." mDot, mkExpr creationAide e, exprRange)
|> Expr.DotLambda
| _ -> failwithf "todo for %A" e

let mkExprQuote creationAide isRaw e range : ExprQuoteNode =
Expand Down
6 changes: 6 additions & 0 deletions src/Fantomas.Core/CodePrinter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1557,6 +1557,11 @@ let genExpr (e: Expr) =
|> genNode node
| Expr.IndexFromEnd node -> !- "^" +> genExpr node.Expr |> genNode node
| Expr.Typar node -> genSingleTextNode node
| Expr.DotLambda node ->
genSingleTextNode node.Underscore
+> genSingleTextNode node.Dot
+> genExpr node.Expr
|> genNode node

let genQuoteExpr (node: ExprQuoteNode) =
genSingleTextNode node.OpenToken
Expand Down Expand Up @@ -2435,6 +2440,7 @@ let genAppWithLambda sep (node: ExprAppWithLambdaNode) =

let sepSpaceBeforeParenInFuncInvocation (functionExpr: Expr) (argExpr: Expr) ctx =
match functionExpr, argExpr with
| Expr.DotLambda _, _ -> ctx
| Expr.Constant _, _ -> sepSpace ctx
| ParenExpr _, _ -> sepSpace ctx
| UppercaseExpr, ParenExpr _ -> onlyIf ctx.Config.SpaceBeforeUppercaseInvocation sepSpace ctx
Expand Down
9 changes: 9 additions & 0 deletions src/Fantomas.Core/SyntaxOak.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1604,6 +1604,13 @@ type ExprIndexFromEndNode(expr: Expr, range) =
override val Children: Node array = [| Expr.Node expr |]
member val Expr = expr

type ExprDotLambda(underscore: SingleTextNode, dot: SingleTextNode, expr: Expr, range: range) =
inherit NodeBase(range)
override val Children: Node array = [| underscore; dot; Expr.Node expr |]
member val Underscore = underscore
member val Dot = dot
member val Expr = expr

[<RequireQualifiedAccess; NoEquality; NoComparison>]
type Expr =
| Lazy of ExprLazyNode
Expand Down Expand Up @@ -1668,6 +1675,7 @@ type Expr =
| IndexFromEnd of ExprIndexFromEndNode
| Typar of SingleTextNode
| Chain of ExprChain
| DotLambda of ExprDotLambda

static member Node(x: Expr) : Node =
match x with
Expand Down Expand Up @@ -1733,6 +1741,7 @@ type Expr =
| IndexFromEnd n -> n
| Typar n -> n
| Chain n -> n
| DotLambda n -> n

member e.HasParentheses: bool =
match e with
Expand Down

0 comments on commit 1cb489b

Please sign in to comment.