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 15 matching lines...) Expand all Loading... |
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 HeaderChecker(const BuildSettings* build_settings, | 33 HeaderChecker(const BuildSettings* build_settings, |
34 const std::vector<const Target*>& targets); | 34 const std::vector<const Target*>& targets); |
35 | 35 |
36 // This assumes that the current thread already has a message loop. On | 36 // Runs the check. The targets in to_check will be checked. If this list is |
37 // error, fills the given vector with the errors and returns false. Returns | 37 // empty, all targets will be checked. |
| 38 // |
| 39 // 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 |
38 // true on success. | 41 // true on success. |
39 bool Run(std::vector<Err>* errors); | 42 bool Run(const std::vector<const Target*>& to_check, |
| 43 std::vector<Err>* errors); |
40 | 44 |
41 private: | 45 private: |
42 friend class base::RefCountedThreadSafe<HeaderChecker>; | 46 friend class base::RefCountedThreadSafe<HeaderChecker>; |
43 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, IsDependencyOf); | 47 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, IsDependencyOf); |
44 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, | 48 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, |
45 IsDependencyOf_ForwardsDirectDependentConfigs); | 49 IsDependencyOf_ForwardsDirectDependentConfigs); |
46 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckInclude); | 50 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, CheckInclude); |
47 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, | 51 FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, |
48 GetDependentConfigChainProblemIndex); | 52 GetDependentConfigChainProblemIndex); |
49 ~HeaderChecker(); | 53 ~HeaderChecker(); |
50 | 54 |
51 struct TargetInfo { | 55 struct TargetInfo { |
52 TargetInfo() : target(NULL), is_public(false) {} | 56 TargetInfo() : target(NULL), is_public(false) {} |
53 TargetInfo(const Target* t, bool p) : target(t), is_public(p) {} | 57 TargetInfo(const Target* t, bool p) : target(t), is_public(p) {} |
54 | 58 |
55 const Target* target; | 59 const Target* target; |
56 bool is_public; | 60 bool is_public; |
57 }; | 61 }; |
58 | 62 |
59 typedef std::vector<TargetInfo> TargetVector; | 63 typedef std::vector<TargetInfo> TargetVector; |
| 64 typedef std::map<SourceFile, TargetVector> FileMap; |
| 65 |
| 66 // Backend for Run() that takes the list of files to check. The errors_ list |
| 67 // will be populate on failure. |
| 68 void RunCheckOverFiles(const FileMap& flies); |
60 | 69 |
61 void DoWork(const Target* target, const SourceFile& file); | 70 void DoWork(const Target* target, const SourceFile& file); |
62 | 71 |
63 // Adds the sources and public files from the given target to the file_map_. | 72 // Adds the sources and public files from the given target to the given map. |
64 // Not threadsafe! Called only during init. | 73 static void AddTargetToFileMap(const Target* target, FileMap* dest); |
65 void AddTargetToFileMap(const Target* target); | |
66 | 74 |
67 // Returns true if the given file is in the output directory. | 75 // Returns true if the given file is in the output directory. |
68 bool IsFileInOuputDir(const SourceFile& file) const; | 76 bool IsFileInOuputDir(const SourceFile& file) const; |
69 | 77 |
70 // Resolves the contents of an include to a SourceFile. | 78 // Resolves the contents of an include to a SourceFile. |
71 SourceFile SourceFileForInclude(const base::StringPiece& input) const; | 79 SourceFile SourceFileForInclude(const base::StringPiece& input) const; |
72 | 80 |
73 // from_target is the target the file was defined from. It will be used in | 81 // from_target is the target the file was defined from. It will be used in |
74 // error messages. | 82 // error messages. |
75 bool CheckFile(const Target* from_target, | 83 bool CheckFile(const Target* from_target, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 // | 134 // |
127 // These are initialized during construction (which happens on one thread) | 135 // These are initialized during construction (which happens on one thread) |
128 // and are not modified after, so any thread can read these without locking. | 136 // and are not modified after, so any thread can read these without locking. |
129 | 137 |
130 base::MessageLoop* main_loop_; | 138 base::MessageLoop* main_loop_; |
131 base::RunLoop main_thread_runner_; | 139 base::RunLoop main_thread_runner_; |
132 | 140 |
133 const BuildSettings* build_settings_; | 141 const BuildSettings* build_settings_; |
134 | 142 |
135 // Maps source files to targets it appears in (usually just one target). | 143 // Maps source files to targets it appears in (usually just one target). |
136 typedef std::map<SourceFile, TargetVector> FileMap; | |
137 FileMap file_map_; | 144 FileMap file_map_; |
138 | 145 |
139 // Locked variables ---------------------------------------------------------- | 146 // Locked variables ---------------------------------------------------------- |
140 // | 147 // |
141 // These are mutable during runtime and require locking. | 148 // These are mutable during runtime and require locking. |
142 | 149 |
143 base::Lock lock_; | 150 base::Lock lock_; |
144 | 151 |
145 std::vector<Err> errors_; | 152 std::vector<Err> errors_; |
146 | 153 |
147 DISALLOW_COPY_AND_ASSIGN(HeaderChecker); | 154 DISALLOW_COPY_AND_ASSIGN(HeaderChecker); |
148 }; | 155 }; |
149 | 156 |
150 #endif // TOOLS_GN_HEADER_CHECKER_H_ | 157 #endif // TOOLS_GN_HEADER_CHECKER_H_ |
OLD | NEW |