blob: 82a740cec225c49a07b2cc318852bdc22103b2e2 [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 Kornienkod53d2682014-09-04 14:23:36 +000013#include "llvm/ADT/Optional.h"
14#include "llvm/ADT/StringMap.h"
Alexander Kornienkoa4695222014-06-05 13:31:45 +000015#include "llvm/ADT/StringRef.h"
Alexander Kornienkod53d2682014-09-04 14:23:36 +000016#include "llvm/Support/ErrorOr.h"
Alexander Kornienko6e0cbc82014-09-12 08:53:36 +000017#include <map>
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000018#include <string>
Rafael Espindolafd85bb32014-06-12 16:53:02 +000019#include <system_error>
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000020#include <utility>
21#include <vector>
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000022
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000023namespace clang {
24namespace tidy {
25
Alexander Kornienkoa4695222014-06-05 13:31:45 +000026/// \brief Contains a list of line ranges in a single file.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000027struct FileFilter {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000028 /// \brief File name.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000029 std::string Name;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000030
31 /// \brief LineRange is a pair<start, end> (inclusive).
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000032 typedef std::pair<unsigned, unsigned> LineRange;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000033
34 /// \brief A list of line ranges in this file, for which we show warnings.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000035 std::vector<LineRange> LineRanges;
36};
37
Alexander Kornienkoa4695222014-06-05 13:31:45 +000038/// \brief Global options. These options are neither stored nor read from
39/// configuration files.
40struct ClangTidyGlobalOptions {
Alexander Kornienko3095b422014-06-12 11:25:45 +000041 /// \brief Output warnings from certain line ranges of certain files only.
42 /// If empty, no warnings will be filtered.
Alexander Kornienkoa4695222014-06-05 13:31:45 +000043 std::vector<FileFilter> LineFilter;
44};
45
46/// \brief Contains options for clang-tidy. These options may be read from
47/// configuration files, and may be different for different translation units.
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000048struct ClangTidyOptions {
Alexander Kornienkod53d2682014-09-04 14:23:36 +000049 /// \brief These options are used for all settings that haven't been
50 /// overridden by the \c OptionsProvider.
51 ///
52 /// Allow no checks and no headers by default.
53 static ClangTidyOptions getDefaults() {
54 ClangTidyOptions Options;
55 Options.Checks = "";
56 Options.HeaderFilterRegex = "";
57 Options.AnalyzeTemporaryDtors = false;
Alexander Kornienkoe9951542014-09-24 18:36:03 +000058 Options.User = llvm::None;
Alexander Kornienkod53d2682014-09-04 14:23:36 +000059 return Options;
60 }
61
62 /// \brief Creates a new \c ClangTidyOptions instance combined from all fields
63 /// of this instance overridden by the fields of \p Other that have a value.
64 ClangTidyOptions mergeWith(const ClangTidyOptions &Other) const;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000065
66 /// \brief Checks filter.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000067 llvm::Optional<std::string> Checks;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000068
Alexander Kornienkoa4695222014-06-05 13:31:45 +000069 /// \brief Output warnings from headers matching this filter. Warnings from
70 /// main files will always be displayed.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000071 llvm::Optional<std::string> HeaderFilterRegex;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000072
Alexander Kornienkoa4695222014-06-05 13:31:45 +000073 /// \brief Turns on temporary destructor-based analysis.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000074 llvm::Optional<bool> AnalyzeTemporaryDtors;
Alexander Kornienko6e0cbc82014-09-12 08:53:36 +000075
Alexander Kornienkoe9951542014-09-24 18:36:03 +000076 /// \brief Specifies the name or e-mail of the user running clang-tidy.
77 ///
78 /// This option is used, for example, to place the correct user name in TODO()
79 /// comments in the relevant check.
80 llvm::Optional<std::string> User;
81
Alexander Kornienko6e0cbc82014-09-12 08:53:36 +000082 typedef std::pair<std::string, std::string> StringPair;
83 typedef std::map<std::string, std::string> OptionMap;
84
85 /// \brief Key-value mapping used to store check-specific options.
86 OptionMap CheckOptions;
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000087};
88
Alexander Kornienkoa4695222014-06-05 13:31:45 +000089/// \brief Abstract interface for retrieving various ClangTidy options.
90class ClangTidyOptionsProvider {
91public:
92 virtual ~ClangTidyOptionsProvider() {}
93
94 /// \brief Returns global options, which are independent of the file.
95 virtual const ClangTidyGlobalOptions &getGlobalOptions() = 0;
96
97 /// \brief Returns options applying to a specific translation unit with the
98 /// specified \p FileName.
99 virtual const ClangTidyOptions &getOptions(llvm::StringRef FileName) = 0;
100};
101
102/// \brief Implementation of the \c ClangTidyOptionsProvider interface, which
103/// returns the same options for all files.
104class DefaultOptionsProvider : public ClangTidyOptionsProvider {
105public:
106 DefaultOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions,
107 const ClangTidyOptions &Options)
108 : GlobalOptions(GlobalOptions), DefaultOptions(Options) {}
109 const ClangTidyGlobalOptions &getGlobalOptions() override {
110 return GlobalOptions;
111 }
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000112 const ClangTidyOptions &getOptions(llvm::StringRef /*FileName*/) override {
Alexander Kornienkoa4695222014-06-05 13:31:45 +0000113 return DefaultOptions;
114 }
115
116private:
117 ClangTidyGlobalOptions GlobalOptions;
118 ClangTidyOptions DefaultOptions;
119};
120
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000121/// \brief Implementation of the \c ClangTidyOptionsProvider interface, which
122/// tries to find a .clang-tidy file in the closest parent directory of each
123/// file.
124class FileOptionsProvider : public DefaultOptionsProvider {
125public:
126 /// \brief Initializes the \c FileOptionsProvider instance.
127 ///
128 /// \param GlobalOptions are just stored and returned to the caller of
129 /// \c getGlobalOptions.
130 ///
Alexander Kornienkoe9951542014-09-24 18:36:03 +0000131 /// \param DefaultOptions are used for all settings not specified in a
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000132 /// .clang-tidy file.
133 ///
134 /// If any of the \param OverrideOptions fields are set, they will override
135 /// whatever options are read from the configuration file.
136 FileOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions,
Alexander Kornienkoe9951542014-09-24 18:36:03 +0000137 const ClangTidyOptions &DefaultOptions,
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000138 const ClangTidyOptions &OverrideOptions);
139 const ClangTidyOptions &getOptions(llvm::StringRef FileName) override;
140
141private:
142 /// \brief Try to read configuration file from \p Directory. If \p Directory
Alexander Kornienkoe9951542014-09-24 18:36:03 +0000143 /// is empty, use the default value.
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000144 llvm::ErrorOr<ClangTidyOptions> TryReadConfigFile(llvm::StringRef Directory);
145
146 llvm::StringMap<ClangTidyOptions> CachedOptions;
147 ClangTidyOptions OverrideOptions;
148};
149
Alexander Kornienkoa4695222014-06-05 13:31:45 +0000150/// \brief Parses LineFilter from JSON and stores it to the \p Options.
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000151std::error_code parseLineFilter(llvm::StringRef LineFilter,
152 ClangTidyGlobalOptions &Options);
Alexander Kornienkoa4695222014-06-05 13:31:45 +0000153
Alexander Kornienkoe9951542014-09-24 18:36:03 +0000154/// \brief Parses configuration from JSON and returns \c ClangTidyOptions or an
155/// error.
156llvm::ErrorOr<ClangTidyOptions> parseConfiguration(llvm::StringRef Config);
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000157
158/// \brief Serializes configuration to a YAML-encoded string.
159std::string configurationAsText(const ClangTidyOptions &Options);
Alexander Kornienkodad4acb2014-05-22 16:07:11 +0000160
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +0000161} // end namespace tidy
162} // end namespace clang
163
164#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_OPTIONS_H