| // Copyright 2016 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "tools/gn/bundle_file_rule.h" | 
 |  | 
 | #include "tools/gn/output_file.h" | 
 | #include "tools/gn/settings.h" | 
 | #include "tools/gn/substitution_pattern.h" | 
 | #include "tools/gn/substitution_writer.h" | 
 | #include "tools/gn/target.h" | 
 |  | 
 | BundleFileRule::BundleFileRule(const Target* bundle_data_target, | 
 |                                const std::vector<SourceFile> sources, | 
 |                                const SubstitutionPattern& pattern) | 
 |     : target_(bundle_data_target), sources_(sources), pattern_(pattern) { | 
 |   // target_ may be null during testing. | 
 |   DCHECK(!target_ || target_->output_type() == Target::BUNDLE_DATA); | 
 | } | 
 |  | 
 | BundleFileRule::BundleFileRule(const BundleFileRule& other) = default; | 
 |  | 
 | BundleFileRule::~BundleFileRule() = default; | 
 |  | 
 | SourceFile BundleFileRule::ApplyPatternToSource( | 
 |     const Settings* settings, | 
 |     const BundleData& bundle_data, | 
 |     const SourceFile& source_file) const { | 
 |   std::string output_path; | 
 |   for (const auto& subrange : pattern_.ranges()) { | 
 |     switch (subrange.type) { | 
 |       case SUBSTITUTION_LITERAL: | 
 |         output_path.append(subrange.literal); | 
 |         break; | 
 |       case SUBSTITUTION_BUNDLE_ROOT_DIR: | 
 |         output_path.append(bundle_data.root_dir().value()); | 
 |         break; | 
 |       case SUBSTITUTION_BUNDLE_CONTENTS_DIR: | 
 |         output_path.append(bundle_data.contents_dir().value()); | 
 |         break; | 
 |       case SUBSTITUTION_BUNDLE_RESOURCES_DIR: | 
 |         output_path.append(bundle_data.resources_dir().value()); | 
 |         break; | 
 |       case SUBSTITUTION_BUNDLE_EXECUTABLE_DIR: | 
 |         output_path.append(bundle_data.executable_dir().value()); | 
 |         break; | 
 |       case SUBSTITUTION_BUNDLE_PLUGINS_DIR: | 
 |         output_path.append(bundle_data.plugins_dir().value()); | 
 |         break; | 
 |       default: | 
 |         output_path.append(SubstitutionWriter::GetSourceSubstitution( | 
 |             target_, target_->settings(), source_file, subrange.type, | 
 |             SubstitutionWriter::OUTPUT_ABSOLUTE, SourceDir())); | 
 |         break; | 
 |     } | 
 |   } | 
 |   return SourceFile(SourceFile::SWAP_IN, &output_path); | 
 | } | 
 |  | 
 | OutputFile BundleFileRule::ApplyPatternToSourceAsOutputFile( | 
 |     const Settings* settings, | 
 |     const BundleData& bundle_data, | 
 |     const SourceFile& source_file) const { | 
 |   return OutputFile(settings->build_settings(), | 
 |                     ApplyPatternToSource(settings, bundle_data, source_file)); | 
 | } |