| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ | 
 | #define TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ | 
 |  | 
 | #include <optional> | 
 | #include <vector> | 
 |  | 
 | #include "gn/err.h" | 
 | #include "gn/label_pattern.h" | 
 | #include "gn/target.h" | 
 |  | 
 | class Builder; | 
 | class BuildSettings; | 
 |  | 
 | class CompileCommandsWriter { | 
 |  public: | 
 |   // Writes a compilation database to the given file name consisting of the | 
 |   // recursive dependencies of all targets that match or are dependencies of | 
 |   // targets that match any given pattern. | 
 |   // | 
 |   // The legacy target filters takes a deprecated list of comma-separated target | 
 |   // names ("target_name1,target_name2...") which are matched against targets in | 
 |   // any directory. This is passed as an optional to encapsulate the legacy | 
 |   // behavior that providing the switch with no patterns matches everything, but | 
 |   // not passing the flag (nullopt for the function parameter) matches nothing. | 
 |   // | 
 |   // The union of the legacy matches and the target patterns are used. | 
 |   // | 
 |   // TODO(https://bugs.chromium.org/p/gn/issues/detail?id=302): | 
 |   // Remove this legacy target filters behavior. | 
 |   static bool RunAndWriteFiles( | 
 |       const BuildSettings* build_setting, | 
 |       const std::vector<const Target*>& all_targets, | 
 |       const std::vector<LabelPattern>& patterns, | 
 |       const std::optional<std::string>& legacy_target_filters, | 
 |       const base::FilePath& output_path, | 
 |       Err* err); | 
 |  | 
 |   // Collects all the targets whose commands should get written as part of | 
 |   // RunAndWriteFiles() (separated out for unit testing). | 
 |   static std::vector<const Target*> CollectTargets( | 
 |       const BuildSettings* build_setting, | 
 |       const std::vector<const Target*>& all_targets, | 
 |       const std::vector<LabelPattern>& patterns, | 
 |       const std::optional<std::string>& legacy_target_filters, | 
 |       Err* err); | 
 |  | 
 |   static std::string RenderJSON(const BuildSettings* build_settings, | 
 |                                 std::vector<const Target*>& all_targets); | 
 |  | 
 |   // Does a depth-first search of the graph starting at the input target and | 
 |   // collects all recursive dependencies of those targets. | 
 |   static std::vector<const Target*> CollectDepsOfMatches( | 
 |       const std::vector<const Target*>& input_targets); | 
 |  | 
 |   // Performs the legacy target_name filtering. | 
 |   static std::vector<const Target*> FilterLegacyTargets( | 
 |       const std::vector<const Target*>& all_targets, | 
 |       const std::string& target_filter_string); | 
 | }; | 
 |  | 
 | #endif  // TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ |