PY-75932 Poetry: the endless process of creating an interpreter

Make Module.isPipenv/isPoetry only readable.
Create SdkAdditionalData when creating new sdk.
What made it possible to delete the dangerous function PySdkExt#setCorrectTypeSdk.


Merge-request: IJ-MR-145160
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>

GitOrigin-RevId: 657092ed87f9948ada5aa2ffacfea0653a482ac7
This commit is contained in:
Egor Eliseev
2024-09-21 18:09:26 +00:00
committed by intellij-monorepo-bot
parent 3361aba5cb
commit e6f654da72
5 changed files with 9 additions and 33 deletions

View File

@@ -114,13 +114,12 @@ class PyPipfileSdkConfiguration : PyProjectSdkConfigurationExtension {
ProjectJdkTable.getInstance().allJdks,
file,
PythonSdkType.getInstance(),
null,
PyPipEnvSdkAdditionalData(),
suggestedSdkName(basePath)
)
ApplicationManager.getApplication().invokeAndWait {
LOGGER.debug("Adding associated pipenv environment: $path, $basePath")
sdk.isPipEnv = true
sdk.setAssociationToModule(module)
SdkConfigurationUtil.addSdk(sdk)
}

View File

@@ -114,13 +114,12 @@ class PyPoetrySdkConfiguration : PyProjectSdkConfigurationExtension {
ProjectJdkTable.getInstance().allJdks,
file,
PythonSdkType.getInstance(),
null,
PyPoetrySdkAdditionalData(),
suggestedSdkName(basePath)
)
ApplicationManager.getApplication().invokeAndWait {
LOGGER.debug("Adding associated poetry environment: $path, $basePath")
sdk.isPoetry = true
sdk.setAssociationToModule(module)
SdkConfigurationUtil.addSdk(sdk)
}

View File

@@ -178,6 +178,7 @@ fun createSdkByGenerateTask(
baseSdk: Sdk?,
associatedProjectPath: String?,
suggestedSdkName: String?,
sdkAdditionalData: PythonSdkAdditionalData? = null
): Sdk {
val homeFile = try {
val homePath = ProgressManager.getInstance().run(generateSdkHomePath)
@@ -204,7 +205,7 @@ fun createSdkByGenerateTask(
existingSdks.toTypedArray(),
homeFile,
PythonSdkType.getInstance(),
null,
sdkAdditionalData,
sdkName)
}
@@ -574,23 +575,4 @@ val Sdk.sdkSeemsValid: Boolean
val pythonSdkAdditionalData = getOrCreateAdditionalData()
if (pythonSdkAdditionalData is PyRemoteSdkAdditionalData) return true
return pythonSdkAdditionalData.flavorAndData.sdkSeemsValid(this, targetEnvConfiguration)
}
inline fun <reified T : PythonSdkAdditionalData> setCorrectTypeSdk(sdk: Sdk, additionalDataClass: Class<T>, value: Boolean) {
val oldData = sdk.sdkAdditionalData
val newData = if (value) {
when (oldData) {
is PythonSdkAdditionalData -> additionalDataClass.getDeclaredConstructors().first { it.parameterCount == 1 }.newInstance(oldData) as T
else -> additionalDataClass.getDeclaredConstructor().newInstance()
}
}
else {
when (oldData) {
is T -> PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk))
else -> oldData
}
}
val modificator = sdk.sdkModificator
modificator.sdkAdditionalData = newData
ApplicationManager.getApplication().runWriteAction { modificator.commitChanges() }
}
}

View File

@@ -68,9 +68,8 @@ val Module.pipFile: VirtualFile?
/**
* Tells if the SDK was added as a pipenv.
*/
var Sdk.isPipEnv: Boolean
internal val Sdk.isPipEnv: Boolean
get() = sdkAdditionalData is PyPipEnvSdkAdditionalData
set(value) = setCorrectTypeSdk(this, PyPipEnvSdkAdditionalData::class.java, value)
/**
* The user-set persisted a path to the pipenv executable.
@@ -125,10 +124,9 @@ fun setupPipEnvSdkUnderProgress(project: Project?,
return VirtualEnvReader.Instance.findPythonInPythonRoot(Path.of(pipEnv))?.toString() ?: FileUtil.join(pipEnv, "bin", "python")
}
}
return createSdkByGenerateTask(task, existingSdks, null, projectPath, suggestedSdkName(projectPath))?.apply {
return createSdkByGenerateTask(task, existingSdks, null, projectPath, suggestedSdkName(projectPath), PyPipEnvSdkAdditionalData()).apply {
// FIXME: multi module project support - associate with module path
setAssociationToPath(projectPath)
isPipEnv = true
}
}

View File

@@ -65,15 +65,13 @@ fun setupPoetrySdkUnderProgress(project: Project?,
}
}
return createSdkByGenerateTask(task, existingSdks, null, projectPath, suggestedSdkName(Path.of(projectPath))).apply {
return createSdkByGenerateTask(task, existingSdks, null, projectPath, suggestedSdkName(Path.of(projectPath)), PyPoetrySdkAdditionalData()).apply {
module?.let { setAssociationToModule(it) }
isPoetry = true
}
}
var Sdk.isPoetry: Boolean
internal val Sdk.isPoetry: Boolean
get() = sdkAdditionalData is PyPoetrySdkAdditionalData
set(value) = setCorrectTypeSdk(this, PyPoetrySdkAdditionalData::class.java, value)
val Module.poetryLock: VirtualFile?
get() = baseDir?.findChild(POETRY_LOCK)