Home | History | Annotate | Download | only in gn
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "tools/gn/source_dir.h"
      6 
      7 #include "base/logging.h"
      8 #include "tools/gn/filesystem_utils.h"
      9 #include "tools/gn/source_file.h"
     10 
     11 namespace {
     12 
     13 void AssertValueSourceDirString(const std::string& s) {
     14   DCHECK(!s.empty());
     15   DCHECK(s[0] == '/');
     16   DCHECK(EndsWithSlash(s));
     17 }
     18 
     19 }  // namespace
     20 
     21 SourceDir::SourceDir() {
     22 }
     23 
     24 SourceDir::SourceDir(const base::StringPiece& p)
     25     : value_(p.data(), p.size()) {
     26   if (!EndsWithSlash(value_))
     27     value_.push_back('/');
     28   AssertValueSourceDirString(value_);
     29 }
     30 
     31 SourceDir::~SourceDir() {
     32 }
     33 
     34 SourceFile SourceDir::ResolveRelativeFile(const base::StringPiece& p) const {
     35   SourceFile ret;
     36 
     37   // It's an error to resolve an empty string or one that is a directory
     38   // (indicated by a trailing slash) because this is the function that expects
     39   // to return a file.
     40   if (p.empty() || (p.size() > 0 && p[p.size() - 1] == '/'))
     41     return SourceFile();
     42   if (p[0] == '/') {
     43     // Absolute path.
     44     ret.value_.assign(p.data(), p.size());
     45     return ret;
     46   }
     47 
     48   ret.value_.reserve(value_.size() + p.size());
     49   ret.value_.assign(value_);
     50   ret.value_.append(p.data(), p.size());
     51 
     52   NormalizePath(&ret.value_);
     53   return ret;
     54 }
     55 
     56 SourceDir SourceDir::ResolveRelativeDir(const base::StringPiece& p) const {
     57   SourceDir ret;
     58 
     59   if (p.empty())
     60     return ret;
     61   if (p[0] == '/') {
     62     // Absolute path.
     63     return SourceDir(p);
     64   }
     65 
     66   ret.value_.reserve(value_.size() + p.size());
     67   ret.value_.assign(value_);
     68   ret.value_.append(p.data(), p.size());
     69 
     70   NormalizePath(&ret.value_);
     71   if (!EndsWithSlash(ret.value_))
     72     ret.value_.push_back('/');
     73   AssertValueSourceDirString(ret.value_);
     74 
     75   return ret;
     76 }
     77 
     78 base::FilePath SourceDir::Resolve(const base::FilePath& source_root) const {
     79   if (is_null())
     80     return base::FilePath();
     81 
     82   std::string converted;
     83   if (is_system_absolute()) {
     84     converted = value_;
     85     ConvertPathToSystem(&converted);
     86     return base::FilePath(UTF8ToFilePath(converted));
     87   }
     88 
     89   // String the double-leading slash for source-relative paths.
     90   converted.assign(&value_[2], value_.size() - 2);
     91   ConvertPathToSystem(&converted);
     92   return source_root.Append(UTF8ToFilePath(converted));
     93 }
     94 
     95 void SourceDir::SwapInValue(std::string* v) {
     96   value_.swap(*v);
     97   AssertValueSourceDirString(value_);
     98 }
     99