// 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_;
  TargetSet 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_
