private NbGradleModel parseModel(
        FetchedProjectModels projectModels, Map<File, ProjectModelsOfExtensions> extensionModels) {
      Throwable issue = projectModels.getIssue();
      if (issue != null) {
        issues.add(ModelLoadIssues.projectModelLoadError(mainProject, projectModels, null, issue));
      }

      NbGradleMultiProjectDef projectDef =
          new NbGradleMultiProjectDef(projectModels.getProjectDef());
      NbGenericModelInfo genericInfo =
          new NbGenericModelInfo(projectDef, modelFetcher.getSettingsFile());
      NbGradleModel.Builder result = new NbGradleModel.Builder(genericInfo);

      File projectDir = genericInfo.getProjectDir();

      ProjectExtensionModelCache projectCache = cache.tryGetProjectCache(projectDir);

      for (NbGradleExtensionRef extension : extensions) {
        String extensionName = extension.getName();

        CachedModel cachedModel =
            projectCache != null ? projectCache.tryGetModel(extensionName) : null;

        Object extensionModel;
        if (cachedModel != null) {
          extensionModel = cachedModel.model;
        } else {
          ModelLoadResult modelLoadResult = modelLoadResultCache.get(extensionName);
          if (modelLoadResult == null) {
            modelLoadResult = getModelLoadResult(extension, projectDir, extensionModels);
            modelLoadResultCache.put(extensionName, modelLoadResult);
          } else {
            modelLoadResult = modelLoadResult.withMainProject(projectDir);
          }

          ParsedModel<?> parsedModels = extension.parseModel(modelLoadResult);
          extensionModel = parsedModels.getMainModel();

          for (Map.Entry<File, ?> entry : parsedModels.getOtherProjectsModel().entrySet()) {
            cache.getProjectCache(entry.getKey()).addModel(extensionName, entry.getValue());
          }
        }

        result.setModelForExtension(extension, extensionModel);
      }

      return result.create();
    }
    public ProjectModelFetcher(NbGradleProject project, GradleTarget gradleTarget) {
      this.settingsFile =
          NbGenericModelInfo.findSettingsGradle(project.getProjectDirectoryAsFile());

      List<NbGradleExtensionRef> extensions = project.getExtensionRefs();
      this.toolingModelNeeds = CollectionUtils.newHashMap(extensions.size());

      Map<Object, List<GradleBuildInfoQuery<?>>> buildInfoRequests = Collections.emptyMap();

      Map<Object, List<GradleProjectInfoQuery<?>>> projectInfoRequests = new HashMap<>();

      List<Class<?>> models = new LinkedList<>();
      for (NbGradleExtensionRef extensionRef : extensions) {
        String extensionName = extensionRef.getName();

        GradleModelDefQuery2 modelQuery = extensionRef.getModelNeeds().getQuery2();
        GradleModelDef modelDef = modelQuery.getModelDef(gradleTarget);

        models.addAll(modelDef.getToolingModels());
        addAllToMultiMap(extensionName, modelDef.getProjectInfoQueries(), projectInfoRequests);
        addAllToMultiMap(extensionName, modelDef.getToolingModels(), toolingModelNeeds);
      }

      modelFetcher = new GenericModelFetcher(buildInfoRequests, projectInfoRequests, models);
    }