• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2025 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 #ifndef PRECISE_H_
6 #define PRECISE_H_
7 
8 #include <climits>
9 #include <iostream>
10 #include <string>
11 #include <vector>
12 
13 #include "base/values.h"
14 #include "gn/build_settings.h"
15 #include "gn/config.h"
16 #include "gn/filesystem_utils.h"
17 #include "gn/functions.h"
18 #include "gn/graph/include/module.h"
19 #include "gn/graph/include/node.h"
20 #include "gn/item.h"
21 #include "gn/label_ptr.h"
22 #include "gn/parse_tree.h"
23 #include "gn/settings.h"
24 #include "gn/substitution_writer.h"
25 #include "gn/target.h"
26 #include "gn/value.h"
27 
28 class PreciseManager {
29 public:
Init(const std::string & buildDir,const Value * preciseConfig)30     static void Init(const std::string& buildDir, const Value* preciseConfig)
31     {
32         if (instance_ != nullptr) {
33             return;
34         }
35         if (!preciseConfig || preciseConfig->string_value().empty()) {
36             std::cout << "precise config null." << std::endl;
37             return;
38         }
39         instance_ = new PreciseManager(buildDir, preciseConfig->string_value());
40     }
41 
GetInstance()42     static PreciseManager* GetInstance()
43     {
44         return instance_;
45     }
46 
47     Node *GetModule(const std::string& name);
48     void AddModule(std::string name, Node* node);
49     void GeneratPreciseTargets();
50 
51 private:
52     static PreciseManager* instance_;
53     std::map<std::string, Node*> moduleList_;
54     bool CheckContains(const std::string& file, bool isHFile);
55     bool CheckIncludeInConfig(const Config* config);
56     bool CheckIncludeInTarget(const Item* item);
57     bool CheckSourceInTarget(const Item* item);
58     bool CheckConfigInfo(const UniqueVector<LabelConfigPair>& configs);
59     bool CheckPrivateConfigs(const Item* item);
60     bool CheckPublicConfigs(const Item* item);
61     bool CheckAllDepConfigs(const Item* item);
62     bool CheckModuleInGn(const std::string& label);
63     bool CheckModuleMatch(const std::string& label);
64     bool FilterType(const Item* item);
65     bool IsDependent(const Node* node);
66     bool IsIgnore(const std::string& name);
67     bool IsInMaxRange(const std::string& name);
68     bool IsContainModifiedFiles(const std::string& file, bool isHFile);
69     bool IsFirstRecord(const std::vector<std::string>& result, const std::string& name);
70     bool IsTargetTypeMatch(const Item* item);
71     bool IsTestOnlyMatch(const Item* item);
72     void EnsurePathExists(const std::string& filePath);
73     void PreciseSearch(const Node* node, std::vector<std::string>& result, std::vector<std::string>& log,
74         bool forGn, int depth, int maxDepth);
75     void WriteFile(const std::string& path, const std::string& info);
76     void WritePreciseTargets(const std::vector<std::string>& result, const std::vector<std::string>& log);
PreciseManager()77     PreciseManager() {}
78     PreciseManager(const std::string& outDir, const std::string& preciseConfig);
79     PreciseManager &operator = (const PreciseManager &) = delete;
80 };
81 
82 #endif // PRECISE_H_