MCPcopy Create free account
hub / github.com/MaskRay/ccls / ProjectProcessor

Class ProjectProcessor

src/project.cc:68–132  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

66};
67
68struct ProjectProcessor {
69 Project::Folder &folder;
70 std::unordered_set<size_t> command_set;
71 StringSet<> exclude_args;
72 std::vector<GlobPattern> exclude_globs;
73
74 ProjectProcessor(Project::Folder &folder) : folder(folder) {
75 for (auto &arg : g_config->clang.excludeArgs)
76 if (arg.find_first_of("?*[") == std::string::npos)
77 exclude_args.insert(arg);
78 else if (Expected<GlobPattern> glob_or_err = GlobPattern::create(arg))
79 exclude_globs.push_back(std::move(*glob_or_err));
80 else
81 LOG_S(WARNING) << toString(glob_or_err.takeError());
82 }
83
84 bool excludesArg(StringRef arg, int &i) {
85 if (arg.startswith("-M")) {
86 if (arg == "-MF" || arg == "-MT" || arg == "-MQ")
87 i++;
88 return true;
89 }
90 if (arg == "-Xclang") {
91 i++;
92 return true;
93 }
94 return exclude_args.count(arg) || any_of(exclude_globs, [&](const GlobPattern &glob) { return glob.match(arg); });
95 }
96
97 // Expand %c %cpp ... in .ccls
98 void process(Project::Entry &entry) {
99 std::vector<const char *> args(entry.args.begin(), entry.args.begin() + entry.compdb_size);
100 auto [lang, header] = lookupExtension(entry.filename);
101 for (int i = entry.compdb_size; i < entry.args.size(); i++) {
102 const char *arg = entry.args[i];
103 StringRef a(arg);
104 if (a[0] == '%') {
105 bool ok = false;
106 for (;;) {
107 if (a.consume_front("%c "))
108 ok |= lang == LanguageId::C;
109 else if (a.consume_front("%h "))
110 ok |= lang == LanguageId::C && header;
111 else if (a.consume_front("%cpp "))
112 ok |= lang == LanguageId::Cpp;
113 else if (a.consume_front("%cu "))
114 ok |= lang == LanguageId::Cuda;
115 else if (a.consume_front("%hpp "))
116 ok |= lang == LanguageId::Cpp && header;
117 else if (a.consume_front("%objective-c "))
118 ok |= lang == LanguageId::ObjC;
119 else if (a.consume_front("%objective-cpp "))
120 ok |= lang == LanguageId::ObjCpp;
121 else
122 break;
123 }
124 if (ok)
125 args.push_back(a.data());

Callers 1

findEntryMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected