make "floating macro bubble" output of -emit-html much prettier: 
only insert spaces between tokens if the code had them or if they 
are actually required to avoid pasting.  This reuses the same
logic as -E mode.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64421 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp
index 6e5d1c3..c0f3937 100644
--- a/lib/Rewrite/HTMLRewrite.cpp
+++ b/lib/Rewrite/HTMLRewrite.cpp
@@ -15,6 +15,7 @@
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Rewrite/Rewriter.h"
 #include "clang/Rewrite/HTMLRewrite.h"
+#include "clang/Lex/TokenConcatenation.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/SmallString.h"
@@ -428,6 +429,8 @@
   // Start parsing the specified input file.
   PP.EnterMainSourceFile();
   
+  TokenConcatenation ConcatInfo(PP);
+  
   // Lex all the tokens.
   const SourceManager &SourceMgr = PP.getSourceManager();
   Token Tok;
@@ -465,6 +468,7 @@
     std::string Expansion = PP.getSpelling(Tok);
     unsigned LineLen = Expansion.size();
     
+    Token PrevTok = Tok;
     // Okay, eat this token, getting the next one.
     PP.Lex(Tok);
     
@@ -480,9 +484,18 @@
       }
       
       LineLen -= Expansion.size();
+      
+      // If the tokens were already space separated, or if they must be to avoid
+      // them being implicitly pasted, add a space between them.
+      if (Tok.hasLeadingSpace() ||
+          ConcatInfo.AvoidConcat(PrevTok, Tok))
+        Expansion += ' ';
+      
       // Escape any special characters in the token text.
-      Expansion += ' ' + EscapeText(PP.getSpelling(Tok));
+      Expansion += EscapeText(PP.getSpelling(Tok));
       LineLen += Expansion.size();
+      
+      PrevTok = Tok;
       PP.Lex(Tok);
     }