Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## [Unreleased]

### Changed

- Improve formatting of query expressions with join/on/into clauses. [#3156](https://github.com/fsprojects/fantomas/issues/3156)

### Fixed

- End of line comments after infix operators are preserved correctly. [#2287](https://github.com/fsprojects/fantomas/issues/2287)
Expand Down
26 changes: 26 additions & 0 deletions src/Fantomas.Core.Tests/ComputationExpressionTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2339,6 +2339,32 @@ aggregateResult {
}
"""

[<Test>]
let ``multiline ExprJoinIn does not use atCurrentColumn, 3156`` () =
formatSourceString
"""
query {
for persons in database do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
select (persons, result)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for persons in database do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
select (persons, result)
}
"""

[<Test>]
let ``line comment above SynExpr.LetOrUseBang`` () =
formatSourceString
Expand Down
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 @@ -135,6 +135,7 @@
<Compile Include="NullnessTests.fs" />
<Compile Include="AutoPropertiesTests.fs" />
<Compile Include="PrefixTests.fs" />
<Compile Include="QueryExpressionTests.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Fantomas.Core\Fantomas.Core.fsproj" />
Expand Down
316 changes: 316 additions & 0 deletions src/Fantomas.Core.Tests/QueryExpressionTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,316 @@
module Fantomas.Core.Tests.QueryExpressionTests

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

[<Test>]
let ``simple join`` () =
formatSourceString
"""
query {
for student in db.Student do
join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)
select (student, selection)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)
select (student, selection)
}
"""

[<Test>]
let ``groupJoin with on and into`` () =
formatSourceString
"""
query {
for student in db.Student do
groupJoin courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID) into g
for courseSelection in g do
join course in db.Course
on (courseSelection.CourseID = course.CourseID)
select (student.Name, course.CourseName)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
groupJoin courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID)
into g
for courseSelection in g do
join course in db.Course
on (courseSelection.CourseID = course.CourseID)
select (student.Name, course.CourseName)
}
"""

[<Test>]
let ``leftOuterJoin with on and into`` () =
formatSourceString
"""
query {
for student in db.Student do
leftOuterJoin selection in db.CourseSelection
on (student.StudentID = selection.StudentID) into result
for selection in result.DefaultIfEmpty() do
select (student, selection)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
leftOuterJoin selection in db.CourseSelection
on (student.StudentID = selection.StudentID)
into result
for selection in result.DefaultIfEmpty() do
select (student, selection)
}
"""

[<Test>]
let ``multiple joins`` () =
formatSourceString
"""
query {
for student in db.Student do
join courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID)
join course in db.Course
on (courseSelection.CourseID = course.CourseID)
select (student.Name, course.CourseName)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
join courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID)
join course in db.Course
on (courseSelection.CourseID = course.CourseID)
select (student.Name, course.CourseName)
}
"""

[<Test>]
let ``multiple left outer joins`` () =
formatSourceString
"""
query {
for student in db.Student do
leftOuterJoin courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID) into g1
for courseSelection in g1.DefaultIfEmpty() do
leftOuterJoin course in db.Course
on (courseSelection.CourseID = course.CourseID) into g2
for course in g2.DefaultIfEmpty() do
select (student.Name, course.CourseName)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
leftOuterJoin courseSelection in db.CourseSelection
on (student.StudentID = courseSelection.StudentID)
into g1
for courseSelection in g1.DefaultIfEmpty() do
leftOuterJoin course in db.Course
on (courseSelection.CourseID = course.CourseID)
into g2
for course in g2.DefaultIfEmpty() do
select (student.Name, course.CourseName)
}
"""

[<Test>]
let ``join with distinct`` () =
formatSourceString
"""
query {
for student in db.Student do
join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)
distinct
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)
distinct
}
"""

[<Test>]
let ``multiline join with on and into, 3156`` () =
formatSourceString
"""
query {
for persons in database do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
select (persons, result)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for persons in database do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
select (persons, result)
}
"""

[<Test>]
let ``groupBy with into`` () =
formatSourceString
"""
query {
for student in db.Student do
groupBy student.Age into g
select (g.Key, g.Count())
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
groupBy student.Age into g
select (g.Key, g.Count())
}
"""

[<Test>]
let ``groupValBy with into`` () =
formatSourceString
"""
query {
for student in db.Student do
groupValBy student.Name student.Age into g
select (g, g.Key, g.Count())
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do
groupValBy student.Name student.Age into g
select (g, g.Key, g.Count())
}
"""

[<Test>]
let ``blank lines between query statements are preserved`` () =
formatSourceString
"""
query {
for student in db.Student do

join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)

select (student, selection)
}
"""
config
|> prepend newline
|> should
equal
"""
query {
for student in db.Student do

join selection in db.CourseSelection
on (student.StudentID = selection.StudentID)

select (student, selection)
}
"""

[<Test>]
let ``nested query in async, 3156`` () =
formatSourceString
"""
let exampleCode
(database : dbContext)
(id : int)
: Async<ReturnType list> =
async {
return!
query {
for persons in database1 do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
for i in result.DefaultIfEmpty() do
select (a.LongIdName, a.AccountId)
distinct
}
|> AsyncExtensions.ToArrayAsync
|> Async.AwaitTask
}
"""
config
|> prepend newline
|> should
equal
"""
let exampleCode (database: dbContext) (id: int) : Async<ReturnType list> =
async {
return!
query {
for persons in database1 do
join items in database2
on ((persons.LongIdName, persons.LongerIdName) = (items.LongIdName, items.LongerIdName))
into result
for i in result.DefaultIfEmpty() do
select (a.LongIdName, a.AccountId)
distinct
}
|> AsyncExtensions.ToArrayAsync
|> Async.AwaitTask
}
"""
Loading