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)