Skip to content

Commit

Permalink
Correct body SynExpr of parsedData of Lambda when wildcards are invol…
Browse files Browse the repository at this point in the history
…ved. (#11781)

* Correct body SynExpr of parsedData of Lambda when wildcards are involved.

* Update ProjectAnalysisTest.

* update baselines

Co-authored-by: Don Syme <[email protected]>
  • Loading branch information
nojaf and Don Syme authored Jul 9, 2021
1 parent 3bc3870 commit 43f27c6
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 57 deletions.
13 changes: 9 additions & 4 deletions src/fsharp/SyntaxTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,15 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p =
let id = mkSynId m nm
let item = mkSynIdGet m nm
true, None, id, item
SynSimplePat.Id (id, altNameRefCell, isCompGen, false, false, id.idRange),
Some (fun e ->
let clause = SynMatchClause(p, None, e, m, DebugPointForTarget.No)
SynExpr.Match (DebugPointAtBinding.NoneAtInvisible, item, [clause], clause.Range))
let fn =
match p with
| SynPat.Wild _ -> None
| _ ->
Some (fun e ->
let clause = SynMatchClause(p, None, e, m, DebugPointForTarget.No)
SynExpr.Match (DebugPointAtBinding.NoneAtInvisible, item, [clause], clause.Range))

SynSimplePat.Id (id, altNameRefCell, isCompGen, false, false, id.idRange), fn

let appFunOpt funOpt x = match funOpt with None -> x | Some f -> f x

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
.assembly extern FSharp.Core
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:7:0:0
.ver 5:0:0:0
}
.assembly DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth
{
Expand All @@ -29,20 +29,20 @@
}
.mresource public FSharpSignatureData.DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth
{
// Offset: 0x00000000 Length: 0x0000027A
// Offset: 0x00000000 Length: 0x0000028D
}
.mresource public FSharpOptimizationData.DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth
{
// Offset: 0x00000280 Length: 0x000000BA
// Offset: 0x00000298 Length: 0x000000BA
}
.module DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth.exe
// MVID: {5EAD3E33-1475-D984-A745-0383333EAD5E}
// MVID: {60E47018-1475-D984-A745-03831870E460}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00B10000
// Image base: 0x07120000


// =============== CLASS MEMBERS DECLARATION ===================
Expand All @@ -58,15 +58,11 @@
.method assembly static void Invoke(object x,
int32 _arg1) cil managed
{
// Code size 3 (0x3)
.maxstack 5
.locals init ([0] int32 V_0)
// Code size 1 (0x1)
.maxstack 8
.language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
.line 100001,100001 : 0,0 'C:\\dev\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth.fs'
IL_0000: ldarg.1
IL_0001: stloc.0
.line 6,6 : 80,82 ''
IL_0002: ret
.line 6,6 : 80,82 'C:\\GitHub\\dsyme\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_ArrayOfArray_FSInterface_NoExtMeth.fs'
IL_0000: ret
} // end of method F@6::Invoke

} // end of class F@6
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
.assembly extern FSharp.Core
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:7:0:0
.ver 5:0:0:0
}
.assembly DoNotBoxStruct_Array_FSInterface_NoExtMeth
{
Expand All @@ -29,20 +29,20 @@
}
.mresource public FSharpSignatureData.DoNotBoxStruct_Array_FSInterface_NoExtMeth
{
// Offset: 0x00000000 Length: 0x00000261
// Offset: 0x00000000 Length: 0x00000273
}
.mresource public FSharpOptimizationData.DoNotBoxStruct_Array_FSInterface_NoExtMeth
{
// Offset: 0x00000268 Length: 0x000000AC
// Offset: 0x00000278 Length: 0x000000AC
}
.module DoNotBoxStruct_Array_FSInterface_NoExtMeth.exe
// MVID: {5EAD3E33-8127-3EE3-A745-0383333EAD5E}
// MVID: {60E47018-8127-3EE3-A745-03831870E460}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00AF0000
// Image base: 0x054A0000


// =============== CLASS MEMBERS DECLARATION ===================
Expand All @@ -58,15 +58,11 @@
.method assembly static void Invoke(object x,
int32 _arg1) cil managed
{
// Code size 3 (0x3)
.maxstack 5
.locals init ([0] int32 V_0)
// Code size 1 (0x1)
.maxstack 8
.language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
.line 100001,100001 : 0,0 'C:\\dev\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_Array_FSInterface_NoExtMeth.fs'
IL_0000: ldarg.1
IL_0001: stloc.0
.line 6,6 : 74,76 ''
IL_0002: ret
.line 6,6 : 74,76 'C:\\GitHub\\dsyme\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_Array_FSInterface_NoExtMeth.fs'
IL_0000: ret
} // end of method F@6::Invoke

} // end of class F@6
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
.assembly extern FSharp.Core
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:7:0:0
.ver 5:0:0:0
}
.assembly DoNotBoxStruct_MDArray_FSInterface_NoExtMeth
{
Expand All @@ -29,20 +29,20 @@
}
.mresource public FSharpSignatureData.DoNotBoxStruct_MDArray_FSInterface_NoExtMeth
{
// Offset: 0x00000000 Length: 0x00000268
// Offset: 0x00000000 Length: 0x0000027A
}
.mresource public FSharpOptimizationData.DoNotBoxStruct_MDArray_FSInterface_NoExtMeth
{
// Offset: 0x00000270 Length: 0x000000B0
// Offset: 0x00000280 Length: 0x000000B0
}
.module DoNotBoxStruct_MDArray_FSInterface_NoExtMeth.exe
// MVID: {5EAD3E33-A67D-867A-A745-0383333EAD5E}
// MVID: {60E47018-A67D-867A-A745-03831870E460}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x06A00000
// Image base: 0x056F0000


