mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 12:05:48 -04:00

to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
104 lines
4.0 KiB
C++
104 lines
4.0 KiB
C++
//===--- TestSupport.h - Clang-based refactoring tool -----------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// Declares datatypes and routines that are used by test-specific code
|
|
/// in clang-refactor.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H
|
|
#define LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H
|
|
|
|
#include "ToolRefactoringResultConsumer.h"
|
|
#include "clang/Basic/LLVM.h"
|
|
#include "clang/Basic/SourceLocation.h"
|
|
#include "llvm/ADT/Optional.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include <map>
|
|
#include <string>
|
|
|
|
namespace clang {
|
|
|
|
class SourceManager;
|
|
|
|
namespace refactor {
|
|
|
|
/// A source selection range that's specified in a test file using an inline
|
|
/// command in the comment. These commands can take the following forms:
|
|
///
|
|
/// - /*range=*/ will create an empty selection range in the default group
|
|
/// right after the comment.
|
|
/// - /*range a=*/ will create an empty selection range in the 'a' group right
|
|
/// after the comment.
|
|
/// - /*range = +1*/ will create an empty selection range at a location that's
|
|
/// right after the comment with one offset to the column.
|
|
/// - /*range= -> +2:3*/ will create a selection range that starts at the
|
|
/// location right after the comment, and ends at column 3 of the 2nd line
|
|
/// after the line of the starting location.
|
|
///
|
|
/// Clang-refactor will expected all ranges in one test group to produce
|
|
/// identical results.
|
|
struct TestSelectionRange {
|
|
unsigned Begin, End;
|
|
};
|
|
|
|
/// A set of test selection ranges specified in one file.
|
|
struct TestSelectionRangesInFile {
|
|
std::string Filename;
|
|
struct RangeGroup {
|
|
std::string Name;
|
|
SmallVector<TestSelectionRange, 8> Ranges;
|
|
};
|
|
std::vector<RangeGroup> GroupedRanges;
|
|
|
|
bool foreachRange(const SourceManager &SM,
|
|
llvm::function_ref<void(SourceRange)> Callback) const;
|
|
|
|
std::unique_ptr<ClangRefactorToolConsumerInterface> createConsumer() const;
|
|
|
|
void dump(llvm::raw_ostream &OS) const;
|
|
};
|
|
|
|
/// Extracts the grouped selection ranges from the file that's specified in
|
|
/// the -selection=test:<filename> option.
|
|
///
|
|
/// The grouped ranges are specified in comments using the following syntax:
|
|
/// "range" [ group-name ] "=" [ "+" starting-column-offset ] [ "->"
|
|
/// "+" ending-line-offset ":"
|
|
/// ending-column-position ]
|
|
///
|
|
/// The selection range is then computed from this command by taking the ending
|
|
/// location of the comment, and adding 'starting-column-offset' to the column
|
|
/// for that location. That location in turns becomes the whole selection range,
|
|
/// unless 'ending-line-offset' and 'ending-column-position' are specified. If
|
|
/// they are specified, then the ending location of the selection range is
|
|
/// the starting location's line + 'ending-line-offset' and the
|
|
/// 'ending-column-position' column.
|
|
///
|
|
/// All selection ranges in one group are expected to produce the same
|
|
/// refactoring result.
|
|
///
|
|
/// When testing, zero is returned from clang-refactor even when a group
|
|
/// produces an initiation error, which is different from normal invocation
|
|
/// that returns a non-zero value. This is done on purpose, to ensure that group
|
|
/// consistency checks can return non-zero, but still print the output of
|
|
/// the group. So even if a test matches the output of group, it will still fail
|
|
/// because clang-refactor should return zero on exit when the group results are
|
|
/// consistent.
|
|
///
|
|
/// \returns None on failure (errors are emitted to stderr), or a set of
|
|
/// grouped source ranges in the given file otherwise.
|
|
Optional<TestSelectionRangesInFile> findTestSelectionRanges(StringRef Filename);
|
|
|
|
} // end namespace refactor
|
|
} // end namespace clang
|
|
|
|
#endif // LLVM_CLANG_TOOLS_CLANG_REFACTOR_TEST_SUPPORT_H
|