Skip to content

Commit 3a6dc39

Browse files
gregshintellij-monorepo-bot
authored andcommitted
[lsp] Configure SDK sources
GitOrigin-RevId: 4274cdcbe360cd5e3d7c8afc1d7fd9819f542ed9
1 parent 1d01fb9 commit 3a6dc39

File tree

3 files changed

+64
-39
lines changed

3 files changed

+64
-39
lines changed

api.core/src/com/jetbrains/ls/api/core/util/LSUtil.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@ import com.intellij.openapi.editor.Document
55
import com.intellij.openapi.projectRoots.SdkType
66
import com.intellij.openapi.roots.OrderRootType
77
import com.intellij.openapi.util.TextRange
8+
import com.intellij.openapi.util.io.FileUtilRt
89
import com.intellij.openapi.vfs.VirtualFile
910
import com.intellij.openapi.vfs.VirtualFileManager
1011
import com.intellij.openapi.vfs.findPsiFile
11-
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
12-
import com.intellij.platform.workspace.jps.entities.ModuleEntity
13-
import com.intellij.platform.workspace.jps.entities.SdkDependency
14-
import com.intellij.platform.workspace.jps.entities.SdkEntity
15-
import com.intellij.platform.workspace.jps.entities.SdkRoot
16-
import com.intellij.platform.workspace.jps.entities.SdkRootTypeId
17-
import com.intellij.platform.workspace.jps.entities.modifyModuleEntity
12+
import com.intellij.platform.workspace.jps.entities.*
1813
import com.intellij.platform.workspace.storage.EntitySource
1914
import com.intellij.platform.workspace.storage.MutableEntityStorage
2015
import com.intellij.platform.workspace.storage.entities
@@ -26,7 +21,8 @@ import com.intellij.workspaceModel.ide.impl.legacyBridge.sdk.customName
2621
import com.jetbrains.ls.api.core.LSAnalysisContext
2722
import com.jetbrains.ls.api.core.project
2823
import com.jetbrains.lsp.protocol.*
29-
import kotlin.sequences.forEach
24+
import java.nio.file.Path
25+
import kotlin.io.path.exists
3026

3127
val VirtualFile.uri: URI
3228
get() = url.intellijUriToLspUri()
@@ -102,11 +98,25 @@ fun addSdk(
10298
val sdkEntity = SdkEntity(
10399
name = name,
104100
type = type.name,
105-
roots = roots.map { root ->
106-
SdkRoot(
107-
urlManager.getOrCreateFromUrl(root.lspUriToIntellijUri()!!),
108-
SdkRootTypeId(OrderRootType.CLASSES.customName),
109-
)
101+
roots = if (roots.isEmpty()) emptyList() else buildList {
102+
roots.mapTo(this) { root ->
103+
SdkRoot(
104+
urlManager.getOrCreateFromUrl(root.lspUriToIntellijUri()!!),
105+
SdkRootTypeId(OrderRootType.CLASSES.customName),
106+
)
107+
}
108+
109+
val javaHome = roots.first().lspUriToIntellijUri()!!.substringAfter("://").substringBeforeLast("!/")
110+
val srcZip = Path.of(FileUtilRt.toSystemDependentName(javaHome), "lib", "src.zip")
111+
if (srcZip.exists()) {
112+
val prefix = "jar://${FileUtilRt.toSystemIndependentName(srcZip.toString())}!/"
113+
roots.mapTo(this) { root ->
114+
SdkRoot(
115+
urlManager.getOrCreateFromUrl("$prefix${root.uri.substringAfterLast("/")}"),
116+
SdkRootTypeId(OrderRootType.SOURCES.customName),
117+
)
118+
}
119+
}
110120
},
111121
additionalData = "",
112122
entitySource = source

kotlin-lsp/src/com/jetbrains/ls/kotlinLsp/util/librariesInitializer.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,14 @@ import com.intellij.platform.workspace.jps.entities.SdkEntity
88
import com.intellij.platform.workspace.storage.impl.url.toVirtualFileUrl
99
import com.intellij.util.PathUtil
1010
import com.jetbrains.ls.api.core.LSServer
11-
import com.jetbrains.ls.api.core.util.LSLibrary
12-
import com.jetbrains.ls.api.core.util.LSSdk
13-
import com.jetbrains.ls.api.core.util.WorkspaceModelBuilder
14-
import com.jetbrains.ls.api.core.util.addSdk
15-
import com.jetbrains.ls.api.core.util.intellijUriToLspUri
16-
import com.jetbrains.ls.api.core.util.toLspUri
11+
import com.jetbrains.ls.api.core.util.*
1712
import com.jetbrains.ls.api.core.workspaceStructure
1813
import com.jetbrains.ls.imports.api.WorkspaceEntitySource
1914
import com.jetbrains.ls.imports.api.WorkspaceImporter
2015
import com.jetbrains.lsp.implementation.LspHandlerContext
2116
import com.jetbrains.lsp.implementation.lspClient
2217
import com.jetbrains.lsp.implementation.reportProgressMessage
23-
import com.jetbrains.lsp.protocol.MessageType
24-
import com.jetbrains.lsp.protocol.ShowMessageNotification
25-
import com.jetbrains.lsp.protocol.ShowMessageParams
26-
import com.jetbrains.lsp.protocol.URI
27-
import com.jetbrains.lsp.protocol.WorkDoneProgressParams
18+
import com.jetbrains.lsp.protocol.*
2819
import org.jetbrains.kotlin.idea.base.plugin.artifacts.KotlinArtifacts
2920
import org.jetbrains.kotlin.idea.compiler.configuration.isRunningFromSources
3021
import java.nio.file.Path

workspace-import/src/com/jetbrains/ls/imports/jps/JpsWorkspaceImporter.kt

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.intellij.openapi.projectRoots.JavaSdk
77
import com.intellij.openapi.projectRoots.impl.JavaHomeFinder
88
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl
99
import com.intellij.openapi.roots.OrderRootType
10+
import com.intellij.openapi.util.io.FileUtilRt
1011
import com.intellij.platform.eel.provider.getEelDescriptor
1112
import com.intellij.platform.workspace.jps.entities.*
1213
import com.intellij.platform.workspace.jps.entities.LibraryTableId.ProjectLibraryTableId
@@ -30,6 +31,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceDependency
3031
import org.jetbrains.jps.model.module.JpsSdkDependency
3132
import org.jetbrains.jps.model.serialization.*
3233
import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl
34+
import org.jetbrains.jps.util.JpsPathUtil
3335
import org.jetbrains.kotlin.config.isHmpp
3436
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
3537
import 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

Comments
 (0)