// =============== CLASS MEMBERS DECLARATION ===================
Expand All @@ -58,15 +58,11 @@
.method assembly static void Invoke(object x,
int32 _arg1) cil managed
{
// Code size 3 (0x3)
.maxstack 5
.locals init ([0] int32 V_0)
// Code size 1 (0x1)
.maxstack 8
.language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
.line 100001,100001 : 0,0 'C:\\dev\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_MDArray_FSInterface_NoExtMeth.fs'
IL_0000: ldarg.1
IL_0001: stloc.0
.line 6,6 : 77,79 ''
IL_0002: ret
.line 6,6 : 77,79 'C:\\GitHub\\dsyme\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_MDArray_FSInterface_NoExtMeth.fs'
IL_0000: ret
} // end of method F@6::Invoke

} // end of class F@6
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
.assembly extern FSharp.Core
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:7:0:0
.ver 5:0:0:0
}
.assembly DoNotBoxStruct_NoArray_FSInterface_NoExtMeth
{
Expand All @@ -29,20 +29,20 @@
}
.mresource public FSharpSignatureData.DoNotBoxStruct_NoArray_FSInterface_NoExtMeth
{
// Offset: 0x00000000 Length: 0x00000258
// Offset: 0x00000000 Length: 0x0000026A
}
.mresource public FSharpOptimizationData.DoNotBoxStruct_NoArray_FSInterface_NoExtMeth
{
// Offset: 0x00000260 Length: 0x000000B0
// Offset: 0x00000270 Length: 0x000000B0
}
.module DoNotBoxStruct_NoArray_FSInterface_NoExtMeth.exe
// MVID: {5EAD3E33-CD0A-F713-A745-0383333EAD5E}
// MVID: {60E47018-CD0A-F713-A745-03831870E460}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x05780000
// Image base: 0x06A30000


// =============== CLASS MEMBERS DECLARATION ===================
Expand All @@ -58,15 +58,11 @@
.method assembly static void Invoke(object x,
int32 _arg1) cil managed
{
// Code size 3 (0x3)
.maxstack 5
.locals init ([0] int32 V_0)
// Code size 1 (0x1)
.maxstack 8
.language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
.line 100001,100001 : 0,0 'C:\\dev\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_NoArray_FSInterface_NoExtMeth.fs'
IL_0000: ldarg.1
IL_0001: stloc.0
.line 6,6 : 68,70 ''
IL_0002: ret
.line 6,6 : 68,70 'C:\\GitHub\\dsyme\\fsharp\\tests\\fsharpqa\\source\\CodeGen\\EmittedIL\\DoNotBoxStruct\\DoNotBoxStruct_NoArray_FSInterface_NoExtMeth.fs'
IL_0000: ret
} // end of method F@6::Invoke

} // end of class F@6
Expand Down
1 change: 0 additions & 1 deletion tests/service/ProjectAnalysisTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3312,7 +3312,6 @@ let ``Test Project23 property`` () =
("Value", ["member"; "prop"; "extmem"]);
("set_Value", ["member"; "extmem"; "setter"]);
("x", []);
("_arg1", ["compgen"]);
("Value", ["member"; "prop"; "extmem"])]

[<Test>]
Expand Down
61 changes: 61 additions & 0 deletions tests/service/Symbols.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1225,4 +1225,65 @@ module ParsedHashDirective =
]) ])) ->
Assert.AreEqual("40", v)
assertRange (1, 8) (1, 16) m
| _ -> Assert.Fail "Could not get valid AST"

module Lambdas =
[<Test>]
let ``Lambda with two parameters gives correct body`` () =
let parseResults =
getParseResults
"fun a b -> x"

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr(
expr = SynExpr.Lambda(parsedData = Some([SynPat.Named _; SynPat.Named _], SynExpr.Ident(ident)))
)
]) ])) ->
Assert.AreEqual("x", ident.idText)
| _ -> Assert.Fail "Could not get valid AST"

[<Test>]
let ``Lambda with wild card parameter gives correct body`` () =
let parseResults =
getParseResults
"fun a _ b -> x"

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr(
expr = SynExpr.Lambda(parsedData = Some([SynPat.Named _; SynPat.Wild _; SynPat.Named _], SynExpr.Ident(ident)))
)
]) ])) ->
Assert.AreEqual("x", ident.idText)
| _ -> Assert.Fail "Could not get valid AST"

[<Test>]
let ``Lambda with tuple parameter with wild card gives correct body`` () =
let parseResults =
getParseResults
"fun a (b, _) c -> x"

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr(
expr = SynExpr.Lambda(parsedData = Some([SynPat.Named _; SynPat.Paren(SynPat.Tuple _,_); SynPat.Named _], SynExpr.Ident(ident)))
)
]) ])) ->
Assert.AreEqual("x", ident.idText)
| _ -> Assert.Fail "Could not get valid AST"

[<Test>]
let ``Lambda with wild card that returns a lambda gives correct body`` () =
let parseResults =
getParseResults
"fun _ -> fun _ -> x"

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.DoExpr(
expr = SynExpr.Lambda(parsedData = Some([SynPat.Wild _], SynExpr.Lambda(parsedData = Some([SynPat.Wild _], SynExpr.Ident(ident)))))
)
]) ])) ->
Assert.AreEqual("x", ident.idText)
| _ -> Assert.Fail "Could not get valid AST"

0 comments on commit 43f27c6

Please sign in to comment.