@@ -7,6 +7,7 @@ import com.intellij.openapi.projectRoots.JavaSdk
77import com.intellij.openapi.projectRoots.impl.JavaHomeFinder
88import com.intellij.openapi.projectRoots.impl.JavaSdkImpl
99import com.intellij.openapi.roots.OrderRootType
10+ import com.intellij.openapi.util.io.FileUtilRt
1011import com.intellij.platform.eel.provider.getEelDescriptor
1112import com.intellij.platform.workspace.jps.entities.*
1213import com.intellij.platform.workspace.jps.entities.LibraryTableId.ProjectLibraryTableId
@@ -30,6 +31,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceDependency
3031import org.jetbrains.jps.model.module.JpsSdkDependency
3132import org.jetbrains.jps.model.serialization.*
3233import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl
34+ import org.jetbrains.jps.util.JpsPathUtil
3335import org.jetbrains.kotlin.config.isHmpp
3436import org.jetbrains.kotlin.idea.facet.KotlinFacetType
3537import org.jetbrains.kotlin.idea.workspaceModel.KotlinSettingsEntity
@@ -72,18 +74,19 @@ object JpsWorkspaceImporter : WorkspaceImporter {
7274 name = library.name,
7375 tableId = ProjectLibraryTableId ,
7476 roots = buildList {
75- library.getPaths(JpsOrderRootType .COMPILED ).mapNotNullTo(this ) {
76- if (! it.exists()) {
77- onUnresolvedDependency(it.toString())
77+ library.getRootUrls(JpsOrderRootType .COMPILED ).mapNotNullTo(this ) { url ->
78+ val fileUrl = virtualFileUrlManager.getOrCreateFromUrl(url)
79+ if (! Path .of(JpsPathUtil .urlToPath(url)).exists()) {
80+ onUnresolvedDependency(url)
7881 return @mapNotNull null
7982 }
8083 LibraryRoot (
81- it.toIntellijUri(virtualFileUrlManager) ,
84+ fileUrl ,
8285 LibraryRootTypeId .COMPILED
8386 )
8487 }
85- library.getPaths (JpsOrderRootType .SOURCES ).mapTo(this ) {
86- LibraryRoot (it.toIntellijUri(virtualFileUrlManager ), LibraryRootTypeId .SOURCES )
88+ library.getRootUrls (JpsOrderRootType .SOURCES ).mapTo(this ) { url ->
89+ LibraryRoot (virtualFileUrlManager.getOrCreateFromUrl(url ), LibraryRootTypeId .SOURCES )
8790 }
8891 },
8992 entitySource = entitySource
@@ -208,12 +211,20 @@ object JpsWorkspaceImporter : WorkspaceImporter {
208211 val builder = SdkEntity (
209212 name = library.name,
210213 type = library.type.toSdkType(),
211- roots = library.getRootUrls(JpsOrderRootType .COMPILED ).mapNotNull {
212- val url = if (it.startsWith(" jrt://" )) it.replace(" !/" , " !/modules/" ) else it
213- SdkRoot (
214- virtualFileUrlManager.getOrCreateFromUrl(url),
215- SdkRootTypeId (OrderRootType .CLASSES .customName),
216- )
214+ roots = buildList {
215+ library.getRootUrls(JpsOrderRootType .COMPILED ).mapNotNullTo(this ) { url ->
216+ val url = url.run { if (startsWith(" jrt://" )) replace(" !/" , " !/modules/" ) else this }
217+ SdkRoot (
218+ virtualFileUrlManager.getOrCreateFromUrl(url),
219+ SdkRootTypeId (OrderRootType .CLASSES .customName),
220+ )
221+ }
222+ library.getRootUrls(JpsOrderRootType .SOURCES ).mapNotNullTo(this ) { url ->
223+ SdkRoot (
224+ virtualFileUrlManager.getOrCreateFromUrl(url),
225+ SdkRootTypeId (OrderRootType .SOURCES .customName),
226+ )
227+ }
217228 },
218229 additionalData = " " ,
219230 entitySource = entitySource
@@ -257,16 +268,29 @@ private fun detectJavaSdks(
257268 suggestedName != null && sdkName.contains(suggestedName, ignoreCase = true )
258269 } ? : detectedSdks.maxBy { it.versionInfo?.version?.feature ? : 0 }
259270 LOG .info(" Detected SDK [$sdkName ]: ${sdk.path} " )
271+ val classRoots = JavaSdkImpl .findClasses(Path .of(sdk.path), false )
272+ .map { (it.replace(" !/" , " !/modules/" )) }
260273 SdkEntity (
261274 name = sdkName,
262275 type = JavaSdk .getInstance().name,
263- roots = JavaSdkImpl .findClasses( Path .of(sdk.path), false ).map { (it.replace( " !/ " , " !/modules/ " )) }
264- .map {
276+ roots = buildList {
277+ classRoots.mapTo( this ) {
265278 SdkRoot (
266279 virtualFileUrlManager.getOrCreateFromUrl(it),
267280 SdkRootTypeId (OrderRootType .CLASSES .customName),
268281 )
269- },
282+ }
283+ val srcZip = Path .of(sdk.path, " lib" , " src.zip" )
284+ if (srcZip.exists()) {
285+ val prefix = " jar://${FileUtilRt .toSystemIndependentName(srcZip.toString())} !/"
286+ classRoots.mapTo(this ) {
287+ SdkRoot (
288+ virtualFileUrlManager.getOrCreateFromUrl(" $prefix${it.substringAfterLast(" /" )} " ),
289+ SdkRootTypeId (OrderRootType .SOURCES .customName),
290+ )
291+ }
292+ }
293+ },
270294 additionalData = " " ,
271295 entitySource = entitySource
272296 )
0 commit comments