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_