| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/xcode_object.h" | 5 #include "tools/gn/xcode_object.h" |
| 6 | 6 |
| 7 #include <iomanip> | 7 #include <iomanip> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 const std::string& type) | 397 const std::string& type) |
| 398 : name_(name), path_(path), type_(type) {} | 398 : name_(name), path_(path), type_(type) {} |
| 399 | 399 |
| 400 PBXFileReference::~PBXFileReference() {} | 400 PBXFileReference::~PBXFileReference() {} |
| 401 | 401 |
| 402 PBXObjectClass PBXFileReference::Class() const { | 402 PBXObjectClass PBXFileReference::Class() const { |
| 403 return PBXFileReferenceClass; | 403 return PBXFileReferenceClass; |
| 404 } | 404 } |
| 405 | 405 |
| 406 std::string PBXFileReference::Name() const { | 406 std::string PBXFileReference::Name() const { |
| 407 return path_; | 407 return name_; |
| 408 } | 408 } |
| 409 | 409 |
| 410 void PBXFileReference::Print(std::ostream& out, unsigned indent) const { | 410 void PBXFileReference::Print(std::ostream& out, unsigned indent) const { |
| 411 const std::string indent_str(indent, '\t'); | 411 const std::string indent_str(indent, '\t'); |
| 412 const IndentRules rules = {true, 0}; | 412 const IndentRules rules = {true, 0}; |
| 413 out << indent_str << Reference() << " = {"; | 413 out << indent_str << Reference() << " = {"; |
| 414 PrintProperty(out, rules, "isa", ToString(Class())); | 414 PrintProperty(out, rules, "isa", ToString(Class())); |
| 415 | 415 |
| 416 if (!type_.empty()) { | 416 if (!type_.empty()) { |
| 417 PrintProperty(out, rules, "explicitFileType", type_); | 417 PrintProperty(out, rules, "explicitFileType", type_); |
| 418 PrintProperty(out, rules, "includeInIndex", 0u); | 418 PrintProperty(out, rules, "includeInIndex", 0u); |
| 419 } else { | 419 } else { |
| 420 base::StringPiece ext = FindExtension(&path_); | 420 base::StringPiece ext = FindExtension(&name_); |
| 421 if (HasExplicitFileType(ext)) | 421 if (HasExplicitFileType(ext)) |
| 422 PrintProperty(out, rules, "explicitFileType", GetSourceType(ext)); | 422 PrintProperty(out, rules, "explicitFileType", GetSourceType(ext)); |
| 423 else | 423 else |
| 424 PrintProperty(out, rules, "lastKnownFileType", GetSourceType(ext)); | 424 PrintProperty(out, rules, "lastKnownFileType", GetSourceType(ext)); |
| 425 } | 425 } |
| 426 | 426 |
| 427 if (name_ != path_ && !name_.empty()) | 427 if (!name_.empty()) |
| 428 PrintProperty(out, rules, "name", name_); | 428 PrintProperty(out, rules, "name", name_); |
| 429 | 429 |
| 430 DCHECK(!path_.empty()); |
| 430 PrintProperty(out, rules, "path", path_); | 431 PrintProperty(out, rules, "path", path_); |
| 431 PrintProperty(out, rules, "sourceTree", | 432 PrintProperty(out, rules, "sourceTree", |
| 432 type_.empty() ? "<group>" : "BUILT_PRODUCTS_DIR"); | 433 type_.empty() ? "<group>" : "BUILT_PRODUCTS_DIR"); |
| 433 out << "};\n"; | 434 out << "};\n"; |
| 434 } | 435 } |
| 435 | 436 |
| 436 // PBXFrameworksBuildPhase ---------------------------------------------------- | 437 // PBXFrameworksBuildPhase ---------------------------------------------------- |
| 437 | 438 |
| 438 PBXFrameworksBuildPhase::PBXFrameworksBuildPhase() {} | 439 PBXFrameworksBuildPhase::PBXFrameworksBuildPhase() {} |
| 439 | 440 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 464 : name_(name), path_(path) {} | 465 : name_(name), path_(path) {} |
| 465 | 466 |
| 466 PBXGroup::~PBXGroup() {} | 467 PBXGroup::~PBXGroup() {} |
| 467 | 468 |
| 468 PBXObject* PBXGroup::AddChild(std::unique_ptr<PBXObject> child) { | 469 PBXObject* PBXGroup::AddChild(std::unique_ptr<PBXObject> child) { |
| 469 DCHECK(child); | 470 DCHECK(child); |
| 470 children_.push_back(std::move(child)); | 471 children_.push_back(std::move(child)); |
| 471 return children_.back().get(); | 472 return children_.back().get(); |
| 472 } | 473 } |
| 473 | 474 |
| 474 PBXFileReference* PBXGroup::AddSourceFile(const std::string& source_path) { | 475 PBXFileReference* PBXGroup::AddSourceFile(const std::string& navigator_path, |
| 476 const std::string& source_path) { |
| 477 DCHECK(!navigator_path.empty()); |
| 475 DCHECK(!source_path.empty()); | 478 DCHECK(!source_path.empty()); |
| 476 std::string::size_type sep = source_path.find("/"); | 479 std::string::size_type sep = navigator_path.find("/"); |
| 477 if (sep == std::string::npos) { | 480 if (sep == std::string::npos) { |
| 478 children_.push_back(base::MakeUnique<PBXFileReference>( | 481 children_.push_back(base::MakeUnique<PBXFileReference>( |
| 479 std::string(), source_path, std::string())); | 482 navigator_path, source_path, std::string())); |
| 480 return static_cast<PBXFileReference*>(children_.back().get()); | 483 return static_cast<PBXFileReference*>(children_.back().get()); |
| 481 } | 484 } |
| 482 | 485 |
| 483 PBXGroup* group = nullptr; | 486 PBXGroup* group = nullptr; |
| 484 base::StringPiece component(source_path.data(), sep); | 487 base::StringPiece component(navigator_path.data(), sep); |
| 485 for (const auto& child : children_) { | 488 for (const auto& child : children_) { |
| 486 if (child->Class() != PBXGroupClass) | 489 if (child->Class() != PBXGroupClass) |
| 487 continue; | 490 continue; |
| 488 | 491 |
| 489 PBXGroup* child_as_group = static_cast<PBXGroup*>(child.get()); | 492 PBXGroup* child_as_group = static_cast<PBXGroup*>(child.get()); |
| 490 if (child_as_group->path_ == component) { | 493 if (child_as_group->name_ == component) { |
| 491 group = child_as_group; | 494 group = child_as_group; |
| 492 break; | 495 break; |
| 493 } | 496 } |
| 494 } | 497 } |
| 495 | 498 |
| 496 if (!group) { | 499 if (!group) { |
| 497 children_.push_back(base::WrapUnique(new PBXGroup(component.as_string()))); | 500 children_.push_back(base::WrapUnique( |
| 501 new PBXGroup(component.as_string(), component.as_string()))); |
| 498 group = static_cast<PBXGroup*>(children_.back().get()); | 502 group = static_cast<PBXGroup*>(children_.back().get()); |
| 499 } | 503 } |
| 500 | 504 |
| 501 DCHECK(group); | 505 DCHECK(group); |
| 502 DCHECK(group->path_ == component); | 506 DCHECK(group->name_ == component); |
| 503 return group->AddSourceFile(source_path.substr(sep + 1)); | 507 return group->AddSourceFile(navigator_path.substr(sep + 1), source_path); |
| 504 } | 508 } |
| 505 | 509 |
| 506 PBXObjectClass PBXGroup::Class() const { | 510 PBXObjectClass PBXGroup::Class() const { |
| 507 return PBXGroupClass; | 511 return PBXGroupClass; |
| 508 } | 512 } |
| 509 | 513 |
| 510 std::string PBXGroup::Name() const { | 514 std::string PBXGroup::Name() const { |
| 511 if (!name_.empty()) | 515 if (!name_.empty()) |
| 512 return name_; | 516 return name_; |
| 513 if (!path_.empty()) | 517 if (!path_.empty()) |
| 514 return path_; | 518 return path_; |
| 515 return std::string(); | 519 return std::string(); |
| 516 } | 520 } |
| 517 | 521 |
| 518 void PBXGroup::Visit(PBXObjectVisitor& visitor) { | 522 void PBXGroup::Visit(PBXObjectVisitor& visitor) { |
| 519 PBXObject::Visit(visitor); | 523 PBXObject::Visit(visitor); |
| 520 for (const auto& child : children_) { | 524 for (const auto& child : children_) { |
| 521 child->Visit(visitor); | 525 child->Visit(visitor); |
| 522 } | 526 } |
| 523 } | 527 } |
| 524 | 528 |
| 525 void PBXGroup::Print(std::ostream& out, unsigned indent) const { | 529 void PBXGroup::Print(std::ostream& out, unsigned indent) const { |
| 526 const std::string indent_str(indent, '\t'); | 530 const std::string indent_str(indent, '\t'); |
| 527 const IndentRules rules = {false, indent + 1}; | 531 const IndentRules rules = {false, indent + 1}; |
| 528 out << indent_str << Reference() << " = {\n"; | 532 out << indent_str << Reference() << " = {\n"; |
| 529 PrintProperty(out, rules, "isa", ToString(Class())); | 533 PrintProperty(out, rules, "isa", ToString(Class())); |
| 530 PrintProperty(out, rules, "children", children_); | 534 PrintProperty(out, rules, "children", children_); |
| 531 if (!name_.empty()) | 535 if (!name_.empty()) |
| 532 PrintProperty(out, rules, "name", name_); | 536 PrintProperty(out, rules, "name", name_); |
| 533 if (!path_.empty()) | 537 if (is_source_ && !path_.empty()) |
| 534 PrintProperty(out, rules, "path", path_); | 538 PrintProperty(out, rules, "path", path_); |
| 535 PrintProperty(out, rules, "sourceTree", "<group>"); | 539 PrintProperty(out, rules, "sourceTree", "<group>"); |
| 536 out << indent_str << "};\n"; | 540 out << indent_str << "};\n"; |
| 537 } | 541 } |
| 538 | 542 |
| 539 // PBXNativeTarget ------------------------------------------------------------ | 543 // PBXNativeTarget ------------------------------------------------------------ |
| 540 | 544 |
| 541 PBXNativeTarget::PBXNativeTarget(const std::string& name, | 545 PBXNativeTarget::PBXNativeTarget(const std::string& name, |
| 542 const std::string& shell_script, | 546 const std::string& shell_script, |
| 543 const std::string& config_name, | 547 const std::string& config_name, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 PBXProject::PBXProject(const std::string& name, | 595 PBXProject::PBXProject(const std::string& name, |
| 592 const std::string& config_name, | 596 const std::string& config_name, |
| 593 const std::string& source_path, | 597 const std::string& source_path, |
| 594 const PBXAttributes& attributes) | 598 const PBXAttributes& attributes) |
| 595 : name_(name), config_name_(config_name), target_for_indexing_(nullptr) { | 599 : name_(name), config_name_(config_name), target_for_indexing_(nullptr) { |
| 596 attributes_["BuildIndependentTargetsInParallel"] = "YES"; | 600 attributes_["BuildIndependentTargetsInParallel"] = "YES"; |
| 597 | 601 |
| 598 main_group_.reset(new PBXGroup); | 602 main_group_.reset(new PBXGroup); |
| 599 sources_ = static_cast<PBXGroup*>( | 603 sources_ = static_cast<PBXGroup*>( |
| 600 main_group_->AddChild(base::MakeUnique<PBXGroup>(source_path, "Source"))); | 604 main_group_->AddChild(base::MakeUnique<PBXGroup>(source_path, "Source"))); |
| 605 sources_->set_is_source(true); |
| 601 products_ = static_cast<PBXGroup*>(main_group_->AddChild( | 606 products_ = static_cast<PBXGroup*>(main_group_->AddChild( |
| 602 base::MakeUnique<PBXGroup>(std::string(), "Product"))); | 607 base::MakeUnique<PBXGroup>(std::string(), "Product"))); |
| 603 main_group_->AddChild(base::MakeUnique<PBXGroup>(std::string(), "Build")); | 608 main_group_->AddChild(base::MakeUnique<PBXGroup>(std::string(), "Build")); |
| 604 | 609 |
| 605 configurations_.reset(new XCConfigurationList(config_name, attributes, this)); | 610 configurations_.reset(new XCConfigurationList(config_name, attributes, this)); |
| 606 } | 611 } |
| 607 | 612 |
| 608 PBXProject::~PBXProject() {} | 613 PBXProject::~PBXProject() {} |
| 609 | 614 |
| 610 void PBXProject::AddSourceFile(const std::string& source_path) { | 615 void PBXProject::AddSourceFile(const std::string& navigator_path, |
| 611 PBXFileReference* file_reference = sources_->AddSourceFile(source_path); | 616 const std::string& source_path) { |
| 617 PBXFileReference* file_reference = |
| 618 sources_->AddSourceFile(navigator_path, source_path); |
| 612 base::StringPiece ext = FindExtension(&source_path); | 619 base::StringPiece ext = FindExtension(&source_path); |
| 613 if (!IsSourceFileForIndexing(ext)) | 620 if (!IsSourceFileForIndexing(ext)) |
| 614 return; | 621 return; |
| 615 | 622 |
| 616 if (!target_for_indexing_) { | 623 if (!target_for_indexing_) { |
| 617 PBXAttributes attributes; | 624 PBXAttributes attributes; |
| 618 attributes["EXECUTABLE_PREFIX"] = ""; | 625 attributes["EXECUTABLE_PREFIX"] = ""; |
| 619 attributes["HEADER_SEARCH_PATHS"] = sources_->path(); | 626 attributes["HEADER_SEARCH_PATHS"] = sources_->path(); |
| 620 attributes["PRODUCT_NAME"] = name_; | 627 attributes["PRODUCT_NAME"] = name_; |
| 621 | 628 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 const std::string indent_str(indent, '\t'); | 866 const std::string indent_str(indent, '\t'); |
| 860 const IndentRules rules = {false, indent + 1}; | 867 const IndentRules rules = {false, indent + 1}; |
| 861 out << indent_str << Reference() << " = {\n"; | 868 out << indent_str << Reference() << " = {\n"; |
| 862 PrintProperty(out, rules, "isa", ToString(Class())); | 869 PrintProperty(out, rules, "isa", ToString(Class())); |
| 863 PrintProperty(out, rules, "buildConfigurations", configurations_); | 870 PrintProperty(out, rules, "buildConfigurations", configurations_); |
| 864 PrintProperty(out, rules, "defaultConfigurationIsVisible", 1u); | 871 PrintProperty(out, rules, "defaultConfigurationIsVisible", 1u); |
| 865 PrintProperty(out, rules, "defaultConfigurationName", | 872 PrintProperty(out, rules, "defaultConfigurationName", |
| 866 configurations_[0]->Name()); | 873 configurations_[0]->Name()); |
| 867 out << indent_str << "};\n"; | 874 out << indent_str << "};\n"; |
| 868 } | 875 } |
| OLD | NEW |