| // Copyright 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_XCODE_OBJECT_H_ | 
 | #define TOOLS_GN_XCODE_OBJECT_H_ | 
 |  | 
 | #include <iosfwd> | 
 | #include <map> | 
 | #include <memory> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "base/macros.h" | 
 |  | 
 | // Helper classes to generate Xcode project files. | 
 | // | 
 | // This code is based on gyp xcodeproj_file.py generator. It does not support | 
 | // all features of Xcode project but instead just enough to implement a hybrid | 
 | // mode where Xcode uses external scripts to perform the compilation steps. | 
 | // | 
 | // See https://chromium.googlesource.com/external/gyp/+/master/pylib/gyp/xcodeproj_file.py | 
 | // for more information on Xcode project file format. | 
 |  | 
 | enum class CompilerFlags { | 
 |   NONE, | 
 |   HELP, | 
 | }; | 
 |  | 
 | // PBXObjectClass ------------------------------------------------------------- | 
 |  | 
 | enum PBXObjectClass { | 
 |   // Those values needs to stay sorted in alphabetic order. | 
 |   PBXAggregateTargetClass, | 
 |   PBXBuildFileClass, | 
 |   PBXContainerItemProxyClass, | 
 |   PBXFileReferenceClass, | 
 |   PBXFrameworksBuildPhaseClass, | 
 |   PBXGroupClass, | 
 |   PBXNativeTargetClass, | 
 |   PBXProjectClass, | 
 |   PBXShellScriptBuildPhaseClass, | 
 |   PBXSourcesBuildPhaseClass, | 
 |   PBXTargetDependencyClass, | 
 |   XCBuildConfigurationClass, | 
 |   XCConfigurationListClass, | 
 | }; | 
 |  | 
 | const char* ToString(PBXObjectClass cls); | 
 |  | 
 | // Forward-declarations ------------------------------------------------------- | 
 |  | 
 | class PBXAggregateTarget; | 
 | class PBXBuildFile; | 
 | class PBXBuildPhase; | 
 | class PBXContainerItemProxy; | 
 | class PBXFileReference; | 
 | class PBXFrameworksBuildPhase; | 
 | class PBXGroup; | 
 | class PBXNativeTarget; | 
 | class PBXObject; | 
 | class PBXProject; | 
 | class PBXShellScriptBuildPhase; | 
 | class PBXSourcesBuildPhase; | 
 | class PBXTarget; | 
 | class PBXTargetDependency; | 
 | class XCBuildConfiguration; | 
 | class XCConfigurationList; | 
 |  | 
 | using PBXAttributes = std::map<std::string, std::string>; | 
 |  | 
 | // PBXObjectVisitor ----------------------------------------------------------- | 
 |  | 
 | class PBXObjectVisitor { | 
 |  public: | 
 |   PBXObjectVisitor(); | 
 |   virtual ~PBXObjectVisitor(); | 
 |   virtual void Visit(PBXObject* object) = 0; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXObjectVisitor); | 
 | }; | 
 |  | 
 | // PBXObject ------------------------------------------------------------------ | 
 |  | 
 | class PBXObject { | 
 |  public: | 
 |   PBXObject(); | 
 |   virtual ~PBXObject(); | 
 |  | 
 |   const std::string id() const { return id_; } | 
 |   void SetId(const std::string& id); | 
 |  | 
 |   std::string Reference() const; | 
 |  | 
 |   virtual PBXObjectClass Class() const = 0; | 
 |   virtual std::string Name() const = 0; | 
 |   virtual std::string Comment() const; | 
 |   virtual void Visit(PBXObjectVisitor& visitor); | 
 |   virtual void Print(std::ostream& out, unsigned indent) const = 0; | 
 |  | 
 |  private: | 
 |   std::string id_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXObject); | 
 | }; | 
 |  | 
 | // PBXBuildPhase -------------------------------------------------------------- | 
 |  | 
 | class PBXBuildPhase : public PBXObject { | 
 |  public: | 
 |   PBXBuildPhase(); | 
 |   ~PBXBuildPhase() override; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXBuildPhase); | 
 | }; | 
 |  | 
 | // PBXTarget ------------------------------------------------------------------ | 
 |  | 
 | class PBXTarget : public PBXObject { | 
 |  public: | 
 |   PBXTarget(const std::string& name, | 
 |             const std::string& shell_script, | 
 |             const std::string& config_name, | 
 |             const PBXAttributes& attributes); | 
 |   ~PBXTarget() override; | 
 |  | 
 |   void AddDependency(std::unique_ptr<PBXTargetDependency> dependency); | 
 |  | 
 |   // PBXObject implementation. | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |  | 
 |  protected: | 
 |   std::unique_ptr<XCConfigurationList> configurations_; | 
 |   std::vector<std::unique_ptr<PBXBuildPhase>> build_phases_; | 
 |   std::vector<std::unique_ptr<PBXTargetDependency>> dependencies_; | 
 |   PBXSourcesBuildPhase* source_build_phase_; | 
 |   std::string name_; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXTarget); | 
 | }; | 
 |  | 
 | // PBXAggregateTarget --------------------------------------------------------- | 
 |  | 
 | class PBXAggregateTarget : public PBXTarget { | 
 |  public: | 
 |   PBXAggregateTarget(const std::string& name, | 
 |                      const std::string& shell_script, | 
 |                      const std::string& config_name, | 
 |                      const PBXAttributes& attributes); | 
 |   ~PBXAggregateTarget() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXAggregateTarget); | 
 | }; | 
 |  | 
 | // PBXBuildFile --------------------------------------------------------------- | 
 |  | 
 | class PBXBuildFile : public PBXObject { | 
 |  public: | 
 |   PBXBuildFile(const PBXFileReference* file_reference, | 
 |                const PBXSourcesBuildPhase* build_phase, | 
 |                const CompilerFlags compiler_flag); | 
 |   ~PBXBuildFile() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   const PBXFileReference* file_reference_; | 
 |   const PBXSourcesBuildPhase* build_phase_; | 
 |   const CompilerFlags compiler_flag_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXBuildFile); | 
 | }; | 
 |  | 
 | // PBXContainerItemProxy ------------------------------------------------------ | 
 | class PBXContainerItemProxy : public PBXObject { | 
 |  public: | 
 |   PBXContainerItemProxy(const PBXProject* project, const PBXTarget* target); | 
 |   ~PBXContainerItemProxy() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   const PBXProject* project_; | 
 |   const PBXTarget* target_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXContainerItemProxy); | 
 | }; | 
 |  | 
 | // PBXFileReference ----------------------------------------------------------- | 
 |  | 
 | class PBXFileReference : public PBXObject { | 
 |  public: | 
 |   PBXFileReference(const std::string& name, | 
 |                    const std::string& path, | 
 |                    const std::string& type); | 
 |   ~PBXFileReference() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |   const std::string& path() const { return path_; } | 
 |  | 
 |  private: | 
 |   std::string name_; | 
 |   std::string path_; | 
 |   std::string type_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXFileReference); | 
 | }; | 
 |  | 
 | // PBXFrameworksBuildPhase ---------------------------------------------------- | 
 |  | 
 | class PBXFrameworksBuildPhase : public PBXBuildPhase { | 
 |  public: | 
 |   PBXFrameworksBuildPhase(); | 
 |   ~PBXFrameworksBuildPhase() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXFrameworksBuildPhase); | 
 | }; | 
 |  | 
 | // PBXGroup ------------------------------------------------------------------- | 
 |  | 
 | class PBXGroup : public PBXObject { | 
 |  public: | 
 |   explicit PBXGroup(const std::string& path = std::string(), | 
 |                     const std::string& name = std::string()); | 
 |   ~PBXGroup() override; | 
 |  | 
 |   const std::string& path() const { return path_; } | 
 |  | 
 |   PBXObject* AddChild(std::unique_ptr<PBXObject> child); | 
 |   PBXFileReference* AddSourceFile(const std::string& navigator_path, | 
 |                                   const std::string& source_path); | 
 |   bool is_source() { return is_source_; } | 
 |   void set_is_source(const bool is_source) { is_source_ = is_source; } | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   std::vector<std::unique_ptr<PBXObject>> children_; | 
 |   std::string name_; | 
 |   std::string path_; | 
 |   bool is_source_ = false; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXGroup); | 
 | }; | 
 |  | 
 | // PBXNativeTarget ------------------------------------------------------------ | 
 |  | 
 | class PBXNativeTarget : public PBXTarget { | 
 |  public: | 
 |   PBXNativeTarget(const std::string& name, | 
 |                   const std::string& shell_script, | 
 |                   const std::string& config_name, | 
 |                   const PBXAttributes& attributes, | 
 |                   const std::string& product_type, | 
 |                   const std::string& product_name, | 
 |                   const PBXFileReference* product_reference); | 
 |   ~PBXNativeTarget() override; | 
 |  | 
 |   void AddFileForIndexing(const PBXFileReference* file_reference, | 
 |                           const CompilerFlags compiler_flag); | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   const PBXFileReference* product_reference_; | 
 |   std::string product_type_; | 
 |   std::string product_name_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXNativeTarget); | 
 | }; | 
 |  | 
 | // PBXProject ----------------------------------------------------------------- | 
 |  | 
 | class PBXProject : public PBXObject { | 
 |  public: | 
 |   PBXProject(const std::string& name, | 
 |              const std::string& config_name, | 
 |              const std::string& source_path, | 
 |              const PBXAttributes& attributes); | 
 |   ~PBXProject() override; | 
 |  | 
 |   void AddSourceFileToIndexingTarget(const std::string& navigator_path, | 
 |                                      const std::string& source_path, | 
 |                                      const CompilerFlags compiler_flag); | 
 |   void AddSourceFile(const std::string& navigator_path, | 
 |                      const std::string& source_path, | 
 |                      const CompilerFlags compiler_flag, | 
 |                      PBXNativeTarget* target); | 
 |   void AddAggregateTarget(const std::string& name, | 
 |                           const std::string& shell_script); | 
 |   void AddIndexingTarget(); | 
 |   PBXNativeTarget* AddNativeTarget( | 
 |       const std::string& name, | 
 |       const std::string& type, | 
 |       const std::string& output_name, | 
 |       const std::string& output_type, | 
 |       const std::string& shell_script, | 
 |       const PBXAttributes& extra_attributes = PBXAttributes()); | 
 |  | 
 |   void SetProjectDirPath(const std::string& project_dir_path); | 
 |   void SetProjectRoot(const std::string& project_root); | 
 |   void AddTarget(std::unique_ptr<PBXTarget> target); | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   std::string Comment() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   PBXAttributes attributes_; | 
 |   std::unique_ptr<XCConfigurationList> configurations_; | 
 |   std::unique_ptr<PBXGroup> main_group_; | 
 |   std::string project_dir_path_; | 
 |   std::string project_root_; | 
 |   std::vector<std::unique_ptr<PBXTarget>> targets_; | 
 |   std::string name_; | 
 |   std::string config_name_; | 
 |  | 
 |   PBXGroup* sources_; | 
 |   PBXGroup* products_; | 
 |   PBXNativeTarget* target_for_indexing_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXProject); | 
 | }; | 
 |  | 
 | // PBXShellScriptBuildPhase --------------------------------------------------- | 
 |  | 
 | class PBXShellScriptBuildPhase : public PBXBuildPhase { | 
 |  public: | 
 |   PBXShellScriptBuildPhase(const std::string& name, | 
 |                            const std::string& shell_script); | 
 |   ~PBXShellScriptBuildPhase() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   std::string name_; | 
 |   std::string shell_script_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXShellScriptBuildPhase); | 
 | }; | 
 |  | 
 | // PBXSourcesBuildPhase ------------------------------------------------------- | 
 |  | 
 | class PBXSourcesBuildPhase : public PBXBuildPhase { | 
 |  public: | 
 |   PBXSourcesBuildPhase(); | 
 |   ~PBXSourcesBuildPhase() override; | 
 |  | 
 |   void AddBuildFile(std::unique_ptr<PBXBuildFile> build_file); | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   std::vector<std::unique_ptr<PBXBuildFile>> files_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXSourcesBuildPhase); | 
 | }; | 
 |  | 
 | // PBXTargetDependency ----------------------------------------------------- | 
 | class PBXTargetDependency : public PBXObject { | 
 |  public: | 
 |   PBXTargetDependency( | 
 |       const PBXTarget* target, | 
 |       std::unique_ptr<PBXContainerItemProxy> container_item_proxy); | 
 |   ~PBXTargetDependency() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   const PBXTarget* target_; | 
 |   std::unique_ptr<PBXContainerItemProxy> container_item_proxy_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PBXTargetDependency); | 
 | }; | 
 |  | 
 | // XCBuildConfiguration ------------------------------------------------------- | 
 |  | 
 | class XCBuildConfiguration : public PBXObject { | 
 |  public: | 
 |   XCBuildConfiguration(const std::string& name, | 
 |                        const PBXAttributes& attributes); | 
 |   ~XCBuildConfiguration() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   PBXAttributes attributes_; | 
 |   std::string name_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(XCBuildConfiguration); | 
 | }; | 
 |  | 
 | // XCConfigurationList -------------------------------------------------------- | 
 |  | 
 | class XCConfigurationList : public PBXObject { | 
 |  public: | 
 |   XCConfigurationList(const std::string& name, | 
 |                       const PBXAttributes& attributes, | 
 |                       const PBXObject* owner_reference); | 
 |   ~XCConfigurationList() override; | 
 |  | 
 |   // PBXObject implementation. | 
 |   PBXObjectClass Class() const override; | 
 |   std::string Name() const override; | 
 |   void Visit(PBXObjectVisitor& visitor) override; | 
 |   void Print(std::ostream& out, unsigned indent) const override; | 
 |  | 
 |  private: | 
 |   std::vector<std::unique_ptr<XCBuildConfiguration>> configurations_; | 
 |   const PBXObject* owner_reference_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(XCConfigurationList); | 
 | }; | 
 |  | 
 | #endif  // TOOLS_GN_XCODE_OBJECT_H_ |