blob: 7359d768c23499df0fef51d5d2c937ed314da681 [file] [log] [blame]
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +00001//===--- ClangTidyOptions.h - clang-tidy ------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_OPTIONS_H
11#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_OPTIONS_H
12
Alexander Kornienkoa4695222014-06-05 13:31:45 +000013#include "llvm/ADT/StringRef.h"
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000014#include "llvm/Support/system_error.h"
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000015#include <string>
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000016#include <utility>
17#include <vector>
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000018
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000019namespace clang {
20namespace tidy {
21
Alexander Kornienkoa4695222014-06-05 13:31:45 +000022/// \brief Contains a list of line ranges in a single file.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000023struct FileFilter {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000024 /// \brief File name.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000025 std::string Name;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000026
27 /// \brief LineRange is a pair<start, end> (inclusive).
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000028 typedef std::pair<unsigned, unsigned> LineRange;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000029
30 /// \brief A list of line ranges in this file, for which we show warnings.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000031 std::vector<LineRange> LineRanges;
32};
33
Alexander Kornienkoa4695222014-06-05 13:31:45 +000034/// \brief Global options. These options are neither stored nor read from
35/// configuration files.
36struct ClangTidyGlobalOptions {
Alexander Kornienko3095b422014-06-12 11:25:45 +000037 /// \brief Output warnings from certain line ranges of certain files only.
38 /// If empty, no warnings will be filtered.
Alexander Kornienkoa4695222014-06-05 13:31:45 +000039 std::vector<FileFilter> LineFilter;
40};
41
42/// \brief Contains options for clang-tidy. These options may be read from
43/// configuration files, and may be different for different translation units.
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000044struct ClangTidyOptions {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000045 /// \brief Allow all checks and no headers by default.
Alexander Kornienko23fe9592014-05-15 14:27:36 +000046 ClangTidyOptions() : Checks("*"), AnalyzeTemporaryDtors(false) {}
Alexander Kornienkoa4695222014-06-05 13:31:45 +000047
48 /// \brief Checks filter.
Alexander Kornienko23fe9592014-05-15 14:27:36 +000049 std::string Checks;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000050
Alexander Kornienkoa4695222014-06-05 13:31:45 +000051 /// \brief Output warnings from headers matching this filter. Warnings from
52 /// main files will always be displayed.
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000053 std::string HeaderFilterRegex;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000054
Alexander Kornienkoa4695222014-06-05 13:31:45 +000055 /// \brief Turns on temporary destructor-based analysis.
Alex McCarthyfec08c72014-04-30 14:09:24 +000056 bool AnalyzeTemporaryDtors;
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000057};
58
Alexander Kornienkoa4695222014-06-05 13:31:45 +000059/// \brief Abstract interface for retrieving various ClangTidy options.
60class ClangTidyOptionsProvider {
61public:
62 virtual ~ClangTidyOptionsProvider() {}
63
64 /// \brief Returns global options, which are independent of the file.
65 virtual const ClangTidyGlobalOptions &getGlobalOptions() = 0;
66
67 /// \brief Returns options applying to a specific translation unit with the
68 /// specified \p FileName.
69 virtual const ClangTidyOptions &getOptions(llvm::StringRef FileName) = 0;
70};
71
72/// \brief Implementation of the \c ClangTidyOptionsProvider interface, which
73/// returns the same options for all files.
74class DefaultOptionsProvider : public ClangTidyOptionsProvider {
75public:
76 DefaultOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions,
77 const ClangTidyOptions &Options)
78 : GlobalOptions(GlobalOptions), DefaultOptions(Options) {}
79 const ClangTidyGlobalOptions &getGlobalOptions() override {
80 return GlobalOptions;
81 }
82 const ClangTidyOptions &getOptions(llvm::StringRef) override {
83 return DefaultOptions;
84 }
85
86private:
87 ClangTidyGlobalOptions GlobalOptions;
88 ClangTidyOptions DefaultOptions;
89};
90
91/// \brief Parses LineFilter from JSON and stores it to the \p Options.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000092llvm::error_code parseLineFilter(const std::string &LineFilter,
Alexander Kornienkoa4695222014-06-05 13:31:45 +000093 clang::tidy::ClangTidyGlobalOptions &Options);
94
95/// \brief Parses configuration from JSON and stores it to the \p Options.
96llvm::error_code parseConfiguration(const std::string &Config,
97 clang::tidy::ClangTidyOptions &Options);
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000098
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000099} // end namespace tidy
100} // end namespace clang
101
102#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_OPTIONS_H