| 232 | } |
| 233 | |
| 234 | static CMakeProjectData parseCodeModel(const QJsonObject& codeModel, const QDir& replyDir, |
| 235 | StringInterner&stringInterner, PathInterner& sourcePathInterner, PathInterner& buildPathInterner) |
| 236 | { |
| 237 | CMakeProjectData ret; |
| 238 | // for now, we only use the first available configuration and don't support multi configurations |
| 239 | const auto configuration = codeModel.value(QLatin1String("configurations")).toArray().at(0).toObject(); |
| 240 | const auto targets = configuration.value(QLatin1String("targets")).toArray(); |
| 241 | const auto directories = configuration.value(QLatin1String("directories")).toArray(); |
| 242 | for (const auto& directoryValue : directories) { |
| 243 | const auto directory = directoryValue.toObject(); |
| 244 | if (!directory.contains(QLatin1String("targetIndexes"))) { |
| 245 | continue; |
| 246 | } |
| 247 | const auto dirSourcePath = sourcePathInterner.internPath(directory.value(QLatin1String("source")).toString()); |
| 248 | auto& dirTargets = ret.targets[dirSourcePath]; |
| 249 | for (const auto& targetIndex : directory.value(QLatin1String("targetIndexes")).toArray()) { |
| 250 | const auto jsonTarget = targets.at(targetIndex.toInt(-1)).toObject(); |
| 251 | if (jsonTarget.isEmpty()) { |
| 252 | continue; |
| 253 | } |
| 254 | const auto targetFile = jsonTarget.value(QLatin1String("jsonFile")).toString(); |
| 255 | const auto target = parseTarget(parseFile(replyDir.absoluteFilePath(targetFile)), |
| 256 | stringInterner, sourcePathInterner, buildPathInterner, |
| 257 | ret.compilationData); |
| 258 | if (target.name.isEmpty()) { |
| 259 | continue; |
| 260 | } |
| 261 | dirTargets.append(target); |
| 262 | } |
| 263 | } |
| 264 | ret.compilationData.isValid = !codeModel.isEmpty(); |
| 265 | ret.compilationData.rebuildFileForFolderMapping(); |
| 266 | if (!ret.compilationData.isValid) { |
| 267 | qCWarning(CMAKE) << "failed to parse code model" << codeModel; |
| 268 | } |
| 269 | return ret; |
| 270 | } |
| 271 | |
| 272 | /// @return source CMake files (e.g. CMakeLists.txt, *.cmake), modifying which should trigger reloading the project. |
| 273 | static QSet<Path> parseCMakeFiles(const QJsonObject& cmakeFiles, PathInterner& sourcePathInterner, |
no test coverage detected