// Copyright (c) 2016 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_QT_CREATOR_WRITER_H_
#define TOOLS_GN_QT_CREATOR_WRITER_H_

#include <set>
#include <string>

#include "base/files/file_path.h"
#include "gn/err.h"
#include "gn/target.h"

class Builder;
class BuildSettings;

class QtCreatorWriter {
 public:
  static bool RunAndWriteFile(const BuildSettings* build_settings,
                              const Builder& builder,
                              Err* err,
                              const std::string& root_target);

 private:
  QtCreatorWriter(const BuildSettings* build_settings,
                  const Builder& builder,
                  const base::FilePath& project_prefix,
                  const std::string& root_target_name);
  ~QtCreatorWriter();

  void Run();

  bool DiscoverTargets();
  void HandleTarget(const Target* target);

  void CollectDeps(const Target* target);
  void AddToSources(const Target::FileList& files);
  void GenerateFile(const base::FilePath::CharType* suffix,
                    const std::set<std::string>& items);

  const BuildSettings* build_settings_;
  const Builder& builder_;
  base::FilePath project_prefix_;
  std::string root_target_name_;
  std::set<const Target*> targets_;
  std::set<std::string> sources_;
  std::set<std::string> includes_;
  std::set<std::string> defines_;
  Err err_;

  QtCreatorWriter(const QtCreatorWriter&) = delete;
  QtCreatorWriter& operator=(const QtCreatorWriter&) = delete;
};

#endif  // TOOLS_GN_QT_CREATOR_WRITER_H_
