OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef TOOLS_GN_HEADER_CHECKER_H_ | 5 #ifndef TOOLS_GN_HEADER_CHECKER_H_ |
6 #define TOOLS_GN_HEADER_CHECKER_H_ | 6 #define TOOLS_GN_HEADER_CHECKER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 12 matching lines...) Expand all Loading... |
23 class LocationRange; | 23 class LocationRange; |
24 class SourceFile; | 24 class SourceFile; |
25 class Target; | 25 class Target; |
26 | 26 |
27 namespace base { | 27 namespace base { |
28 class MessageLoop; | 28 class MessageLoop; |
29 } | 29 } |
30 | 30 |
31 class HeaderChecker : public base::RefCountedThreadSafe<HeaderChecker> { | 31 class HeaderChecker : public base::RefCountedThreadSafe<HeaderChecker> { |
32 public: | 32 public: |
| 33 // Represents a dependency chain. |
| 34 struct ChainLink { |
| 35 ChainLink() : target(NULL), is_public(false) {} |
| 36 ChainLink(const Target* t, bool p) : target(t), is_public(p) {} |
| 37 |
| 38 const Target* target; |
| 39 |
| 40 // True when the dependency on this target is public. |
| 41 bool is_public; |
| 42 |
| 43 // Used for testing. |
| 44 bool operator==(const ChainLink& other) const { |
| 45 return target == other.target && is_public == other.is_public; |
| 46 } |
| 47 }; |
| 48 typedef std::vector<ChainLink> Chain; |
| 49 |
33 HeaderChecker(const BuildSettings* build_settings, | 50 HeaderChecker(const BuildSettings* build_settings, |
34 const std::vector<const Target*>& targets); | 51 const std::vector<const Target*>& targets); |
35 | 52 |
36 // Runs the check. The targets in to_check will be checked. If this list is | 53 // Runs the check. The targets in to_check will be checked. If this list is |
37 // empty, all targets will be checked. | 54 // empty, all targets will be checked. |
38 // | 55 // |
39 // This assumes that the current thread already has a message loop. On | 56 // This assumes that the current thread already has a message loop. On |
40 // error, fills the given vector with the errors and returns false. Returns | 57 // error, fills the given vector with the errors and returns false. Returns |
41 // true on success. | 58 // true on success. |
42 // | 59 // |
43 // force_check, if true, will override targets opting out of header checking | 60 // force_check, if true, will override targets opting out of header checking |
44 // with "check_includes = false" and will check them anyway. | 61 // with "check_includes = false" and will check them anyway. |
45 bool Run(const std::vector<const Target*>& to_check, | 62 bool Run(const std::vector<const Target*>& to_check, |
46 bool force_check, | 63 bool force_check, |
47 std::vector<Err>* errors); | 64 std::vector<Err>* errors); |
48 | 65 |
49 private: | 66 private: |
50 friend class base::RefCountedThreadSafe<HeaderChecker>; | 67 friend class base::RefCountedThreadSafe<HeaderChecker>; |
51 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, IsDependencyOf); | 68 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, IsDependencyOf); |
52 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, | |
53 IsDependencyOf_ForwardsDirectDependentConfigs); | |
54 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckInclude); | 69 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckInclude); |
| 70 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, PublicFirst); |
55 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckIncludeAllowCircular); | 71 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckIncludeAllowCircular); |
56 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, | |
57 GetDependentConfigChainProblemIndex); | |
58 ~HeaderChecker(); | 72 ~HeaderChecker(); |
59 | 73 |
60 struct TargetInfo { | 74 struct TargetInfo { |
61 TargetInfo() : target(NULL), is_public(false), is_generated(false) {} | 75 TargetInfo() : target(NULL), is_public(false), is_generated(false) {} |
62 TargetInfo(const Target* t, bool is_pub, bool is_gen) | 76 TargetInfo(const Target* t, bool is_pub, bool is_gen) |
63 : target(t), | 77 : target(t), |
64 is_public(is_pub), | 78 is_public(is_pub), |
65 is_generated(is_gen) { | 79 is_generated(is_gen) { |
66 } | 80 } |
67 | 81 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 const LocationRange& range, | 122 const LocationRange& range, |
109 Err* err) const; | 123 Err* err) const; |
110 | 124 |
111 // Returns true if the given search_for target is a dependency of | 125 // Returns true if the given search_for target is a dependency of |
112 // search_from. | 126 // search_from. |
113 // | 127 // |
114 // If found, the vector given in "chain" will be filled with the reverse | 128 // If found, the vector given in "chain" will be filled with the reverse |
115 // dependency chain from the dest target (chain[0] = search_for) to the src | 129 // dependency chain from the dest target (chain[0] = search_for) to the src |
116 // target (chain[chain.size() - 1] = search_from). | 130 // target (chain[chain.size() - 1] = search_from). |
117 // | 131 // |
118 // Chains with public dependencies will be considered first. If a public | 132 // Chains with permitted dependencies will be considered first. If a |
119 // match is found, *is_public will be set to true. A chain with non-public | 133 // permitted match is found, *is_permitted will be set to true. A chain with |
120 // dependencies will only be considered if there are no public chains. In | 134 // indirect, non-public dependencies will only be considered if there are no |
121 // this case, *is_public will be false. | 135 // public or direct chains. In this case, *is_permitted will be false. |
| 136 // |
| 137 // A permitted dependency is a sequence of public dependencies. The first |
| 138 // one may be private, since a direct dependency always allows headers to be |
| 139 // included. |
122 bool IsDependencyOf(const Target* search_for, | 140 bool IsDependencyOf(const Target* search_for, |
123 const Target* search_from, | 141 const Target* search_from, |
124 std::vector<const Target*>* chain, | 142 Chain* chain, |
125 bool* is_public) const; | 143 bool* is_permitted) const; |
126 | 144 |
127 // For internal use by the previous override of IsDependencyOf. If | 145 // For internal use by the previous override of IsDependencyOf. If |
128 // require_public is true, only public dependency chains are searched. | 146 // require_public is true, only public dependency chains are searched. |
129 bool IsDependencyOf(const Target* search_for, | 147 bool IsDependencyOf(const Target* search_for, |
130 const Target* search_from, | 148 const Target* search_from, |
131 bool require_public, | 149 bool require_permitted, |
132 std::vector<const Target*>* chain) const; | 150 Chain* chain) const; |
133 | 151 |
134 // Non-locked variables ------------------------------------------------------ | 152 // Non-locked variables ------------------------------------------------------ |
135 // | 153 // |
136 // These are initialized during construction (which happens on one thread) | 154 // These are initialized during construction (which happens on one thread) |
137 // and are not modified after, so any thread can read these without locking. | 155 // and are not modified after, so any thread can read these without locking. |
138 | 156 |
139 base::MessageLoop* main_loop_; | 157 base::MessageLoop* main_loop_; |
140 base::RunLoop main_thread_runner_; | 158 base::RunLoop main_thread_runner_; |
141 | 159 |
142 const BuildSettings* build_settings_; | 160 const BuildSettings* build_settings_; |
143 | 161 |
144 // Maps source files to targets it appears in (usually just one target). | 162 // Maps source files to targets it appears in (usually just one target). |
145 FileMap file_map_; | 163 FileMap file_map_; |
146 | 164 |
147 // Locked variables ---------------------------------------------------------- | 165 // Locked variables ---------------------------------------------------------- |
148 // | 166 // |
149 // These are mutable during runtime and require locking. | 167 // These are mutable during runtime and require locking. |
150 | 168 |
151 base::Lock lock_; | 169 base::Lock lock_; |
152 | 170 |
153 std::vector<Err> errors_; | 171 std::vector<Err> errors_; |
154 | 172 |
155 DISALLOW_COPY_AND_ASSIGN(HeaderChecker); | 173 DISALLOW_COPY_AND_ASSIGN(HeaderChecker); |
156 }; | 174 }; |
157 | 175 |
158 #endif // TOOLS_GN_HEADER_CHECKER_H_ | 176 #endif // TOOLS_GN_HEADER_CHECKER_H_ |
OLD | NEW |