Expand %c %cpp ... in .ccls
| 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()); |
| 126 | } else if (!excludesArg(a, i)) { |
| 127 | args.push_back(arg); |
| 128 | } |
| 129 | } |
| 130 | entry.args = args; |
| 131 | } |
| 132 | }; |
| 133 | |
| 134 | std::vector<const char *> readCompilerArgumentsFromFile(const std::string &path) { |
no test coverage detected