Skip to content

Commit 2e88d6b

Browse files
committed
Add navigateToCode service method
1 parent bbcc60c commit 2e88d6b

File tree

1 file changed

+41
-4
lines changed

1 file changed

+41
-4
lines changed

third_party/src/main/java/com/jetbrains/lang/dart/ide/toolingDaemon/DartToolingDaemonService.kt

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ import com.intellij.openapi.roots.ModuleRootManager
2121
import com.intellij.openapi.util.Key
2222
import com.intellij.openapi.util.io.FileUtil
2323
import com.intellij.openapi.util.text.StringUtil
24-
import com.intellij.openapi.vfs.VfsUtil
25-
import com.intellij.openapi.vfs.VfsUtilCore
26-
import com.intellij.openapi.vfs.VirtualFile
27-
import com.intellij.openapi.vfs.VirtualFileManager
24+
import com.intellij.openapi.vfs.*
2825
import com.intellij.util.EventDispatcher
2926
import com.intellij.util.PathUtil
3027
import com.intellij.util.concurrency.AppExecutorUtil
3128
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
3229
import com.intellij.util.concurrency.annotations.RequiresReadLock
3330
import com.intellij.util.io.BaseOutputReader
3431
import com.intellij.util.io.URLUtil
32+
import com.intellij.xdebugger.impl.XSourcePositionImpl
3533
import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService
3634
import com.jetbrains.lang.dart.ide.devtools.DartDevToolsService
3735
import com.jetbrains.lang.dart.sdk.DartSdk
@@ -42,7 +40,9 @@ import de.roderick.weberknecht.WebSocketEventHandler
4240
import de.roderick.weberknecht.WebSocketException
4341
import de.roderick.weberknecht.WebSocketMessage
4442
import kotlinx.coroutines.CoroutineScope
43+
import java.net.MalformedURLException
4544
import java.net.URI
45+
import java.net.URISyntaxException
4646
import java.nio.charset.StandardCharsets
4747
import java.util.concurrent.Callable
4848
import java.util.concurrent.atomic.AtomicInteger
@@ -121,6 +121,43 @@ class DartToolingDaemonService private constructor(val project: Project, cs: Cor
121121

122122
DartToolingDaemonResponse(result, null)
123123
}
124+
125+
registerServiceMethod("Editor", "navigateToCode", JsonObject()) handler@{ request ->
126+
val fileUri: String? = request.get("uri").asString
127+
if (fileUri == null) {
128+
val params = JsonObject()
129+
params.addProperty("message", "No uri provided")
130+
return@handler DartToolingDaemonResponse(null, params)
131+
}
132+
133+
var path: String? = null
134+
try {
135+
path = URI(fileUri).toURL().file
136+
} catch (e: MalformedURLException) {
137+
// A null path will cause an early return.
138+
} catch (e: URISyntaxException) {
139+
}
140+
if (path == null) {
141+
val params = JsonObject()
142+
params.addProperty("message", "Path could not be found from fileUri: $fileUri")
143+
return@handler DartToolingDaemonResponse(null, params)
144+
}
145+
146+
val file = LocalFileSystem.getInstance().findFileByPath(path)
147+
val line: Int = request.get("line").asInt
148+
val column: Int = request.get("column").asInt
149+
150+
ApplicationManager.getApplication().invokeLater(Runnable {
151+
if (file != null && line >= 0 && column >= 0) {
152+
val position = XSourcePositionImpl.create(file, line - 1, column - 1)
153+
position.createNavigatable(project).navigate(false)
154+
}
155+
})
156+
157+
val params = JsonObject()
158+
params.addProperty("success", true)
159+
DartToolingDaemonResponse(params, null)
160+
}
124161
}
125162

126163
private fun connectToDtdWebSocket(uri: String) {

0 commit comments

Comments
 (0)