@@ -21,17 +21,15 @@ import com.intellij.openapi.roots.ModuleRootManager
2121import com.intellij.openapi.util.Key
2222import com.intellij.openapi.util.io.FileUtil
2323import 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.*
2825import com.intellij.util.EventDispatcher
2926import com.intellij.util.PathUtil
3027import com.intellij.util.concurrency.AppExecutorUtil
3128import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
3229import com.intellij.util.concurrency.annotations.RequiresReadLock
3330import com.intellij.util.io.BaseOutputReader
3431import com.intellij.util.io.URLUtil
32+ import com.intellij.xdebugger.impl.XSourcePositionImpl
3533import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService
3634import com.jetbrains.lang.dart.ide.devtools.DartDevToolsService
3735import com.jetbrains.lang.dart.sdk.DartSdk
@@ -42,7 +40,9 @@ import de.roderick.weberknecht.WebSocketEventHandler
4240import de.roderick.weberknecht.WebSocketException
4341import de.roderick.weberknecht.WebSocketMessage
4442import kotlinx.coroutines.CoroutineScope
43+ import java.net.MalformedURLException
4544import java.net.URI
45+ import java.net.URISyntaxException
4646import java.nio.charset.StandardCharsets
4747import java.util.concurrent.Callable
4848import 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