@@ -90,9 +90,15 @@ module internal AstTraversal =
9090/// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings
9191abstract VisitLetOrUse : SynBinding list * range -> 'T option
9292default this.VisitLetOrUse ( _ , _ ) = None
93-
93+ /// VisitType allows overriding behavior when visiting simple pats
9494abstract VisitSimplePats : SynSimplePat list -> 'T option
9595default this.VisitSimplePats ( _ ) = None
96+ /// VisitPat allows overriding behavior when visiting patterns
97+ abstract VisitPat : ( SynPat -> 'T option ) * SynPat -> 'T option
98+ default this.VisitPat ( defaultTraverse , pat ) = defaultTraverse pat
99+ /// VisitType allows overriding behavior when visiting type hints (x: ..., etc.)
100+ abstract VisitType : ( SynType -> 'T option ) * SynType -> 'T option
101+ default this.VisitType ( defaultTraverse , ty ) = defaultTraverse ty
96102
97103let dive node range project =
98104 range,( fun () -> project node)
@@ -189,12 +195,12 @@ module internal AstTraversal =
189195 dive synExpr2 synExpr2.Range traverseSynExpr]
190196|> pick expr
191197| SynExpr.Const(_ synConst, _ range) -> None
192- | SynExpr.Typed( synExpr, _ synType , _ range) -> traverseSynExpr synExpr
198+ | SynExpr.Typed( synExpr, synType , _ range) -> [ traverseSynExpr synExpr; traverseSynType synType ] |> List.tryPick id
193199| SynExpr.Tuple( synExprList, _, _ range)
194200| SynExpr.StructTuple( synExprList, _, _ range) -> synExprList|> List.map( fun x -> dive x x.Range traverseSynExpr) |> pick expr
195201| SynExpr.ArrayOrList(_, synExprList, _ range) -> synExprList|> List.map( fun x -> dive x x.Range traverseSynExpr) |> pick expr
196202| SynExpr.Record( inheritOpt, copyOpt, fields, _ range) ->
197- [
203+ [
198204let diveIntoSeparator offsideColumn scPosOpt copyOpt =
199205match scPosOptwith
200206| Some scPos->
@@ -448,6 +454,50 @@ module internal AstTraversal =
448454
449455 visitor.VisitExpr( path, traverseSynExpr path, defaultTraverse, expr)
450456
457+ and traversePat ( pat : SynPat ) =
458+ let defaultTraverse p =
459+ match pwith
460+ | SynPat.Paren( p, _) -> traversePat p
461+ | SynPat.Or( p1, p2, _) -> [ p1; p2] |> List.tryPick traversePat
462+ | SynPat.Ands( ps, _)
463+ | SynPat.Tuple( ps, _)
464+ | SynPat.StructTuple( ps, _)
465+ | SynPat.ArrayOrList(_, ps, _) -> ps|> List.tryPick traversePat
466+ | SynPat.Attrib( p, _, _) -> traversePat p
467+ | SynPat.LongIdent(_, _, _, args, _, _) ->
468+ match argswith
469+ | SynConstructorArgs.Pats ps-> ps|> List.tryPick traversePat
470+ | SynConstructorArgs.NamePatPairs( ps, _) ->
471+ ps|> List.map snd|> List.tryPick traversePat
472+ | SynPat.Typed( p, ty, _) ->
473+ [ traversePat p; traverseSynType ty] |> List.tryPick id
474+ | _ -> None
475+
476+ visitor.VisitPat( defaultTraverse, pat)
477+
478+ and traverseSynType ( ty : SynType ) =
479+ let defaultTraverse ty =
480+ match tywith
481+ | SynType.App( typeName, _, typeArgs, _, _, _, _)
482+ | SynType.LongIdentApp( typeName, _, _, typeArgs, _, _, _) ->
483+ [ yield typeName
484+ yield ! typeArgs]
485+ |> List.tryPick traverseSynType
486+ | SynType.Fun( ty1, ty2, _) -> [ ty1; ty2] |> List.tryPick traverseSynType
487+ | SynType.MeasurePower( ty, _, _)
488+ | SynType.HashConstraint( ty, _)
489+ | SynType.WithGlobalConstraints( ty, _, _)
490+ | SynType.Array(_, ty, _) -> traverseSynType ty
491+ | SynType.StaticConstantNamed( ty1, ty2, _)
492+ | SynType.MeasureDivide( ty1, ty2, _) -> [ ty1; ty2] |> List.tryPick traverseSynType
493+ | SynType.Tuple( tys, _)
494+ | SynType.StructTuple( tys, _) -> tys|> List.map snd|> List.tryPick traverseSynType
495+ | SynType.StaticConstantExpr( expr, _) -> traverseSynExpr[] expr
496+ | SynType.Anon_ -> None
497+ | _ -> None
498+
499+ visitor.VisitType( defaultTraverse, ty)
500+
451501and normalizeMembersToDealWithPeculiaritiesOfGettersAndSetters path traverseInherit ( synMemberDefns : SynMemberDefns ) =
452502 synMemberDefns
453503// property getters are setters are two members that can have the same range, so do some somersaults to deal with this
@@ -566,8 +616,10 @@ module internal AstTraversal =
566616let defaultTraverse b =
567617let path = TraverseStep.Binding b:: path
568618match bwith
569- | ( SynBinding.Binding(_ synAccessOption, _ synBindingKind, _, _, _ synAttributes, _ preXmlDoc, _ synValData, _ synPat, _ synBindingReturnInfoOption, synExpr, _ range, _ sequencePointInfoForBinding)) ->
570- traverseSynExpr path synExpr
619+ | ( SynBinding.Binding(_ synAccessOption, _ synBindingKind, _, _, _ synAttributes, _ preXmlDoc, _ synValData, synPat, _ synBindingReturnInfoOption, synExpr, _ range, _ sequencePointInfoForBinding)) ->
620+ [ traversePat synPat
621+ traverseSynExpr path synExpr]
622+ |> List.tryPick id
571623 visitor.VisitBinding( defaultTraverse, b)
572624
573625match parseTreewith