in intellij-plugin/educational-core/src/com/jetbrains/edu/learning/stepik/hyperskill/courseGeneration/HyperskillOpenInIdeRequestHandler.kt [137:194]
fun createHyperskillCourse(
request: HyperskillOpenRequest,
hyperskillLanguage: String,
hyperskillProject: HyperskillProject
): Result<HyperskillCourse, CourseValidationResult> {
val (languageId, languageVersion) = HyperskillLanguages.getLanguageIdAndVersion(hyperskillLanguage)
?: return Err(
ValidationErrorMessage(
EduCoreBundle.message(
"hyperskill.unsupported.language",
hyperskillLanguage
)
)
)
if (!hyperskillProject.useIde) {
return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("hyperskill.project.not.supported", HYPERSKILL_PROJECTS_URL)))
}
val eduEnvironment = hyperskillProject.eduEnvironment
?: return Err(ValidationErrorMessage("Unsupported environment ${hyperskillProject.environment}"))
if (request is HyperskillOpenStepWithProjectRequest) {
// This condition is about opening e.g. Python problem with chosen Kotlin's project,
// otherwise - open Kotlin problem in current Kotlin project itself later below
if (hyperskillLanguage != hyperskillProject.language) {
return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))
}
// This is about opening Kotlin problem with currently chosen Android's project
// But all Android projects are always Kotlin one's
// So it should be possible to open problem in IntelliJ IDEA too e.g. (EDU-4641)
if (eduEnvironment == EduNames.ANDROID && hyperskillLanguage == KOTLIN) {
return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))
}
// EDU-5994: if Step has a field 'framework' == 'Android', it should be opened only in Android Studio
// as an Android project.
val stepSource = getStepSource(request.stepId, request.isLanguageSelectedByUser)
// When the user has selected project on Hyperskill, the Plugin has to check if it is an Android project,
// if not: a new one should be created.
if (stepSource.framework == EduNames.ANDROID && eduEnvironment != EduNames.ANDROID) {
if (!EduUtilsKt.isAndroidStudio()) {
return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("rest.service.android.not.supported")))
}
return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion, EduNames.ANDROID))
}
}
if (request is HyperskillOpenStepRequest) return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))
// Android projects must be opened in Android Studio only
if (eduEnvironment == EduNames.ANDROID && !EduUtilsKt.isAndroidStudio()) {
return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("rest.service.android.not.supported")))
}
val hyperskillCourse = HyperskillCourseCreator.createHyperskillCourse(hyperskillProject, languageId, languageVersion, eduEnvironment)
return Ok(hyperskillCourse)
}