Index: tools/gn/visual_studio_writer.cc |
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc |
index 7dedd4d302066e1778bf3128e87ac9f86aa98599..401782f5217434c4d6965e5211e54c71ea4ed8b9 100644 |
--- a/tools/gn/visual_studio_writer.cc |
+++ b/tools/gn/visual_studio_writer.cc |
@@ -8,6 +8,7 @@ |
#include <iterator> |
#include <map> |
#include <memory> |
+#include <queue> |
#include <set> |
#include <string> |
@@ -18,6 +19,7 @@ |
#include "tools/gn/commands.h" |
#include "tools/gn/config.h" |
#include "tools/gn/config_values_extractors.h" |
+#include "tools/gn/deps_iterator.h" |
#include "tools/gn/filesystem_utils.h" |
#include "tools/gn/label_pattern.h" |
#include "tools/gn/parse_tree.h" |
@@ -163,6 +165,46 @@ base::StringPiece FindParentDir(const std::string* path) { |
return base::StringPiece(); |
} |
+bool FilterTargets(const BuildSettings* build_settings, |
+ Builder* builder, |
+ const std::string& dir_filters, |
+ std::vector<const Target*>* targets, |
+ Err* err) { |
+ if (dir_filters.empty()) { |
+ *targets = builder->GetAllResolvedTargets(); |
+ return true; |
+ } |
+ |
+ std::vector<LabelPattern> filters; |
+ if (!commands::FilterPatternsFromString(build_settings, dir_filters, &filters, |
+ err)) |
+ return false; |
+ |
+ commands::FilterTargetsByPatterns(builder->GetAllResolvedTargets(), filters, |
+ targets); |
+ |
+ std::set<Label> labels; |
+ std::queue<const Target*> to_process; |
+ for (const Target* target : *targets) { |
+ labels.insert(target->label()); |
+ to_process.push(target); |
+ } |
+ |
+ while (!to_process.empty()) { |
+ const Target* target = to_process.front(); |
+ to_process.pop(); |
+ for (const auto& pair : target->GetDeps(Target::DEPS_ALL)) { |
+ if (labels.find(pair.label) == labels.end()) { |
+ targets->push_back(pair.ptr); |
+ to_process.push(pair.ptr); |
+ labels.insert(pair.label); |
+ } |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
} // namespace |
VisualStudioWriter::SolutionEntry::SolutionEntry(const std::string& _name, |
@@ -233,18 +275,8 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, |
const std::string& dir_filters, |
Err* err) { |
std::vector<const Target*> targets; |
- if (dir_filters.empty()) { |
- targets = builder->GetAllResolvedTargets(); |
- } else { |
- std::vector<LabelPattern> filters; |
- if (!commands::FilterPatternsFromString(build_settings, dir_filters, |
- &filters, err)) { |
- return false; |
- } |
- |
- commands::FilterTargetsByPatterns(builder->GetAllResolvedTargets(), filters, |
- &targets); |
- } |
+ if (!FilterTargets(build_settings, builder, dir_filters, &targets, err)) |
+ return false; |
const char* config_platform = "Win32"; |