Skip to content

Commit 732350a

Browse files
authored
Merge pull request #99 from alexander-doroshko/main
Remove usages of deprecated LSP API
2 parents d57fa1b + 1115d8d commit 732350a

19 files changed

+86
-186
lines changed

src/main/kotlin/com/semgrep/idea/actions/LoginAction.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@ package com.semgrep.idea.actions
22

33
import com.intellij.ide.BrowserUtil
44
import com.intellij.notification.Notification
5-
import com.intellij.openapi.actionSystem.AnActionEvent
6-
import com.semgrep.idea.lsp.custom_notifications.LoginFinishRequest
7-
import com.semgrep.idea.lsp.custom_requests.LoginRequest
5+
import com.intellij.platform.lsp.api.LspServer
6+
import com.semgrep.idea.lsp.SemgrepLanguageServer
7+
import com.semgrep.idea.lsp.SemgrepService
8+
import kotlinx.coroutines.launch
89

910
class LoginAction(private val notification: Notification? = null) : LspAction("Sign In with Semgrep") {
10-
override fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>) {
11-
val loginRequest = LoginRequest(servers.first())
12-
loginRequest.sendRequest().thenApply { response ->
13-
BrowserUtil.browse(response.url)
14-
servers.forEach {
15-
LoginFinishRequest(it, response).sendNotification()
16-
}
11+
override fun actionPerformed(lspServer: LspServer) {
12+
SemgrepService.getInstance(lspServer.project).cs.launch {
13+
val loginResult = lspServer.sendRequest { (it as SemgrepLanguageServer).login() }
14+
?: return@launch
15+
BrowserUtil.browse(loginResult.url)
16+
lspServer.sendNotification { (it as SemgrepLanguageServer).loginFinish(loginResult) }
1717
notification?.expire()
1818
}
19-
2019
}
2120
}
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.semgrep.idea.actions
22

3-
import com.intellij.openapi.actionSystem.AnActionEvent
4-
import com.semgrep.idea.lsp.custom_notifications.LogoutNotifcation
3+
import com.intellij.platform.lsp.api.LspServer
4+
import com.semgrep.idea.lsp.SemgrepLanguageServer
55

66
class LogoutAction : LspAction("Sign out of Semgrep") {
7-
override fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>) {
8-
servers.map {
9-
LogoutNotifcation(it).sendNotification()
10-
}
7+
override fun actionPerformed(lspServer: LspServer) {
8+
lspServer.sendNotification { (it as SemgrepLanguageServer).logout() }
119
}
1210
}

src/main/kotlin/com/semgrep/idea/actions/LspAction.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ package com.semgrep.idea.actions
22

33
import com.intellij.openapi.actionSystem.AnAction
44
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.platform.lsp.api.LspServer
6+
import com.semgrep.idea.lsp.SemgrepService
57

68
abstract class LspAction(text: String) : AnAction(text) {
79
override fun actionPerformed(e: AnActionEvent) {
810
val project = e.project ?: return
9-
val servers = com.semgrep.idea.lsp.SemgrepLspServer.getInstances(project)
10-
if (servers.isEmpty()) {
11-
return
12-
}
13-
actionPerformed(e, servers)
11+
val lspServer = SemgrepService.getRunningLspServer(project) ?: return
12+
actionPerformed(lspServer)
1413
}
1514

16-
abstract fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>)
15+
abstract fun actionPerformed(lspServer: LspServer)
1716
}
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.semgrep.idea.actions
22

3-
import com.intellij.openapi.actionSystem.AnActionEvent
4-
import com.semgrep.idea.lsp.custom_notifications.RefreshRulesNotification
3+
import com.intellij.platform.lsp.api.LspServer
4+
import com.semgrep.idea.lsp.SemgrepLanguageServer
55

66
class RefreshRulesAction : LspAction("Update Semgrep Rules") {
7-
override fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>) {
8-
servers.map {
9-
RefreshRulesNotification(it).sendNotification()
10-
}
7+
override fun actionPerformed(lspServer: LspServer) {
8+
lspServer.sendNotification { (it as SemgrepLanguageServer).refreshRules() }
119
}
1210
}
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package com.semgrep.idea.actions
22

3-
import com.intellij.openapi.actionSystem.AnActionEvent
4-
import com.semgrep.idea.lsp.custom_notifications.ScanWorkspaceNotification
5-
import com.semgrep.idea.lsp.custom_notifications.ScanWorkspaceParams
3+
import com.intellij.platform.lsp.api.LspServer
4+
import com.semgrep.idea.lsp.SemgrepLanguageServer
65

