1 //===--- TestSupport.h - Clang-based refactoring tool -----------*- C++ -*-===// 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 /// \file 10 /// Declares datatypes and routines that are used by test-specific code 11 /// in clang-refactor. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H 16 #define LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H 17 18 #include "ToolRefactoringResultConsumer.h" 19 #include "clang/Basic/LLVM.h" 20 #include "clang/Basic/SourceLocation.h" 21 #include "llvm/ADT/Optional.h" 22 #include "llvm/ADT/SmallVector.h" 23 #include "llvm/Support/Error.h" 24 #include <map> 25 #include <string> 26 27 namespace clang { 28 29 class SourceManager; 30 31 namespace refactor { 32 33 /// A source selection range that's specified in a test file using an inline 34 /// command in the comment. These commands can take the following forms: 35 /// 36 /// - /*range=*/ will create an empty selection range in the default group 37 /// right after the comment. 38 /// - /*range a=*/ will create an empty selection range in the 'a' group right 39 /// after the comment. 40 /// - /*range = +1*/ will create an empty selection range at a location that's 41 /// right after the comment with one offset to the column. 42 /// - /*range= -> +2:3*/ will create a selection range that starts at the 43 /// location right after the comment, and ends at column 3 of the 2nd line 44 /// after the line of the starting location. 45 /// 46 /// Clang-refactor will expected all ranges in one test group to produce 47 /// identical results. 48 struct TestSelectionRange { 49 unsigned Begin, End; 50 }; 51 52 /// A set of test selection ranges specified in one file. 53 struct TestSelectionRangesInFile { 54 std::string Filename; 55 struct RangeGroup { 56 std::string Name; 57 SmallVector<TestSelectionRange, 8> Ranges; 58 }; 59 std::vector<RangeGroup> GroupedRanges; 60 61 bool foreachRange(const SourceManager &SM, 62 llvm::function_ref<void(SourceRange)> Callback) const; 63 64 std::unique_ptr<ClangRefactorToolConsumerInterface> createConsumer() const; 65 66 void dump(llvm::raw_ostream &OS) const; 67 }; 68 69 /// Extracts the grouped selection ranges from the file that's specified in 70 /// the -selection=test:<filename> option. 71 /// 72 /// The grouped ranges are specified in comments using the following syntax: 73 /// "range" [ group-name ] "=" [ "+" starting-column-offset ] [ "->" 74 /// "+" ending-line-offset ":" 75 /// ending-column-position ] 76 /// 77 /// The selection range is then computed from this command by taking the ending 78 /// location of the comment, and adding 'starting-column-offset' to the column 79 /// for that location. That location in turns becomes the whole selection range, 80 /// unless 'ending-line-offset' and 'ending-column-position' are specified. If 81 /// they are specified, then the ending location of the selection range is 82 /// the starting location's line + 'ending-line-offset' and the 83 /// 'ending-column-position' column. 84 /// 85 /// All selection ranges in one group are expected to produce the same 86 /// refactoring result. 87 /// 88 /// When testing, zero is returned from clang-refactor even when a group 89 /// produces an initiation error, which is different from normal invocation 90 /// that returns a non-zero value. This is done on purpose, to ensure that group 91 /// consistency checks can return non-zero, but still print the output of 92 /// the group. So even if a test matches the output of group, it will still fail 93 /// because clang-refactor should return zero on exit when the group results are 94 /// consistent. 95 /// 96 /// \returns None on failure (errors are emitted to stderr), or a set of 97 /// grouped source ranges in the given file otherwise. 98 Optional<TestSelectionRangesInFile> findTestSelectionRanges(StringRef Filename); 99 100 } // end namespace refactor 101 } // end namespace clang 102 103 #endif // LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H 104