xref: /aosp_15_r20/external/clang/unittests/Format/FormatTestUtils.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li inline 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