source_file.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file. 48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "tools/gn/source_file.h" 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/logging.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "build/build_config.h" 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "tools/gn/filesystem_utils.h" 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "tools/gn/source_dir.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SourceFile::SourceFile() { 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SourceFile::SourceFile(const base::StringPiece& p) 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : value_(p.data(), p.size()) { 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!value_.empty()); 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(value_[0] == '/'); 198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!EndsWithSlash(value_)); 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SourceFile::~SourceFile() { 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)std::string SourceFile::GetName() const { 268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_null()) 278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return std::string(); 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(value_.find('/') != std::string::npos); 308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) size_t last_slash = value_.rfind('/'); 318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return std::string(&value_[last_slash + 1], 328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) value_.size() - last_slash - 1); 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SourceDir SourceFile::GetDir() const { 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_null()) 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return SourceDir(); 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(value_.find('/') != std::string::npos); 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) size_t last_slash = value_.rfind('/'); 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return SourceDir(base::StringPiece(&value_[0], last_slash + 1)); 428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath SourceFile::Resolve(const base::FilePath& source_root) const { 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_null()) 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return base::FilePath(); 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string converted; 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_WIN) 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_system_absolute()) { 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) converted.assign(&value_[1], value_.size() - 1); 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(converted.size() > 2 && converted[1] == ':') 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) << "Expecting Windows absolute file path with a drive letter: " 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) << value_; 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return base::FilePath(UTF8ToFilePath(converted)); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) converted.assign(&value_[2], value_.size() - 2); 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ConvertPathToSystem(&converted); 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return source_root.Append(UTF8ToFilePath(converted)); 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_system_absolute()) 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return base::FilePath(value_); 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) converted.assign(&value_[2], value_.size() - 2); 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return source_root.Append(converted); 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)