// Copyright (c) 2013 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_NINJA_TOOLCHAIN_WRITER_H_
#define TOOLS_GN_NINJA_TOOLCHAIN_WRITER_H_

#include <iosfwd>
#include <set>
#include <string>
#include <vector>

#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "tools/gn/ninja_writer.h"
#include "tools/gn/path_output.h"
#include "tools/gn/toolchain.h"

struct EscapeOptions;
class Settings;
class Tool;

class NinjaToolchainWriter {
 public:
  // Takes the settings for the toolchain, as well as the list of all targets
  // associated with the toolchain.
  static bool RunAndWriteFile(
      const Settings* settings,
      const Toolchain* toolchain,
      const std::vector<NinjaWriter::TargetRulePair>& rules);

 private:
  FRIEND_TEST_ALL_PREFIXES(NinjaToolchainWriter, WriteToolRule);
  FRIEND_TEST_ALL_PREFIXES(NinjaToolchainWriter, WriteToolRuleWithLauncher);

  NinjaToolchainWriter(const Settings* settings,
                       const Toolchain* toolchain,
                       std::ostream& out);
  ~NinjaToolchainWriter();

  void Run(const std::vector<NinjaWriter::TargetRulePair>& extra_rules);

  void WriteRules();
  void WriteToolRule(Tool* tool, const std::string& rule_prefix);
  void WriteRulePattern(const char* name,
                        const SubstitutionPattern& pattern,
                        const EscapeOptions& options);
  void WriteCommandRulePattern(const char* name,
                               const std::string& launcher,
                               const SubstitutionPattern& command,
                               const EscapeOptions& options);

  const Settings* settings_;
  const Toolchain* toolchain_;
  std::ostream& out_;
  PathOutput path_output_;

  DISALLOW_COPY_AND_ASSIGN(NinjaToolchainWriter);
};

#endif  // TOOLS_GN_NINJA_TOOLCHAIN_WRITER_H_
