75 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines utility functions for Clang-Format related tests.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_UNITTESTS_FORMAT_FORMATTESTUTILS_H14#define LLVM_CLANG_UNITTESTS_FORMAT_FORMATTESTUTILS_H15 16#include "clang/Format/Format.h"17#include "llvm/ADT/StringRef.h"18 19namespace clang {20namespace format {21namespace test {22 23inline FormatStyle getGoogleStyle() {24 return getGoogleStyle(FormatStyle::LK_Cpp);25}26 27// When HandleHash is false, preprocessor directives starting with hash will not28// be on separate lines. This is needed because Verilog uses hash for other29// purposes.30inline std::string messUp(StringRef Code, bool HandleHash = true) {31 std::string MessedUp(Code.str());32 bool InComment = false;33 bool InPreprocessorDirective = false;34 bool JustReplacedNewline = false;35 for (unsigned i = 0, e = MessedUp.size() - 1; i != e; ++i) {36 if (MessedUp[i] == '/' && MessedUp[i + 1] == '/') {37 if (JustReplacedNewline)38 MessedUp[i - 1] = '\n';39 InComment = true;40 } else if (HandleHash && MessedUp[i] == '#' &&41 (JustReplacedNewline || i == 0 || MessedUp[i - 1] == '\n')) {42 if (i != 0)43 MessedUp[i - 1] = '\n';44 InPreprocessorDirective = true;45 } else if (MessedUp[i] == '\\' && MessedUp[i + 1] == '\n') {46 MessedUp[i] = ' ';47 MessedUp[i + 1] = ' ';48 } else if (MessedUp[i] == '\n') {49 if (InComment) {50 InComment = false;51 } else if (InPreprocessorDirective) {52 InPreprocessorDirective = false;53 } else {54 JustReplacedNewline = true;55 MessedUp[i] = ' ';56 }57 } else if (MessedUp[i] != ' ') {58 JustReplacedNewline = false;59 }60 }61 std::string WithoutWhitespace;62 if (MessedUp[0] != ' ')63 WithoutWhitespace.push_back(MessedUp[0]);64 for (unsigned i = 1, e = MessedUp.size(); i != e; ++i)65 if (MessedUp[i] != ' ' || MessedUp[i - 1] != ' ')66 WithoutWhitespace.push_back(MessedUp[i]);67 return WithoutWhitespace;68}69 70} // end namespace test71} // end namespace format72} // end namespace clang73 74#endif75