| Index: tools/gn/xcode_object.cc
 | 
| diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
 | 
| index 9d574a570debfa9dabe79fa00a002f47aacc6c41..b8c8502a213f65dad3dddd46b59d8ddaa03a48cf 100644
 | 
| --- a/tools/gn/xcode_object.cc
 | 
| +++ b/tools/gn/xcode_object.cc
 | 
| @@ -244,6 +244,8 @@ const char* ToString(PBXObjectClass cls) {
 | 
|        return "PBXAggregateTarget";
 | 
|      case PBXBuildFileClass:
 | 
|        return "PBXBuildFile";
 | 
| +    case PBXContainerItemProxyClass:
 | 
| +      return "PBXContainerItemProxy";
 | 
|      case PBXFileReferenceClass:
 | 
|        return "PBXFileReference";
 | 
|      case PBXFrameworksBuildPhaseClass:
 | 
| @@ -258,6 +260,8 @@ const char* ToString(PBXObjectClass cls) {
 | 
|        return "PBXShellScriptBuildPhase";
 | 
|      case PBXSourcesBuildPhaseClass:
 | 
|        return "PBXSourcesBuildPhase";
 | 
| +    case PBXTargetDependencyClass:
 | 
| +      return "PBXTargetDependency";
 | 
|      case XCBuildConfigurationClass:
 | 
|        return "XCBuildConfiguration";
 | 
|      case XCConfigurationListClass:
 | 
| @@ -323,6 +327,11 @@ PBXTarget::PBXTarget(const std::string& name,
 | 
|  
 | 
|  PBXTarget::~PBXTarget() {}
 | 
|  
 | 
| +void PBXTarget::AddDependency(std::unique_ptr<PBXTargetDependency> dependency) {
 | 
| +  DCHECK(dependency);
 | 
| +  dependencies_.push_back(std::move(dependency));
 | 
| +}
 | 
| +
 | 
|  std::string PBXTarget::Name() const {
 | 
|    return name_;
 | 
|  }
 | 
| @@ -330,9 +339,10 @@ std::string PBXTarget::Name() const {
 | 
|  void PBXTarget::Visit(PBXObjectVisitor& visitor) {
 | 
|    PBXObject::Visit(visitor);
 | 
|    configurations_->Visit(visitor);
 | 
| -  for (const auto& build_phase : build_phases_) {
 | 
| +  for (const auto& dependency : dependencies_)
 | 
| +    dependency->Visit(visitor);
 | 
| +  for (const auto& build_phase : build_phases_)
 | 
|      build_phase->Visit(visitor);
 | 
| -  }
 | 
|  }
 | 
|  
 | 
|  // PBXAggregateTarget ---------------------------------------------------------
 | 
| @@ -399,6 +409,37 @@ void PBXBuildFile::Print(std::ostream& out, unsigned indent) const {
 | 
|    out << "};\n";
 | 
|  }
 | 
|  
 | 
| +// PBXContainerItemProxy ------------------------------------------------------
 | 
| +PBXContainerItemProxy::PBXContainerItemProxy(const PBXProject* project,
 | 
| +                                             const PBXTarget* target)
 | 
| +    : project_(project), target_(target) {}
 | 
| +
 | 
| +PBXContainerItemProxy::~PBXContainerItemProxy() {}
 | 
| +
 | 
| +PBXObjectClass PBXContainerItemProxy::Class() const {
 | 
| +  return PBXContainerItemProxyClass;
 | 
| +}
 | 
| +
 | 
| +void PBXContainerItemProxy::Visit(PBXObjectVisitor& visitor) {
 | 
| +  PBXObject::Visit(visitor);
 | 
| +}
 | 
| +
 | 
| +std::string PBXContainerItemProxy::Name() const {
 | 
| +  return "PBXContainerItemProxy";
 | 
| +}
 | 
| +
 | 
| +void PBXContainerItemProxy::Print(std::ostream& out, unsigned indent) const {
 | 
| +  const std::string indent_str(indent, '\t');
 | 
| +  const IndentRules rules = {true, 0};
 | 
| +  out << indent_str << Reference() << " = {";
 | 
| +  PrintProperty(out, rules, "isa", ToString(Class()));
 | 
| +  PrintProperty(out, rules, "containerPortal", project_);
 | 
| +  PrintProperty(out, rules, "proxyType", 1u);
 | 
| +  PrintProperty(out, rules, "remoteGlobalIDString", target_);
 | 
| +  PrintProperty(out, rules, "remoteInfo", target_->Name());
 | 
| +  out << indent_str << "};\n";
 | 
| +}
 | 
| +
 | 
|  // PBXFileReference -----------------------------------------------------------
 | 
|  
 | 
|  PBXFileReference::PBXFileReference(const std::string& name,
 | 
| @@ -604,7 +645,7 @@ void PBXNativeTarget::Print(std::ostream& out, unsigned indent) const {
 | 
|    PrintProperty(out, rules, "buildConfigurationList", configurations_);
 | 
|    PrintProperty(out, rules, "buildPhases", build_phases_);
 | 
|    PrintProperty(out, rules, "buildRules", EmptyPBXObjectVector());
 | 
| -  PrintProperty(out, rules, "dependencies", EmptyPBXObjectVector());
 | 
| +  PrintProperty(out, rules, "dependencies", dependencies_);
 | 
|    PrintProperty(out, rules, "name", name_);
 | 
|    PrintProperty(out, rules, "productName", product_name_);
 | 
|    PrintProperty(out, rules, "productReference", product_reference_);
 | 
| @@ -843,6 +884,33 @@ void PBXSourcesBuildPhase::Print(std::ostream& out, unsigned indent) const {
 | 
|    out << indent_str << "};\n";
 | 
|  }
 | 
|  
 | 
| +PBXTargetDependency::PBXTargetDependency(
 | 
| +    const PBXTarget* target,
 | 
| +    std::unique_ptr<PBXContainerItemProxy> container_item_proxy)
 | 
| +    : target_(target), container_item_proxy_(std::move(container_item_proxy)) {}
 | 
| +
 | 
| +PBXTargetDependency::~PBXTargetDependency() {}
 | 
| +
 | 
| +PBXObjectClass PBXTargetDependency::Class() const {
 | 
| +  return PBXTargetDependencyClass;
 | 
| +}
 | 
| +std::string PBXTargetDependency::Name() const {
 | 
| +  return "PBXTargetDependency";
 | 
| +}
 | 
| +void PBXTargetDependency::Visit(PBXObjectVisitor& visitor) {
 | 
| +  PBXObject::Visit(visitor);
 | 
| +  container_item_proxy_->Visit(visitor);
 | 
| +}
 | 
| +void PBXTargetDependency::Print(std::ostream& out, unsigned indent) const {
 | 
| +  const std::string indent_str(indent, '\t');
 | 
| +  const IndentRules rules = {false, indent + 1};
 | 
| +  out << indent_str << Reference() << " = {\n";
 | 
| +  PrintProperty(out, rules, "isa", ToString(Class()));
 | 
| +  PrintProperty(out, rules, "target", target_);
 | 
| +  PrintProperty(out, rules, "targetProxy", container_item_proxy_);
 | 
| +  out << indent_str << "};\n";
 | 
| +}
 | 
| +
 | 
|  // XCBuildConfiguration -------------------------------------------------------
 | 
|  
 | 
|  XCBuildConfiguration::XCBuildConfiguration(const std::string& name,
 | 
| 
 |