anchor.diff:  [<BracePair(SquareBrackets.OpenCharacter, SquareBrackets.CloseCharacter)>]
   [<BracePair(DoubleQuote.OpenCharacter, DoubleQuote.CloseCharacter)>]
   [<BracePair(VerticalBar.OpenCharacter, VerticalBar.CloseCharacter)>]
  +[<BracePair(AngleBrackets.OpenCharacter, AngleBrackets.CloseCharacter)>]
  +[<BracePair(Asterisk.OpenCharacter, Asterisk.CloseCharacter)>]
   type internal FSharpBraceCompletionSessionProvider
       [<ImportingConstructor>] 
       (
  
positive.code:         member this.AllowOverType(_session, _cancellationToken) = 
              // TODO: Implement this for F#
              true
  
          member this.CheckOpeningPoint(_session, _cancellationToken) = 
              let sourceCode = _session.TextView.TextSnapshot
              //let document = _session.TextView.TextSnapshot.GetOpenDocumentInCurrentContextWithChanges()
              let position = _session.TextView.Caret.Position.BufferPosition.Position
              let ret = sourceCode.GetText(position-2,1) = "{" && sourceCode.GetText(position,1) = "}"
                          || sourceCode.GetText(position-2,1) = "[" && sourceCode.GetText(position,1) = "]"
              ret
              
  [<ExportLanguageService(typeof<IEditorBraceCompletionSessionFactory>, FSharpConstants.FSharpLanguageName)>]
  type internal FSharpEditorBraceCompletionSessionFactory () =
      inherit ForegroundThreadAffinitizedObject ()
  
negative.code:     member __.IsSupportedOpeningBrace openingBrace =
          match openingBrace with
          | Parenthesis.OpenCharacter | CurlyBrackets.OpenCharacter | SquareBrackets.OpenCharacter
          | DoubleQuote.OpenCharacter | VerticalBar.OpenCharacter | AngleBrackets.OpenCharacter 
          | Asterisk.OpenCharacter -> true
          | _ -> false
  
      member this.CheckCodeContext(_document : Document, _position : int, _openingBrace, _cancellationToken) =
          this.AssertIsForeground()
      // We need to know if we are inside a F# comment. If we are, then don't do automatic completion.
          let sourceCodeTask = _document.GetTextAsync(_cancellationToken)
          sourceCodeTask.Wait(_cancellationToken)
          let sourceCode = sourceCodeTask.Result
          
          _position = 0 
          || let colorizationData = Tokenizer.getColorizationData(_document.Id, sourceCode, TextSpan(_position-1, 1), Some (_document.FilePath), [], _cancellationToken)
             in colorizationData.Count = 0 
                || colorizationData.Exists (fun classifiedSpan -> 
                      classifiedSpan.TextSpan.IntersectsWith _position &&
                      (
                          match classifiedSpan.ClassificationType with
                          | ClassificationTypeNames.Comment
                          | ClassificationTypeNames.StringLiteral -> false
                          | _ -> true // anything else is a valid classification type
                      ))                
  
      member this.CreateEditorSession(_document: Document, _openingPosition: int, openingBrace: char, _cancellationToken: CancellationToken) =
          match openingBrace with
  