blob: 14b23ae271913871598def792dfeb62399e4e9a5 [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 Kornienko9ff5b6f2014-05-05 14:54:47 +000017#include <string>
Rafael Espindolafd85bb32014-06-12 16:53:02 +000018#include <system_error>
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000019#include <utility>
20#include <vector>
Alexander Kornienko9ff5b6f2014-05-05 14:54:47 +000021
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000022namespace clang {
23namespace tidy {
24
Alexander Kornienkoa4695222014-06-05 13:31:45 +000025/// \brief Contains a list of line ranges in a single file.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000026struct FileFilter {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000027 /// \brief File name.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000028 std::string Name;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000029
30 /// \brief LineRange is a pair<start, end> (inclusive).
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000031 typedef std::pair<unsigned, unsigned> LineRange;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000032
33 /// \brief A list of line ranges in this file, for which we show warnings.
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000034 std::vector<LineRange> LineRanges;
35};
36
Alexander Kornienkoa4695222014-06-05 13:31:45 +000037/// \brief Global options. These options are neither stored nor read from
38/// configuration files.
39struct ClangTidyGlobalOptions {
Alexander Kornienko3095b422014-06-12 11:25:45 +000040 /// \brief Output warnings from certain line ranges of certain files only.
41 /// If empty, no warnings will be filtered.
Alexander Kornienkoa4695222014-06-05 13:31:45 +000042 std::vector<FileFilter> LineFilter;
43};
44
45/// \brief Contains options for clang-tidy. These options may be read from
46/// configuration files, and may be different for different translation units.
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000047struct ClangTidyOptions {
Alexander Kornienkod53d2682014-09-04 14:23:36 +000048 /// \brief These options are used for all settings that haven't been
49 /// overridden by the \c OptionsProvider.
50 ///
51 /// Allow no checks and no headers by default.
52 static ClangTidyOptions getDefaults() {
53 ClangTidyOptions Options;
54 Options.Checks = "";
55 Options.HeaderFilterRegex = "";
56 Options.AnalyzeTemporaryDtors = false;
57 return Options;
58 }
59
60 /// \brief Creates a new \c ClangTidyOptions instance combined from all fields
61 /// of this instance overridden by the fields of \p Other that have a value.
62 ClangTidyOptions mergeWith(const ClangTidyOptions &Other) const;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000063
64 /// \brief Checks filter.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000065 llvm::Optional<std::string> Checks;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000066
Alexander Kornienkoa4695222014-06-05 13:31:45 +000067 /// \brief Output warnings from headers matching this filter. Warnings from
68 /// main files will always be displayed.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000069 llvm::Optional<std::string> HeaderFilterRegex;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000070
Alexander Kornienkoa4695222014-06-05 13:31:45 +000071 /// \brief Turns on temporary destructor-based analysis.
Alexander Kornienkod53d2682014-09-04 14:23:36 +000072 llvm::Optional<bool> AnalyzeTemporaryDtors;
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000073};
74
Alexander Kornienkoa4695222014-06-05 13:31:45 +000075/// \brief Abstract interface for retrieving various ClangTidy options.
76class ClangTidyOptionsProvider {
77public:
78 virtual ~ClangTidyOptionsProvider() {}
79
80 /// \brief Returns global options, which are independent of the file.
81 virtual const ClangTidyGlobalOptions &getGlobalOptions() = 0;
82
83 /// \brief Returns options applying to a specific translation unit with the
84 /// specified \p FileName.
85 virtual const ClangTidyOptions &getOptions(llvm::StringRef FileName) = 0;
86};
87
88/// \brief Implementation of the \c ClangTidyOptionsProvider interface, which
89/// returns the same options for all files.
90class DefaultOptionsProvider : public ClangTidyOptionsProvider {
91public:
92 DefaultOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions,
93 const ClangTidyOptions &Options)
94 : GlobalOptions(GlobalOptions), DefaultOptions(Options) {}
95 const ClangTidyGlobalOptions &getGlobalOptions() override {
96 return GlobalOptions;
97 }
Alexander Kornienkod53d2682014-09-04 14:23:36 +000098 const ClangTidyOptions &getOptions(llvm::StringRef /*FileName*/) override {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000099 return DefaultOptions;
100 }
101
102private:
103 ClangTidyGlobalOptions GlobalOptions;
104 ClangTidyOptions DefaultOptions;
105};
106
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000107/// \brief Implementation of the \c ClangTidyOptionsProvider interface, which
108/// tries to find a .clang-tidy file in the closest parent directory of each
109/// file.
110class FileOptionsProvider : public DefaultOptionsProvider {
111public:
112 /// \brief Initializes the \c FileOptionsProvider instance.
113 ///
114 /// \param GlobalOptions are just stored and returned to the caller of
115 /// \c getGlobalOptions.
116 ///
117 /// \param FallbackOptions are used in case there's no corresponding
118 /// .clang-tidy file.
119 ///
120 /// If any of the \param OverrideOptions fields are set, they will override
121 /// whatever options are read from the configuration file.
122 FileOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions,
123 const ClangTidyOptions &FallbackOptions,
124 const ClangTidyOptions &OverrideOptions);
125 const ClangTidyOptions &getOptions(llvm::StringRef FileName) override;
126
127private:
128 /// \brief Try to read configuration file from \p Directory. If \p Directory
129 /// is empty, use the fallback value.
130 llvm::ErrorOr<ClangTidyOptions> TryReadConfigFile(llvm::StringRef Directory);
131
132 llvm::StringMap<ClangTidyOptions> CachedOptions;
133 ClangTidyOptions OverrideOptions;
134};
135
Alexander Kornienkoa4695222014-06-05 13:31:45 +0000136/// \brief Parses LineFilter from JSON and stores it to the \p Options.
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000137std::error_code parseLineFilter(llvm::StringRef LineFilter,
138 ClangTidyGlobalOptions &Options);
Alexander Kornienkoa4695222014-06-05 13:31:45 +0000139
140/// \brief Parses configuration from JSON and stores it to the \p Options.
Alexander Kornienkod53d2682014-09-04 14:23:36 +0000141std::error_code parseConfiguration(llvm::StringRef Config,
142 ClangTidyOptions &Options);
143
144/// \brief Serializes configuration to a YAML-encoded string.
145std::string configurationAsText(const ClangTidyOptions &Options);
Alexander Kornienkodad4acb2014-05-22 16:07:11 +0000146
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +0000147} // end namespace tidy
148} // end namespace clang
149
150#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_OPTIONS_H