1*67e74705SXin Li //===- unittest/Format/FormatTestUtils.h - Formatting unit tests ----------===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li // 10*67e74705SXin Li // This file defines utility functions for Clang-Format related tests. 11*67e74705SXin Li // 12*67e74705SXin Li //===----------------------------------------------------------------------===// 13*67e74705SXin Li 14*67e74705SXin Li #ifndef LLVM_CLANG_UNITTESTS_FORMAT_FORMATTESTUTILS_H 15*67e74705SXin Li #define LLVM_CLANG_UNITTESTS_FORMAT_FORMATTESTUTILS_H 16*67e74705SXin Li 17*67e74705SXin Li #include "llvm/ADT/StringRef.h" 18*67e74705SXin Li 19*67e74705SXin Li namespace clang { 20*67e74705SXin Li namespace format { 21*67e74705SXin Li namespace test { 22*67e74705SXin Li messUp(llvm::StringRef Code)23*67e74705SXin Liinline std::string messUp(llvm::StringRef Code) { 24*67e74705SXin Li std::string MessedUp(Code.str()); 25*67e74705SXin Li bool InComment = false; 26*67e74705SXin Li bool InPreprocessorDirective = false; 27*67e74705SXin Li bool JustReplacedNewline = false; 28*67e74705SXin Li for (unsigned i = 0, e = MessedUp.size() - 1; i != e; ++i) { 29*67e74705SXin Li if (MessedUp[i] == '/' && MessedUp[i + 1] == '/') { 30*67e74705SXin Li if (JustReplacedNewline) 31*67e74705SXin Li MessedUp[i - 1] = '\n'; 32*67e74705SXin Li InComment = true; 33*67e74705SXin Li } else if (MessedUp[i] == '#' && (JustReplacedNewline || i == 0)) { 34*67e74705SXin Li if (i != 0) 35*67e74705SXin Li MessedUp[i - 1] = '\n'; 36*67e74705SXin Li InPreprocessorDirective = true; 37*67e74705SXin Li } else if (MessedUp[i] == '\\' && MessedUp[i + 1] == '\n') { 38*67e74705SXin Li MessedUp[i] = ' '; 39*67e74705SXin Li MessedUp[i + 1] = ' '; 40*67e74705SXin Li } else if (MessedUp[i] == '\n') { 41*67e74705SXin Li if (InComment) { 42*67e74705SXin Li InComment = false; 43*67e74705SXin Li } else if (InPreprocessorDirective) { 44*67e74705SXin Li InPreprocessorDirective = false; 45*67e74705SXin Li } else { 46*67e74705SXin Li JustReplacedNewline = true; 47*67e74705SXin Li MessedUp[i] = ' '; 48*67e74705SXin Li } 49*67e74705SXin Li } else if (MessedUp[i] != ' ') { 50*67e74705SXin Li JustReplacedNewline = false; 51*67e74705SXin Li } 52*67e74705SXin Li } 53*67e74705SXin Li std::string WithoutWhitespace; 54*67e74705SXin Li if (MessedUp[0] != ' ') 55*67e74705SXin Li WithoutWhitespace.push_back(MessedUp[0]); 56*67e74705SXin Li for (unsigned i = 1, e = MessedUp.size(); i != e; ++i) { 57*67e74705SXin Li if (MessedUp[i] != ' ' || MessedUp[i - 1] != ' ') 58*67e74705SXin Li WithoutWhitespace.push_back(MessedUp[i]); 59*67e74705SXin Li } 60*67e74705SXin Li return WithoutWhitespace; 61*67e74705SXin Li } 62*67e74705SXin Li 63*67e74705SXin Li } // end namespace test 64*67e74705SXin Li } // end namespace format 65*67e74705SXin Li } // end namespace clang 66*67e74705SXin Li 67*67e74705SXin Li #endif 68