| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/err.h" | 5 #include "tools/gn/err.h" |
| 6 #include "tools/gn/filesystem_utils.h" | 6 #include "tools/gn/filesystem_utils.h" |
| 7 #include "tools/gn/functions.h" | 7 #include "tools/gn/functions.h" |
| 8 #include "tools/gn/parse_tree.h" | 8 #include "tools/gn/parse_tree.h" |
| 9 #include "tools/gn/scope.h" | 9 #include "tools/gn/scope.h" |
| 10 #include "tools/gn/value.h" | 10 #include "tools/gn/value.h" |
| 11 | 11 |
| 12 namespace functions { | 12 namespace functions { |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 // Corresponds to the various values of "what" in the function call. | 16 // Corresponds to the various values of "what" in the function call. |
| 17 enum What { | 17 enum What { |
| 18 WHAT_FILE, | 18 WHAT_FILE, |
| 19 WHAT_NAME, | 19 WHAT_NAME, |
| 20 WHAT_EXTENSION, | 20 WHAT_EXTENSION, |
| 21 WHAT_DIR, | 21 WHAT_DIR, |
| 22 WHAT_ABSPATH, | 22 WHAT_ABSPATH, |
| 23 WHAT_GEN_DIR, | 23 WHAT_GEN_DIR, |
| 24 WHAT_OUT_DIR, | 24 WHAT_OUT_DIR, |
| 25 }; | 25 }; |
| 26 | 26 |
| 27 // Returns the directory containing the input (resolving it against the | 27 // Returns the directory containing the input (resolving it against the |
| 28 // |current_dir|), regardless of whether the input is a directory or a file. | 28 // |current_dir|), regardless of whether the input is a directory or a file. |
| 29 SourceDir DirForInput(const SourceDir& current_dir, | 29 SourceDir DirForInput(const Settings* settings, |
| 30 const SourceDir& current_dir, |
| 30 const std::string& input_string) { | 31 const std::string& input_string) { |
| 31 if (!input_string.empty() && input_string[input_string.size() - 1] == '/') { | 32 if (!input_string.empty() && input_string[input_string.size() - 1] == '/') { |
| 32 // Input is a directory. | 33 // Input is a directory. |
| 33 return current_dir.ResolveRelativeDir(input_string); | 34 return current_dir.ResolveRelativeDir(input_string, |
| 35 settings->build_settings()->root_path()); |
| 34 } | 36 } |
| 35 | 37 |
| 36 // Input is a directory. | 38 // Input is a directory. |
| 37 return current_dir.ResolveRelativeFile(input_string).GetDir(); | 39 return current_dir.ResolveRelativeFile(input_string, |
| 40 settings->build_settings()->root_path()).GetDir(); |
| 38 } | 41 } |
| 39 | 42 |
| 40 std::string GetOnePathInfo(const Settings* settings, | 43 std::string GetOnePathInfo(const Settings* settings, |
| 41 const SourceDir& current_dir, | 44 const SourceDir& current_dir, |
| 42 What what, | 45 What what, |
| 43 const Value& input, | 46 const Value& input, |
| 44 Err* err) { | 47 Err* err) { |
| 45 if (!input.VerifyTypeIs(Value::STRING, err)) | 48 if (!input.VerifyTypeIs(Value::STRING, err)) |
| 46 return std::string(); | 49 return std::string(); |
| 47 const std::string& input_string = input.string_value(); | 50 const std::string& input_string = input.string_value(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 74 // slashes can't be trimmed. | 77 // slashes can't be trimmed. |
| 75 if (dir_incl_slash == "/") | 78 if (dir_incl_slash == "/") |
| 76 return std::string("/."); | 79 return std::string("/."); |
| 77 if (dir_incl_slash == "//") | 80 if (dir_incl_slash == "//") |
| 78 return std::string("//."); | 81 return std::string("//."); |
| 79 return dir_incl_slash.substr(0, dir_incl_slash.size() - 1).as_string(); | 82 return dir_incl_slash.substr(0, dir_incl_slash.size() - 1).as_string(); |
| 80 } | 83 } |
| 81 case WHAT_GEN_DIR: { | 84 case WHAT_GEN_DIR: { |
| 82 return DirectoryWithNoLastSlash( | 85 return DirectoryWithNoLastSlash( |
| 83 GetGenDirForSourceDir(settings, | 86 GetGenDirForSourceDir(settings, |
| 84 DirForInput(current_dir, input_string))); | 87 DirForInput(settings, current_dir, |
| 88 input_string))); |
| 85 } | 89 } |
| 86 case WHAT_OUT_DIR: { | 90 case WHAT_OUT_DIR: { |
| 87 return DirectoryWithNoLastSlash( | 91 return DirectoryWithNoLastSlash( |
| 88 GetOutputDirForSourceDir(settings, | 92 GetOutputDirForSourceDir(settings, |
| 89 DirForInput(current_dir, input_string))); | 93 DirForInput(settings, current_dir, |
| 94 input_string))); |
| 90 } | 95 } |
| 91 case WHAT_ABSPATH: { | 96 case WHAT_ABSPATH: { |
| 92 if (!input_string.empty() && input_string[input_string.size() - 1] == '/') | 97 if (!input_string.empty() && |
| 93 return current_dir.ResolveRelativeDir(input_string).value(); | 98 input_string[input_string.size() - 1] == '/') { |
| 94 else | 99 return current_dir.ResolveRelativeDir(input_string, |
| 95 return current_dir.ResolveRelativeFile(input_string).value(); | 100 settings->build_settings()->root_path()).value(); |
| 101 } else { |
| 102 return current_dir.ResolveRelativeFile(input_string, |
| 103 settings->build_settings()->root_path()).value(); |
| 104 } |
| 96 } | 105 } |
| 97 default: | 106 default: |
| 98 NOTREACHED(); | 107 NOTREACHED(); |
| 99 return std::string(); | 108 return std::string(); |
| 100 } | 109 } |
| 101 } | 110 } |
| 102 | 111 |
| 103 } // namespace | 112 } // namespace |
| 104 | 113 |
| 105 const char kGetPathInfo[] = "get_path_info"; | 114 const char kGetPathInfo[] = "get_path_info"; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 return Value(); | 238 return Value(); |
| 230 } | 239 } |
| 231 return result; | 240 return result; |
| 232 } | 241 } |
| 233 | 242 |
| 234 *err = Err(args[0], "Path must be a string or a list of strings."); | 243 *err = Err(args[0], "Path must be a string or a list of strings."); |
| 235 return Value(); | 244 return Value(); |
| 236 } | 245 } |
| 237 | 246 |
| 238 } // namespace functions | 247 } // namespace functions |
| OLD | NEW |