Clang Project

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