@@ -65,21 +65,30 @@ module internal AstTraversal =
6565/// VisitMatchClause allows overriding clause behavior (note: by default it would defaultTraverse expression)
6666abstract VisitMatchClause : ( SynMatchClause -> 'T option ) * SynMatchClause -> 'T option
6767default this.VisitMatchClause ( defaultTraverse , mc ) = defaultTraverse mc
68- // VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing)
68+ /// VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing)
6969abstract VisitInheritSynMemberDefn : SynComponentInfo * SynTypeDefnKind * SynType * SynMemberDefns * range -> 'T option
7070default this.VisitInheritSynMemberDefn ( _componentInfo , _typeDefnKind , _synType , _members , _range ) = None
71- // VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing)
71+ /// VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing)
7272abstract VisitInterfaceSynMemberDefnType : SynType -> 'T option
7373default this.VisitInterfaceSynMemberDefnType ( _synType ) = None
74- // VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances
74+ /// VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances
7575abstract VisitRecordField : TraversePath * SynExpr option * LongIdentWithDots option -> 'T option
7676default this.VisitRecordField ( _path , _copyOpt , _recordField ) = None
77- // VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I.
77+ /// VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I.
7878abstract VisitHashDirective : range -> 'T option
7979default this.VisitHashDirective ( _ ) = None
80- // VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces
80+ /// VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces
8181abstract VisitModuleOrNamespace : SynModuleOrNamespace -> 'T option
8282default this.VisitModuleOrNamespace ( _ ) = None
83+ /// VisitComponentInfo allows overriding behavior when visiting type component infos
84+ abstract VisitComponentInfo : SynComponentInfo -> 'T option
85+ default this.VisitComponentInfo ( _ ) = None
86+ /// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings
87+ abstract VisitLetOrUse : SynBinding list * range -> 'T option
88+ default this.VisitLetOrUse ( _ , _ ) = None
89+
90+ abstract VisitSimplePats : SynSimplePat list -> 'T option
91+ default this.VisitSimplePats ( _ ) = None
8392
8493let dive node range project =
8594 range,( fun () -> project node)
@@ -143,7 +152,10 @@ module internal AstTraversal =
143152match mwith
144153| SynModuleDecl.ModuleAbbrev(_ ident, _ longIdent, _ range) -> None
145154| SynModuleDecl.NestedModule(_ synComponentInfo, _ isRec, synModuleDecls, _, _ range) -> synModuleDecls|> List.map( fun x -> dive x x.Range( traverseSynModuleDecl path)) |> pick decl
146- | SynModuleDecl.Let(_, synBindingList, _ range) -> synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path)) |> pick decl
155+ | SynModuleDecl.Let(_, synBindingList, range) ->
156+ match visitor.VisitLetOrUse( synBindingList, range) with
157+ | Some x-> Some x
158+ | None-> synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path)) |> pick decl
147159| SynModuleDecl.DoExpr(_ sequencePointInfoForBinding, synExpr, _ range) -> traverseSynExpr path synExpr
148160| SynModuleDecl.Types( synTypeDefnList, _ range) -> synTypeDefnList|> List.map( fun x -> dive x x.Range( traverseSynTypeDefn path)) |> pick decl
149161| SynModuleDecl.Exception(_ synExceptionDefn, _ range) -> None
@@ -317,7 +329,13 @@ module internal AstTraversal =
317329if ok.IsSomethen ok
318330else
319331 traverseSynExpr synExpr
320- | SynExpr.Lambda(_, _, _ synSimplePats, synExpr, _ range) -> traverseSynExpr synExpr
332+ | SynExpr.Lambda(_, _, synSimplePats, synExpr, _ range) ->
333+ match synSimplePatswith
334+ | SynSimplePats.SimplePats( pats,_) ->
335+ match visitor.VisitSimplePats( pats) with
336+ | Some x-> Some x
337+ | None-> traverseSynExpr synExpr
338+ | _ -> traverseSynExpr synExpr
321339| SynExpr.MatchLambda(_ isExnMatch,_ argm, synMatchClauseList,_ spBind,_ wholem) ->
322340 synMatchClauseList
323341|> List.map( fun x -> dive x x.Range( traverseSynMatchClause path))
@@ -339,10 +357,13 @@ module internal AstTraversal =
339357 dive synExpr2 synExpr2.Range traverseSynExpr]
340358|> pick expr
341359| SynExpr.TypeApp( synExpr, _, _ synTypeList, _ commas, _, _, _ range) -> traverseSynExpr synExpr
342- | SynExpr.LetOrUse(_, _, synBindingList, synExpr, _ range) ->
343- [ yield ! synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path))
344- yield dive synExpr synExpr.Range traverseSynExpr]
345- |> pick expr
360+ | SynExpr.LetOrUse(_, _, synBindingList, synExpr, range) ->
361+ match visitor.VisitLetOrUse( synBindingList, range) with
362+ | Some x-> Some x
363+ | None->
364+ [ yield ! synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path))
365+ yield dive synExpr synExpr.Range traverseSynExpr]
366+ |> pick expr
346367| SynExpr.TryWith( synExpr, _ range, synMatchClauseList, _ range2, _ range3, _ sequencePointInfoForTry, _ sequencePointInfoForWith) ->
347368[ yield dive synExpr synExpr.Range traverseSynExpr
348369yield ! synMatchClauseList|> List.map( fun x -> dive x x.Range( traverseSynMatchClause path))]
@@ -465,6 +486,10 @@ module internal AstTraversal =
465486
466487and traverseSynTypeDefn path ( SynTypeDefn.TypeDefn ( synComponentInfo , synTypeDefnRepr , synMemberDefns , tRange ) as tydef ) =
467488let path = TraverseStep.TypeDefn tydef:: path
489+
490+ match visitor.VisitComponentInfo synComponentInfowith
491+ | Some x-> Some x
492+ | None->
468493[
469494match synTypeDefnReprwith
470495| SynTypeDefnRepr.Exception_ ->
@@ -491,7 +516,8 @@ module internal AstTraversal =
491516match mwith
492517| SynMemberDefn.Open(_ longIdent, _ range) -> None
493518| SynMemberDefn.Member( synBinding, _ range) -> traverseSynBinding path synBinding
494- | SynMemberDefn.ImplicitCtor(_ synAccessOption, _ synAttributes, _ synSimplePatList, _ identOption, _ range) -> None
519+ | SynMemberDefn.ImplicitCtor(_ synAccessOption, _ synAttributes, synSimplePatList, _ identOption, _ range) ->
520+ visitor.VisitSimplePats( synSimplePatList)
495521| SynMemberDefn.ImplicitInherit( synType, synExpr, _ identOption, range) ->
496522[
497523 dive() synType.Range( fun () ->
@@ -503,7 +529,10 @@ module internal AstTraversal =
503529)
504530] |> pick m
505531| SynMemberDefn.AutoProperty(_ attribs, _ isStatic, _ id, _ tyOpt, _ propKind, _, _ xmlDoc, _ access, synExpr, _, _) -> traverseSynExpr path synExpr
506- | SynMemberDefn.LetBindings( synBindingList, _, _, _ range) -> synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path)) |> pick m
532+ | SynMemberDefn.LetBindings( synBindingList, _, _, range) ->
533+ match visitor.VisitLetOrUse( synBindingList, range) with
534+ | Some x-> Some x
535+ | None-> synBindingList|> List.map( fun x -> dive x x.RangeOfBindingAndRhs( traverseSynBinding path)) |> pick m
507536| SynMemberDefn.AbstractSlot(_ synValSig, _ memberFlags, _ range) -> None
508537| SynMemberDefn.Interface( synType, synMemberDefnsOption, _ range) ->
509538match visitor.VisitInterfaceSynMemberDefnType( synType) with
@@ -528,6 +557,7 @@ module internal AstTraversal =
528557yield synExpr
529558] |> List.map( fun x -> dive x x.Range( traverseSynExpr path)) |> pick all.Range all
530559 visitor.VisitMatchClause( defaultTraverse, mc)
560+
531561and traverseSynBinding path b =
532562let defaultTraverse b =
533563let path = TraverseStep.Binding b:: path