anchor.diff:                      loop rest res (r::currentBulk)
                   | r :: rest, _ -> loop rest (currentBulk::res) [r]
               loop input [] []
  -
  -        decls 
  -        |> List.choose predicate
  -        |> groupConsecutiveDecls
  -        |> List.choose (fun ranges ->
  +        
  +        let selectRanges (ranges: range list) =
               match ranges with
               | [] -> None
               | [r] when r.StartLine = r.EndLine -> None
               | [r] -> Some <| mkSrange Scope.Same (Range.mkRange "" r.Start r.End)
               | lastRange :: rest ->
                   let firstRange = Seq.last rest
  -                Some <| mkSrange Scope.Same (Range.mkRange "" firstRange.Start lastRange.End))
  +                Some <| mkSrange Scope.Same (Range.mkRange "" firstRange.Start lastRange.End)
  +
  +        decls |> (List.choose predicate>>groupConsecutiveDecls>>List.choose selectRanges)
  +
   
       let collectOpens = getConsecutiveModuleDecls (function SynModuleDecl.Open (_,r) -> Some r | _ -> None)
  +
   
       let collectHashDirectives =
            getConsecutiveModuleDecls(
  
positive.code:             yield! collectOpens decls
              yield! Seq.collect visitDeclaration decls
          }
  
      let getOutliningRanges tree =
          seq {
  
negative.code:             | SynTypeDefnRepr.Simple _ -> 
                  yield! Seq.collect visitSynMemberDefn members
          }
  
  
      let private getConsecutiveModuleDecls (predicate: SynModuleDecl -> range option) (decls: SynModuleDecls) =
          let groupConsecutiveDecls input =
  