Skip to content

Commit

Permalink
FunctionAnnotationAction: improvements for top-level tuple patterns (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
DedSec256 authored Dec 3, 2024
1 parent ed89205 commit 642cec8
Show file tree
Hide file tree
Showing 18 changed files with 108 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,20 +84,41 @@ module SpecifyTypes =
type FunctionAnnotationAction(dataProvider: FSharpContextActionDataProvider) =
inherit FSharpContextActionBase(dataProvider)

let rec (|TupleLikePattern|_|) (pattern: IFSharpPattern) =
match pattern with
| :? ITuplePat as pat -> Some(pat)
| :? IAsPat as pat ->
match pat.LeftPattern.IgnoreInnerParens() with
| TupleLikePattern pat -> Some(pat)
| _ -> None
| _ -> None

let specifyParameterTypes displayContext (binding: IBinding) (mfv: FSharpMemberOrFunctionOrValue) =
let types = FcsTypeUtil.getFunctionTypeArgs true mfv.FullType
let parameters = binding.ParametersDeclarations
let parameters = binding.ParametersDeclarations |> Seq.map _.Pattern

let rec specifyParameterTypes (types: FSharpType seq) (parameters: IFSharpPattern seq) isTopLevel =
for fcsType, parameter in Seq.zip types parameters do
match parameter.IgnoreInnerParens() with
| :? IConstPat | :? ITypedPat -> ()
| TupleLikePattern pat when isTopLevel ->
specifyParameterTypes fcsType.GenericArguments pat.Patterns false
| pattern ->
SpecifyTypes.specifyParameterType displayContext fcsType pattern

specifyParameterTypes types parameters true

for fcsType, parameter in (types, parameters) ||> Seq.zip do
match parameter.Pattern.IgnoreInnerParens() with
| :? IConstPat | :? ITypedPat -> ()
| pattern -> SpecifyTypes.specifyParameterType displayContext fcsType pattern

let isAnnotated (binding: IBinding) =
let rec isAnnotated isTopLevel (pattern: IFSharpPattern) =
let pattern = pattern.IgnoreInnerParens()
match pattern with
| :? ITypedPat | :? IUnitPat -> true
| TupleLikePattern pat when isTopLevel -> pat.PatternsEnumerable |> Seq.forall (isAnnotated false)
| _ -> false

isNotNull binding.ReturnTypeInfo &&
binding.ParametersDeclarations |> Seq.forall (fun p ->
let pattern = p.Pattern.IgnoreInnerParens()
pattern :? ITypedPat || pattern :? IUnitPat)
binding.ParametersDeclarations |> Seq.forall (fun p -> isAnnotated true p.Pattern)

let hasBangInBindingKeyword (binding: IBinding) =
let letExpr = LetOrUseExprNavigator.GetByBinding(binding)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module Module

let f{caret} ((a, b): int * int) : int =
let f{caret} (a: int, b: int) : int =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} (a, b as c) =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} (a: int, b: int as c) : int =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} (a: int, b as c) =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} (a: int, b: int as c) : int =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a, b) as c) =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a: int, b: int) as c) : int =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a, b)) =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a: int, b: int)) : int =
a + b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a, b), c) =
a + b + c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Module

let f{caret} ((a, b): int * int, c: int) : int =
a + b + c
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Module

let (|TryParseBool|_|) (_: string) = Some(true)

let f{caret} (TryParseBool enabled) = ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Module

let (|TryParseBool|_|) (_: string) = Some(true)

let f{caret} (TryParseBool enabled: string) : unit = ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Module

let (|TryParseBool|_|) (_: string) = Some(true)

let f{caret} (TryParseBool enabled as x) = ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Module

let (|TryParseBool|_|) (_: string) = Some(true)

let f{caret} (TryParseBool enabled as x: string) : unit = ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
do
let f1{on} (a, b): int = a + b
let f2{on} (a: int, (b: int, c: int)): int = 1
let f3{on} (a: int, b as c): int = 1

let g1{off} (a: int, (b, c): int * int): int = 1
let g2{off} (a: int, b: int as c): int = 1
let g3{off} (a, b as c: int * int): int = 1

()
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ type SpecifyTypesActionTest() =
[<Test>] member x.``Function - Parameters - Pattern 03 - List``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 04 - As``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 05 - Param owner``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 06 - Tuple with as 01``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 07 - Tuple with as 02``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 08 - Tuple with as 03``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 09 - Nested tuple 01``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 10 - Nested tuple 02``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 11 - Active pattern 01``() = x.DoNamedTest()
[<Test>] member x.``Function - Parameters - Pattern 12 - Active pattern 02``() = x.DoNamedTest()

[<Test>] member x.``Function - Return - Function 01``() = x.DoNamedTest()
[<Test>] member x.``Function - Return - Function 02``() = x.DoNamedTest()
Expand Down Expand Up @@ -58,6 +65,7 @@ type SpecifyTypesActionAvailabilityTest() =

[<Test>] member x.``Let bindings - Expr 01``() = x.DoNamedTest()
[<Test>] member x.``Let bindings - Module 01``() = x.DoNamedTest()
[<Test>] member x.``Let bindings - Tuples 01``() = x.DoNamedTest()

[<Test>] member x.``Class - member - 01``() = x.DoNamedTest()
[<Test>] member x.``LetBang - 01`` () = x.DoNamedTest()
Expand Down

0 comments on commit 642cec8

Please sign in to comment.