anchor.diff:  module internal Patterns =
       type TokenSymbol = 
           {
  -            TokenColor: TokenColorKind; 
  +            TokenInfo : TokenInformation;
               SymbolUse: FSharpSymbolUse option
               ExtraColorInfo: (Microsoft.FSharp.Compiler.Range.range * TokenColorKind) option
           }
   
       let (|Keyword|_|) ts =
  -        if (ts.TokenColor) = TokenColorKind.Keyword || 
  +        if (ts.TokenInfo.ColorClass) = TokenColorKind.Keyword || 
              (ts.ExtraColorInfo.IsSome && (snd ts.ExtraColorInfo.Value) = TokenColorKind.Keyword)  then Some(Keyword)
           else None
   
       let (|Comment|_|) ts =
  -        if ts.TokenColor = TokenColorKind.Comment then Some Comment
  +        if ts.TokenInfo.ColorClass = TokenColorKind.Comment then Some Comment
           else None
   
       let (|StringLiteral|_|) ts =
  -        if ts.TokenColor = TokenColorKind.String then Some StringLiteral
  +        if ts.TokenInfo.ColorClass = TokenColorKind.String then Some StringLiteral
           else None
   
       let (|NumberLiteral|_|) ts =
  -        if ts.TokenColor = TokenColorKind.Number then Some NumberLiteral
  +        if ts.TokenInfo.ColorClass = TokenColorKind.Number then Some NumberLiteral
           else None
   
       let (|PreprocessorKeyword|_|) ts =
  -        if ts.TokenColor = TokenColorKind.PreprocessorKeyword then Some PreprocessorKeyword
  -        else None
  +        if ts.TokenInfo.ColorClass = TokenColorKind.PreprocessorKeyword then Some PreprocessorKeyword
  +        else None
  +
  +    let (|Punctuation|_|) (ts:TokenSymbol) =
  +        let token = Parser.tokenTagToTokenId ts.TokenInfo.Tag
  +        match token with
  +        | Parser.tokenId.TOKEN_PLUS_MINUS_OP
  +        | Parser.tokenId.TOKEN_MINUS
  +        | Parser.tokenId.TOKEN_STAR
  +        | Parser.tokenId.TOKEN_INFIX_STAR_DIV_MOD_OP
  +        | Parser.tokenId.TOKEN_PERCENT_OP
  +        | Parser.tokenId.TOKEN_INFIX_AT_HAT_OP
  +        | Parser.tokenId.TOKEN_QMARK
  +        | Parser.tokenId.TOKEN_COLON
  +        | Parser.tokenId.TOKEN_EQUALS
  +        | Parser.tokenId.TOKEN_SEMICOLON
  +        | Parser.tokenId.TOKEN_COMMA
  +        | Parser.tokenId.TOKEN_DOT
  +        | Parser.tokenId.TOKEN_BAR -> Some Punctuation
  +        | _ -> None
  +
  +    let (|PunctuationBrackets|_|) (ts:TokenSymbol) =
  +        let token = Parser.tokenTagToTokenId ts.TokenInfo.Tag
  +        match token with
  +        | Parser.tokenId.TOKEN_LPAREN
  +        | Parser.tokenId.TOKEN_RPAREN
  +        | Parser.tokenId.TOKEN_LBRACK
  +        | Parser.tokenId.TOKEN_RBRACK
  +        | Parser.tokenId.TOKEN_LBRACE
  +        | Parser.tokenId.TOKEN_RBRACE -> Some PunctuationBrackets
  +        | _ -> None
   
       let private isIdentifier =
           function
  
positive.code:         | _ -> None
  
      let (|ComputationExpression|_|) ts =
          if isIdentifier ts.TokenColor then
              match ts.SymbolUse with
              | Some symbolUse ->
                  match symbolUse.IsFromComputationExpression with
  
negative.code:         else None
  
      let (|UnusedCode|_|) ts =
          if ts.TokenInfo.ColorClass = TokenColorKind.InactiveCode then Some UnusedCode
          else None
  
      let isAbstractBlockSpan (span: Span) =
  