// 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 "tools/gn/err.h"
#include "tools/gn/target.h"

class Builder;
class BuildSettings;

class CompileCommandsWriter {
 public:
  // Write compile commands into a json file located by parameter file_name.
  //
  // Parameter target_filters should be in "target_name1,target_name2..."
  // format. If it is not empty, only targets that are reachable from targets
  // in target_filters are used to generate compile commands.
  //
  // Parameter quiet is not used.
  static bool RunAndWriteFiles(const BuildSettings* build_setting,
                               const Builder& builder,
                               const std::string& file_name,
                               const std::string& target_filters,
                               bool quiet,
                               Err* err);
  static void RenderJSON(const BuildSettings* build_settings,
                         std::vector<const Target*>& all_targets,
                         std::string* compile_commands);
  static std::vector<const Target*> FilterTargets(
      const std::vector<const Target*>& all_targets,
      const std::set<std::string>& target_filters_set);

 private:
  // This fuction visits the deps graph of a target in a DFS fashion.
  static void VisitDeps(const Target* target, std::set<const Target*>* visited);
};

#endif  // TOOLS_GN_COMPILE_COMMANDS_WRITER_H_
