@@ -129,7 +129,6 @@ module internal Structure =
129129| UnionCase
130130| EnumCase
131131| RecordField
132- | SimpleType
133132| RecordDefn
134133| UnionDefn
135134| Comment
@@ -177,7 +176,6 @@ module internal Structure =
177176| UnionCase-> " UnionCase"
178177| EnumCase-> " EnumCase"
179178| RecordField-> " RecordField"
180- | SimpleType-> " SimpleType"
181179| RecordDefn-> " RecordDefn"
182180| UnionDefn-> " UnionDefn"
183181| Comment-> " Comment"
@@ -247,7 +245,7 @@ module internal Structure =
247245| SynExpr.ForEach(_,_,_,_,_, e, r) ->
248246yield ! rcheck Scope.For Collapse.Below r r
249247yield ! parseExpr e
250- | SynExpr.LetOrUse(_,_, bindings, body,_ r ) ->
248+ | SynExpr.LetOrUse(_,_, bindings, body, _ )->
251249yield ! parseBindings bindings
252250yield ! parseExpr body
253251| SynExpr.Match( seqPointAtBinding,_ expr, clauses,_, r) ->
@@ -389,10 +387,15 @@ module internal Structure =
389387| _ -> ()
390388}
391389
392- and private parseMatchClause ( SynMatchClause. Clause ( synPat , _ , e , _r , _ ) as clause ) =
390+ and private parseMatchClause ( SynMatchClause.Clause ( synPat , _ , e , _r , _ ) as clause ) =
391+ let rec getLastPat = function
392+ | SynPat.Or(_, pat, _) -> getLastPat pat
393+ | x-> x
394+
393395seq {
396+ let synPat = getLastPat synPat
394397let collapse = Range.endToEnd synPat.Range clause.Range// Collapse the scope starting with `->`
395- yield ! rcheck Scope.MatchClause Collapse.Sameclause .Range collapse
398+ yield ! rcheck Scope.MatchClause Collapse.Samee .Range collapse
396399yield ! parseExpr e
397400}
398401
@@ -450,36 +453,46 @@ module internal Structure =
450453
451454and private parseExprInterfaces ( intfs : SynInterfaceImpl list ) = Seq.collect parseExprInterface intfs
452455
453- and private parseSynMemberDefn d =
456+ and private parseSynMemberDefn ( objectModelRange : range ) d =
454457seq {
455458match dwith
456- | SynMemberDefn.Member
457- ( SynBinding.Binding(_,_ kind,_,_, attrs,_,
458- SynValData( Some{ MemberKind= MemberKind.Constructor},_,_), synPat,_,_ e,_ lhsr,_)
459- as binding,_ r) as _ memb->
460- let collapse = Range.endToEnd synPat.Range d.Range
461- yield ! rcheck Scope.New Collapse.Below d.Range collapse
459+ | SynMemberDefn.Member( SynBinding.Binding( attrs= attrs; valData= valData; headPat= synPat; range= bindingRange) as binding,_) ->
460+ match valDatawith
461+ | SynValData( Some{ MemberKind= MemberKind.Constructor},_,_) ->
462+ let collapse = Range.endToEnd synPat.Range d.Range
463+ yield ! rcheck Scope.New Collapse.Below d.Range collapse
464+ | SynValData( Some{ MemberKind= MemberKind.PropertyGet| MemberKind.PropertySet},_,_) ->
465+ let range =
466+ Range.mkRange
467+ d.Range.FileName
468+ ( Range.mkPos d.Range.StartLine objectModelRange.StartColumn)
469+ d.Range.End
470+
471+ let collapse =
472+ match synPatwith
473+ | SynPat.LongIdent( longDotId= longIdent) ->
474+ Range.endToEnd longIdent.Range d.Range
475+ | _ -> Range.endToEnd bindingRange d.Range
476+
477+ yield ! rcheck Scope.Member Collapse.Below range collapse
478+ | _ ->
479+ let collapse = Range.endToEnd bindingRange d.Range
480+ yield ! rcheck Scope.Member Collapse.Below d.Range collapse
462481yield ! parseAttributes attrs
463482yield ! parseBinding binding
464- | SynMemberDefn.Member
465- ( SynBinding.Binding(_,_ kind,_,_, attrs,_, SynValData(_ memberFlags,_,_),_ synPat,_,_ e, lhsr,_) as binding,_ r) as _ memb->
466- let collapse = Range.endToEnd lhsr d.Range
467- yield ! rcheck Scope.Member Collapse.Below d.Range collapse
468- yield ! parseAttributes attrs
469- yield ! parseBinding binding
470- | SynMemberDefn.LetBindings( bindings,_,_,_ r) ->
483+ | SynMemberDefn.LetBindings( bindings,_,_,_) ->
471484yield ! parseBindings bindings
472- | SynMemberDefn.Interface( tp, iMembers,_ ) ->
485+ | SynMemberDefn.Interface( tp, iMembers, r ) ->
473486yield ! rcheck Scope.Interface Collapse.Below d.Range<| Range.endToEnd tp.Range d.Range
474487match iMemberswith
475488| Some members->
476- yield ! Seq.collect parseSynMemberDefn members
489+ yield ! Seq.collect( parseSynMemberDefn r ) members
477490| None-> ()
478- | SynMemberDefn.NestedType( td, _, _ r ) ->
491+ | SynMemberDefn.NestedType( td, _, _ )->
479492yield ! parseTypeDefn td//d.Range
480- | SynMemberDefn.AbstractSlot( ValSpfn(_, _, _, synt, _, _, _, _, _, _, _ ),_, r) ->
481- yield ! rcheck Scope.Member Collapse.Below d.Range<| Range.startToEnd synt.Range r
482- | SynMemberDefn.AutoProperty(_, _, _, _, (* memkind *) _, _, _, _, e , _, r) ->
493+ | SynMemberDefn.AbstractSlot( ValSpfn( synType = synt), _, r) ->
494+ yield ! rcheck Scope.Member Collapse.Below d.Range( Range.startToEnd synt.Range r)
495+ | SynMemberDefn.AutoProperty( synExpr = e ; range = r) ->
483496yield ! rcheck Scope.Member Collapse.Below d.Range r
484497yield ! parseExpr e
485498| _ -> ()
@@ -496,63 +509,47 @@ module internal Structure =
496509 | Path of string
497510*)
498511and private parseSimpleRepr simple =
499- let _accessRange ( opt : SynAccess option ) =
500- match optwith
501- | None-> 0
502- | Some synacc->
503- match synaccwith
504- | SynAccess.Public-> 6
505- | SynAccess.Private-> 7
506- | SynAccess.Internal-> 8
507512seq {
508513match simplewith
509514| SynTypeDefnSimpleRepr.Enum( cases,_ er) ->
510- yield !
511- cases
512- |> Seq.collect( fun ( SynEnumCase.EnumCase ( attrs , _ , _ , _ , cr )) ->
513- seq { yield ! rcheck Scope.EnumCase Collapse.Below cr cr
514- yield ! parseAttributes attrs})
515- | SynTypeDefnSimpleRepr.Record(_ opt, fields, rr) ->
515+ for SynEnumCase.EnumCase( attrs, _, _, _, cr) in casesdo
516+ yield ! rcheck Scope.EnumCase Collapse.Below cr cr
517+ yield ! parseAttributes attrs
518+ | SynTypeDefnSimpleRepr.Record(_, fields, rr) ->
516519yield ! rcheck Scope.RecordDefn Collapse.Same rr rr//<| Range.modBoth rr 1 1
517- yield ! fields
518- |> Seq.collect( fun ( SynField.Field ( attrs , _ , _ , _ , _ , _ , _ , fr )) ->
519- seq { yield ! rcheck Scope.RecordField Collapse.Below fr fr
520- yield ! parseAttributes attrs
521- })
522- | SynTypeDefnSimpleRepr.Union(_ opt, cases, ur) ->
520+ for SynField.Field( attrs,_,_,_,_,_,_, fr) in fieldsdo
521+ yield ! rcheck Scope.RecordField Collapse.Below fr fr
522+ yield ! parseAttributes attrs
523+ | SynTypeDefnSimpleRepr.Union(_, cases, ur) ->
523524yield ! rcheck Scope.UnionDefn Collapse.Same ur ur
524- yield ! cases
525- |> Seq.collect( fun ( SynUnionCase.UnionCase ( attrs , _ , _ , _ , _ , cr )) ->
526- seq { yield ! rcheck Scope.UnionCase Collapse.Below cr cr
527- yield ! parseAttributes attrs
528- })
525+ for SynUnionCase.UnionCase( attrs,_,_,_,_, cr) in casesdo
526+ yield ! rcheck Scope.UnionCase Collapse.Below cr cr
527+ yield ! parseAttributes attrs
529528| _ -> ()
530529}
531530
532- and private parseTypeDefn
533- ( TypeDefn
534- ( SynComponentInfo.ComponentInfo ( _attribs , typeArgs , _constraints , _longId , _doc , _b , _access , r )
535- as _componentInfo , objectModel , members , fullrange )) = seq {
536- let genericRange = rangeOfTypeArgsElse r typeArgs
537- let collapse = Range.endToEnd( Range.modEnd1 genericRange) fullrange
538- match objectModelwith
539- | SynTypeDefnRepr.ObjectModel( defnKind, objMembers, _) ->
540- match defnKindwith
541- | SynTypeDefnKind.TyconAugmentation->
542- yield ! rcheck Scope.TypeExtension Collapse.Below fullrange collapse
543- | _ ->
544- yield ! rcheck Scope.Type Collapse.Below fullrange collapse
545- yield ! Seq.collect parseSynMemberDefn objMembers
546- // visit the members of a type extension
547- yield ! Seq.collect parseSynMemberDefn members
548- | SynTypeDefnRepr.Simple( simpleRepr,_ r) ->
549- yield ! rcheck Scope.Type Collapse.Below fullrange collapse
550- yield ! parseSimpleRepr simpleRepr
551- yield ! Seq.collect parseSynMemberDefn members
552- | SynTypeDefnRepr.Exception_ -> ()
531+ and private parseTypeDefn ( TypeDefn ( SynComponentInfo.ComponentInfo ( _ , typeArgs , _ , _ , _ , _ , _ , r ), objectModel , members , fullrange )) =
532+ seq {
533+ let genericRange = rangeOfTypeArgsElse r typeArgs
534+ let collapse = Range.endToEnd( Range.modEnd1 genericRange) fullrange
535+ match objectModelwith
536+ | SynTypeDefnRepr.ObjectModel( defnKind, objMembers, r) ->
537+ match defnKindwith
538+ | SynTypeDefnKind.TyconAugmentation->
539+ yield ! rcheck Scope.TypeExtension Collapse.Below fullrange collapse
540+ | _ ->
541+ yield ! rcheck Scope.Type Collapse.Below fullrange collapse
542+ yield ! Seq.collect( parseSynMemberDefn r) objMembers
543+ // visit the members of a type extension
544+ yield ! Seq.collect( parseSynMemberDefn r) members
545+ | SynTypeDefnRepr.Simple( simpleRepr, r) ->
546+ yield ! rcheck Scope.Type Collapse.Below fullrange collapse
547+ yield ! parseSimpleRepr simpleRepr
548+ yield ! Seq.collect( parseSynMemberDefn r) members
549+ | SynTypeDefnRepr.Exception_ -> ()
553550}
554551
555- let private getConsecutiveModuleDecls ( predicate : SynModuleDecl -> range option ) ( scope : Scope ) ( decls : SynModuleDecls ) =
552+ let private getConsecutiveModuleDecls ( predicate : SynModuleDecl -> range option ) ( scope : Scope ) ( decls : SynModuleDecls ) =
556553let groupConsecutiveDecls input =
557554let rec loop ( input : range list ) ( res : range list list ) currentBulk =
558555match input, currentBulkwith
@@ -578,7 +575,6 @@ module internal Structure =
578575
579576 decls|> ( List.choose predicate>> groupConsecutiveDecls>> List.choose selectRanges)
580577
581-
582578let collectOpens = getConsecutiveModuleDecls( function SynModuleDecl.Open(_, r) -> Some r| _ -> None) Scope.Open
583579
584580let collectHashDirectives =
@@ -589,18 +585,17 @@ module internal Structure =
589585 Some( Range.mkRange" " ( Range.mkPos r.StartLine prefixLength) r.End)
590586| _ -> None) Scope.HashDirective
591587
592-
593588let rec private parseDeclaration ( decl : SynModuleDecl ) =
594589seq {
595590match declwith
596591| SynModuleDecl.Let(_, bindings, r) ->
597- yield ! bindings |> Seq.collect ( fun binding ->
592+ for binding in bindings do
598593let collapse = Range.endToEnd binding.RangeOfBindingSansRhs r
599- rcheck Scope.LetOrUse Collapse.Below r collapse
600- )
594+ yield ! rcheck Scope.LetOrUse Collapse.Below r collapse
601595yield ! parseBindings bindings
602596| SynModuleDecl.Types( types,_ r) ->
603- yield ! Seq.collect( fun t -> parseTypeDefn t) types
597+ for tin typesdo
598+ yield ! parseTypeDefn t
604599// Fold the attributes above a module
605600| SynModuleDecl.NestedModule( SynComponentInfo.ComponentInfo( attrs,_,_,_,_,_,_, cmpRange),_, decls,_,_) ->
606601// cmpInfo.
@@ -618,12 +613,9 @@ module internal Structure =
618613| _ -> ()
619614}
620615
621- let private parseModuleOrNamespace moduleOrNs =
616+ let private parseModuleOrNamespace ( SynModuleOrNamespace.SynModuleOrNamespace ( longId , _ , isModule , decls , _ , attribs , _ , r )) =
622617seq {
623- let ( SynModuleOrNamespace.SynModuleOrNamespace ( longId , _ , isModule , decls , _ , attribs , _ , r )) = moduleOrNs
624618yield ! parseAttributes attribs
625-
626-
627619let fullrange = Range.startToEnd( longIdentRange longId) r
628620let collapse = Range.endToEnd( longIdentRange longId) r
629621if isModulethen
@@ -857,7 +849,6 @@ module internal Structure =
857849| _ -> ()
858850}
859851
860-
861852let private parseModuleOrNamespaceSigs moduleOrNamespaceSig =
862853seq {
863854let ( SynModuleOrNamespaceSig.SynModuleOrNamespaceSig ( longId , _ , isModule , decls , _ , attribs , _ , r )) = moduleOrNamespaceSig
@@ -874,7 +865,6 @@ module internal Structure =
874865yield ! Seq.collect parseModuleSigDeclaration decls
875866}
876867
877-
878868let getOutliningRanges ( sourceLines : string []) ( parsedInput : ParsedInput ) =
879869match parsedInputwith
880870| ParsedInput.ImplFile implFile->
@@ -887,6 +877,3 @@ module internal Structure =
887877let astBasedRanges = Seq.collect parseModuleOrNamespaceSigs moduleSigs
888878let commentRanges = getCommentRanges sourceLines
889879 Seq.append astBasedRanges commentRanges
890-
891-
892-