override fun openInExistingProject()

in intellij-plugin/educational-core/src/com/jetbrains/edu/learning/stepik/hyperskill/courseGeneration/HyperskillOpenInIdeRequestHandler.kt [40:84]


  override fun openInExistingProject(
    request: HyperskillOpenRequest,
    findProject: ((Course) -> Boolean) -> Pair<Project, Course>?
  ): Project? {
    when (request) {
      is HyperskillOpenStepRequestBase -> {
        val stepId = request.stepId
        val stepSource = getStepSource(stepId, request.isLanguageSelectedByUser)
        val isAndroidEnvRequired = stepSource.framework == EduNames.ANDROID
        val courseFilter: (Course) -> Boolean = if (isAndroidEnvRequired) ::hasAndroidEnvironment else { _ -> true }
        val (project, course) = findExistingProject(findProject, request, courseFilter) ?: return null
        val hyperskillCourse = course as HyperskillCourse
        hyperskillCourse.addProblemsWithTopicWithFiles(project, stepSource)
        hyperskillCourse.selectedProblem = stepId
        runInEdt {
          requestFocus()
          navigateToStep(project, hyperskillCourse, stepId)
        }
        synchronizeProjectOnStepOpening(project, hyperskillCourse, stepId)
        return project
      }

      is HyperskillOpenProjectStageRequest -> {
        val (project, course) = findExistingProject(findProject, request) ?: return null
        val hyperskillCourse = course as HyperskillCourse
        if (hyperskillCourse.getProjectLesson() == null) {
          computeUnderProgress(project, EduCoreBundle.message("hyperskill.loading.stages")) {
            HyperskillConnector.getInstance().loadStages(hyperskillCourse)
          }
          hyperskillCourse.init(false)
          val projectLesson = hyperskillCourse.getProjectLesson() ?: return null
          val courseDir = project.courseDir
          GeneratorUtils.createLesson(project, projectLesson, courseDir)
          GeneratorUtils.unpackAdditionalFiles(CourseInfoHolder.fromCourse(course, courseDir), ALL_FILES)
          YamlFormatSynchronizer.saveAll(project)
          course.configurator?.courseBuilder?.refreshProject(project, RefreshCause.DEPENDENCIES_UPDATED)
          synchronizeProjectOnStageOpening(project, hyperskillCourse, projectLesson.taskList)
        }
        course.selectedStage = request.stageId
        runInEdt { openSelectedStage(hyperskillCourse, project) }
        return project
      }

    }
  }