summaryrefslogtreecommitdiff
path: root/gn/src/gn/analyzer.h
diff options
context:
space:
mode:
Diffstat (limited to 'gn/src/gn/analyzer.h')
-rw-r--r--gn/src/gn/analyzer.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/gn/src/gn/analyzer.h b/gn/src/gn/analyzer.h
new file mode 100644
index 00000000000..2ffdb527038
--- /dev/null
+++ b/gn/src/gn/analyzer.h
@@ -0,0 +1,104 @@
+// 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.
+
+#ifndef TOOLS_GN_ANALYZER_H_
+#define TOOLS_GN_ANALYZER_H_
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include "gn/builder.h"
+#include "gn/item.h"
+#include "gn/label.h"
+#include "gn/source_file.h"
+
+// An Analyzer can answer questions about a build graph. It is used
+// to answer queries for the `refs` and `analyze` commands, where we
+// need to look at the graph in ways that can't easily be determined
+// from just a single Target.
+class Analyzer {
+ public:
+ Analyzer(const Builder& builder,
+ const SourceFile& build_config_file,
+ const SourceFile& dot_file,
+ const SourceFileSet& build_args_dependency_files);
+ ~Analyzer();
+
+ // Figures out from a Buider and a JSON-formatted string containing lists
+ // of files and targets, which targets would be affected by modifications
+ // to the files . See the help text for the analyze command (kAnalyze_Help)
+ // for the specification of the input and output string formats and the
+ // expected behavior of the method.
+ std::string Analyze(const std::string& input, Err* err) const;
+
+ private:
+ // Returns the set of all items that might be affected, directly or
+ // indirectly, by modifications to the given source files.
+ std::set<const Item*> GetAllAffectedItems(
+ const std::set<const SourceFile*>& source_files) const;
+
+ // Returns the set of labels that do not refer to objects in the graph.
+ std::set<Label> InvalidLabels(const std::set<Label>& labels) const;
+
+ // Returns the set of all targets that have a label in the given set.
+ // Invalid (or missing) labels will be ignored.
+ std::set<const Target*> TargetsFor(const std::set<Label>& labels) const;
+
+ // Returns a filtered set of the given targets, meaning that for each of the
+ // given targets,
+ // - if the target is not a group, add it to the set
+ // - if the target is a group, recursively filter each dependency and add
+ // its filtered results to the set.
+ //
+ // For example, if we had:
+ //
+ // group("foobar") { deps = [ ":foo", ":bar" ] }
+ // group("bar") { deps = [ ":baz", ":quux" ] }
+ // executable("foo") { ... }
+ // executable("baz") { ... }
+ // executable("quux") { ... }
+ //
+ // Then the filtered version of {"foobar"} would be {":foo", ":baz",
+ // ":quux"}. This is used by the analyze command in order to only build
+ // the affected dependencies of a group (and not also build the unaffected
+ // ones).
+ //
+ // This filtering behavior is also known as "pruning" the list of targets.
+ std::set<const Target*> Filter(const std::set<const Target*>& targets) const;
+
+ // Filter an individual target and adds the results to filtered
+ // (see Filter(), above).
+ void FilterTarget(const Target*,
+ std::set<const Target*>* seen,
+ std::set<const Target*>* filtered) const;
+
+ bool ItemRefersToFile(const Item* item, const SourceFile* file) const;
+
+ void AddItemsDirectlyReferringToFile(
+ const SourceFile* file,
+ std::set<const Item*>* affected_items) const;
+
+ void AddAllItemsReferringToItem(const Item* item,
+ std::set<const Item*>* affected_items) const;
+
+ // Main GN files stand for files whose context are used globally to execute
+ // every other build files, this list includes dot file, build config file,
+ // build args files etc.
+ bool WereMainGNFilesModified(
+ const std::set<const SourceFile*>& modified_files) const;
+
+ std::vector<const Item*> all_items_;
+ std::map<Label, const Item*> labels_to_items_;
+ Label default_toolchain_;
+
+ // Maps items to the list of items that depend on them.
+ std::multimap<const Item*, const Item*> dep_map_;
+
+ const SourceFile build_config_file_;
+ const SourceFile dot_file_;
+ const SourceFileSet build_args_dependency_files_;
+};
+
+#endif // TOOLS_GN_ANALYZER_H_