76
class ScanWorkspaceAction : LspAction("Scan Workspace with Semgrep") {
8-
override fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>) {
9-
val params = ScanWorkspaceParams(full = false)
10-
servers.map { ScanWorkspaceNotification(it, params).sendNotification() }
7+
override fun actionPerformed(lspServer: LspServer) {
8+
val params = SemgrepLanguageServer.ScanWorkspaceParams(full = false)
9+
lspServer.sendNotification { (it as SemgrepLanguageServer).scanWorkspace(params) }
1110
}
12-
1311
}
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package com.semgrep.idea.actions
22

3-
import com.intellij.openapi.actionSystem.AnActionEvent
4-
import com.semgrep.idea.lsp.custom_notifications.ScanWorkspaceNotification
5-
import com.semgrep.idea.lsp.custom_notifications.ScanWorkspaceParams
3+
import com.intellij.platform.lsp.api.LspServer
4+
import com.semgrep.idea.lsp.SemgrepLanguageServer
65

76
class ScanWorkspaceFullAction : LspAction("Scan Workspace with Semgrep (Including Unmodified Files)") {
8-
override fun actionPerformed(e: AnActionEvent, servers: List<com.semgrep.idea.lsp.SemgrepLspServer>) {
9-
val params = ScanWorkspaceParams(full = true)
10-
servers.map { ScanWorkspaceNotification(it, params).sendNotification() }
7+
override fun actionPerformed(lspServer: LspServer) {
8+
val params = SemgrepLanguageServer.ScanWorkspaceParams(full = true)
9+
lspServer.sendNotification { (it as SemgrepLanguageServer).scanWorkspace(params) }
1110
}
12-
1311
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package com.semgrep.idea.lsp
22

3+
import com.intellij.openapi.project.Project
34
import com.intellij.openapi.vfs.newvfs.BulkFileListener
45
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
56
import org.eclipse.lsp4j.DidSaveTextDocumentParams
67
import org.eclipse.lsp4j.TextDocumentIdentifier
78
import java.net.URLEncoder
89

9-
class FileSaveManager(private val semgrepLspServer: SemgrepLspServer) : BulkFileListener {
10+
class FileSaveManager(private val project: Project) : BulkFileListener {
1011
override fun after(events: MutableList<out VFileEvent>) {
12+
val lspServer = SemgrepService.getRunningLspServer(project) ?: return
1113
val saveEvents = events.filter { it.isFromSave }
1214
saveEvents.forEach {
1315
val uri = URLEncoder.encode(it.path, "UTF-8")
1416
val textDocumentIdentifier = TextDocumentIdentifier(uri)
1517
val params = DidSaveTextDocumentParams(textDocumentIdentifier)
16-
semgrepLspServer.lsp4jServer.textDocumentService.didSave(params)
18+
lspServer.sendNotification { it.textDocumentService.didSave(params) }
1719
}
18-
super.after(events)
19-
2020
}
2121
}

src/main/kotlin/com/semgrep/idea/lsp/SemgrepInstaller.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreter
55
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterManager
66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.util.SystemInfo
8+
import com.intellij.platform.lsp.api.LspServerManager
89
import com.intellij.util.text.SemVer
910
import com.semgrep.idea.settings.AppState
1011
import com.semgrep.idea.settings.SemgrepLspSettings
@@ -33,7 +34,8 @@ object SemgrepInstaller {
3334
val semgrepNotifier = SemgrepNotifier(project)
3435
if (ret == 0) {
3536
semgrepNotifier.notifyInstallSuccess()
36-
SemgrepLspServer.startServersIfNeeded(project)
37+
LspServerManager.getInstance(project)
38+
.stopAndRestartIfNeeded(SemgrepLspServerSupportProvider::class.java)
3739
} else {
3840
semgrepNotifier.notifyInstallFailure(out, ret)
3941
}

src/main/kotlin/com/semgrep/idea/lsp/SemgrepLanguageServer.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.semgrep.idea.lsp
22

3-
import com.semgrep.idea.lsp.custom_notifications.ScanWorkspaceParams
4-
import com.semgrep.idea.lsp.custom_requests.LoginResult
5-
import com.semgrep.idea.lsp.custom_requests.LoginStatusResult
63
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification
74
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
85
import org.eclipse.lsp4j.services.LanguageServer
@@ -34,4 +31,8 @@ interface SemgrepLanguageServer : LanguageServer {
3431
@JsonNotification("semgrep/refreshRules")
3532
fun refreshRules(params: List<Void> = emptyList())
3633

34+
35+
class LoginResult(val url: String, @Suppress("unused") val sessionId: String)
36+
class LoginStatusResult(val loggedIn: Boolean)
37+
class ScanWorkspaceParams(@Suppress("unused") val full: Boolean)
3738
}

src/main/kotlin/com/semgrep/idea/lsp/SemgrepLspServer.kt

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/main/kotlin/com/semgrep/idea/lsp/SemgrepLspServerDescriptor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,6 @@ class SemgrepLspServerDescriptor(project: Project) : ProjectWideLspServerDescrip
8787
return SemgrepLsp4jClient(handler)
8888
}
8989

90-
override val lspServerListener: LspServerListener = SemgrepLspServerListener(project)
90+
override val lspServerListener: LspServerListener =
91+
SemgrepLspServerListener(project, clientCapabilities.textDocument?.synchronization?.didSave == true)
9192
}

src/main/kotlin/com/semgrep/idea/lsp/SemgrepLspServerListener.kt

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,30 @@ package com.semgrep.idea.lsp
33
import com.intellij.openapi.project.Project
44
import com.intellij.openapi.vfs.VirtualFileManager
55
import com.intellij.platform.lsp.api.LspServerListener
6-
import com.semgrep.idea.lsp.custom_requests.LoginStatusRequest
76
import com.semgrep.idea.settings.AppState
87
import com.semgrep.idea.telemetry.SentryWrapper
98
import com.semgrep.idea.ui.SemgrepNotifier
9+
import kotlinx.coroutines.launch
1010
import org.eclipse.lsp4j.InitializeResult
1111

12-
class SemgrepLspServerListener(val project: Project) : LspServerListener {
12+
class SemgrepLspServerListener(
13+
private val project: Project,
14+
private val nativeDidSaveSupport: Boolean,
15+
) : LspServerListener {
1316

1417
fun checkNudge() {
1518
val settings = AppState.getInstance()
16-
val servers = SemgrepLspServer.getInstances(project)
17-
val first = servers.firstOrNull()
1819
// Check if we've bugged them about logging in
19-
if (first != null && !settings.pluginState.dismissedLoginNudge) {
20-
val loginStatusRequest = LoginStatusRequest(first)
21-
loginStatusRequest.sendRequest().handle { it, _ ->
22-
settings.pluginState.loggedIn = it.loggedIn
23-
SentryWrapper.getInstance().setSentryContext()
24-
if (!it.loggedIn) {
25-
SemgrepNotifier(project).notifyLoginNudge()
26-
}
20+
if (settings.pluginState.dismissedLoginNudge) return
21+
val lspServer = SemgrepService.getRunningLspServer(project) ?: return
22+
SemgrepService.getInstance(project).cs.launch {
23+
val loginStatusResult = lspServer.sendRequest { (it as SemgrepLanguageServer).loginStatus() }
24+
val loggedIn = loginStatusResult != null && loginStatusResult.loggedIn
25+
settings.pluginState.loggedIn = loggedIn
26+
SentryWrapper.getInstance().setSentryContext()
27+
if (!loggedIn) {
28+
SemgrepNotifier(project).notifyLoginNudge()
2729
}
28-
2930
}
3031
}
3132

@@ -55,12 +56,10 @@ class SemgrepLspServerListener(val project: Project) : LspServerListener {
5556
}
5657

5758
override fun serverInitialized(params: InitializeResult) {
58-
super.serverInitialized(params)
59-
val sentry = SentryWrapper.getInstance()
60-
61-
SemgrepLspServer.getInstances(project).forEach {
62-
project.messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES, FileSaveManager(it))
59+
if (!nativeDidSaveSupport) {
60+
project.messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES, FileSaveManager(project))
6361
}
62+
val sentry = SentryWrapper.getInstance()
6463
sentry.withSentry {
6564
checkNudge()
6665
checkVersion()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.semgrep.idea.lsp
2+
3+
import com.intellij.openapi.components.Service
4+
import com.intellij.openapi.components.service
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.platform.lsp.api.LspServer
7+
import com.intellij.platform.lsp.api.LspServerManager
8+
import com.intellij.platform.lsp.api.LspServerState
9+
import kotlinx.coroutines.CoroutineScope
10+
11+
@Service(Service.Level.PROJECT)
12+
class SemgrepService(val cs: CoroutineScope) {
13+
companion object {
14+
fun getInstance(project: Project): SemgrepService = project.service<SemgrepService>()
15+
16+
// There might be no more than one running server
17+
// because `SemgrepLspServerDescriptor` extends `ProjectWideLspServerDescriptor`
18+
fun getRunningLspServer(project: Project): LspServer? =
19+
LspServerManager.getInstance(project)
20+
.getServersForProvider(SemgrepLspServerSupportProvider::class.java)
21+
.firstOrNull { it.state == LspServerState.Running }
22+
}
23+
}

src/main/kotlin/com/semgrep/idea/lsp/custom_notifications/LoginFinishNotification.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/main/kotlin/com/semgrep/idea/lsp/custom_notifications/LogoutNotifcation.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/main/kotlin/com/semgrep/idea/lsp/custom_notifications/RefreshRulesNotification.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/kotlin/com/semgrep/idea/lsp/custom_notifications/ScanWorkspaceNotification.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/main/kotlin/com/semgrep/idea/lsp/custom_requests/LoginRequest.kt

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)