anchor.diff:          //       x + x  // HERE
           // Because it is sticky-to-the-left, we do it _before_ emitting end-of-line from the newText
           | (LineCommentChunk true (commentTokensText, moreOrigTokens)),  _ ->
  -            Debug.WriteLine("injecting stick-to-the-left line comment '{0}'", String.concat "" commentTokensText)
  +            Debug.WriteLine("injecting stick-to-the-left line comment '{0}'", String.concat "" commentTokensText |> box)
               addText " "
               for x in commentTokensText do addText x
               loop moreOrigTokens newTokens 
  
positive.code:         //       // HERE
          //       x + x
          | (LineCommentChunk false (commentTokensText, moreOrigTokens)),  _ ->
              Debug.WriteLine("injecting line comment '{0}'", String.concat "" commentTokensText)
              maintainIndent (fun () -> for x in commentTokensText do addText x)
              loop moreOrigTokens newTokens 
  
          // Inject block commment 
          | (BlockCommentChunk (commentTokensText, moreOrigTokens)),  _ ->
              Debug.WriteLine("injecting block comment '{0}'", String.concat "" commentTokensText)
              let comments = String.concat "" commentTokensText
              if comments.IndexOf('\n') = -1 then
                  // This is an inline block comment
  
negative.code:               
          // Skip attributes in the old text
          | (Attribute (tokensText, moreOrigTokens)), _ ->
              Debug.WriteLine("skip matching of attribute tokens '{0}'", box tokensText)
              loop moreOrigTokens newTokens   
  
          // Matching tokens
          | (origTok :: moreOrigTokens), (newTok :: moreNewTokens) when tokensMatch origTok newTok ->
              Debug.WriteLine("matching token '{0}'", box origTok.Text)
              addText (snd newTok)
              loop moreOrigTokens moreNewTokens 
  
          // Matching tokens, after one new token, compensating for insertions of "|", ";" and others
          | (origTok :: moreOrigTokens), (newTok1 :: NewTokenAfterWhitespaceOrNewLine(whiteTokens, newTok2, moreNewTokens)) 
              when tokensMatch origTok newTok2 ->
              Debug.WriteLine("fresh non-matching new token '{0}'", snd newTok1 |> box)
              addText (snd newTok1)
              Debug.WriteLine("matching token '{0}' (after one fresh new token)", snd newTok2 |> box)
              for x in whiteTokens do addText x
              addText (snd newTok2)
              loop moreOrigTokens moreNewTokens 
  
          // Not a comment, drop the original token text until something matches
          | (origTok :: moreOrigTokens), _ ->
              Debug.WriteLine("dropping '{0}' from original text", box origTok.Text)
              loop moreOrigTokens newTokens 
  
          // Dangling text at the end 
          | [], ((_, newTokText) :: moreNewTokens) ->
              Debug.WriteLine("dangling new token '{0}'", box newTokText)
              addText newTokText 
              loop [] moreNewTokens 
  
          // Dangling input text - extra comments or whitespace
          | (Marked(origTok, origTokText, _) :: moreOrigTokens), [] ->
              Debug.WriteLine("dropping dangling old token '{0}'", box origTokText)
              loop moreOrigTokens [] 
  
          | [], [] -> 
  