diff --git a/gradle.properties b/gradle.properties index 0fee7f200..11b2bb6be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ kotlin.stdlib.default.dependency=false nodeBinaries.commit=8755ae4c05fd476cd23f2972049111ba436c86d4 nodeBinaries.version=v20.12.2 cody.autocomplete.enableFormatting=true -cody.commit=38885b4bd403acfca984afbe45cd50b600319ca1 +cody.commit=bcbd5ee0dfc2dcb5f126ca0388cadeabf8b92875 diff --git a/src/main/kotlin/com/sourcegraph/cody/agent/CodyAgentService.kt b/src/main/kotlin/com/sourcegraph/cody/agent/CodyAgentService.kt index 1882e23a0..c6e18db57 100644 --- a/src/main/kotlin/com/sourcegraph/cody/agent/CodyAgentService.kt +++ b/src/main/kotlin/com/sourcegraph/cody/agent/CodyAgentService.kt @@ -108,6 +108,9 @@ class CodyAgentService(private val project: Project) : Disposable { } agent.client.onOpenUntitledDocument = Function { params -> + // We always get a file which does not start with file:// there. + // They start with untitled:// which is VSCode-specific way + // to say that files does not exist on the disk yet. val uri = URI.create(params.uri).withScheme("file") if (CodyEditorUtil.createFileIfNeeded(project, uri, params.content) == null) return@Function false diff --git a/src/main/kotlin/com/sourcegraph/cody/agent/protocol/ProtocolTextDocument.kt b/src/main/kotlin/com/sourcegraph/cody/agent/protocol/ProtocolTextDocument.kt index b4359c302..dbd792e0e 100644 --- a/src/main/kotlin/com/sourcegraph/cody/agent/protocol/ProtocolTextDocument.kt +++ b/src/main/kotlin/com/sourcegraph/cody/agent/protocol/ProtocolTextDocument.kt @@ -3,7 +3,8 @@ package com.sourcegraph.cody.agent.protocol import com.intellij.openapi.editor.Editor import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.vfs.VirtualFile -import com.sourcegraph.cody.agent.protocol.util.Rfc3986UriEncoder +import java.nio.file.FileSystems +import java.util.Locale class ProtocolTextDocument private constructor( @@ -47,8 +48,13 @@ private constructor( return ProtocolTextDocument(uriFor(file), text, selection) } - fun uriFor(file: VirtualFile): String { - return Rfc3986UriEncoder.encode(file.url) + private fun uriFor(file: VirtualFile): String { + val uri = FileSystems.getDefault().getPath(file.path).toUri().toString() + return uri.replace(Regex("file:///(\\w):/")) { + val driveLetter = + it.groups[1]?.value?.lowercase(Locale.getDefault()) ?: return@replace it.value + "file:///$driveLetter%3A/" + } } } } diff --git a/src/main/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoder.kt b/src/main/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoder.kt deleted file mode 100644 index 7fe7f0627..000000000 --- a/src/main/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoder.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.sourcegraph.cody.agent.protocol.util - -object Rfc3986UriEncoder { - - // todo solve this with library - fun encode(uri: String): String { - val found = "(\\w+:///?)([A-Za-z])(:.+)".toRegex().find(uri) - if (found != null && found.groups.size == 4) { - val (protocol, partition, rest) = found.destructured - return "$protocol${partition.lowercase()}$rest" - } else { - return uri - } - } -} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt index 5001f7508..7ce44977c 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt @@ -203,8 +203,10 @@ abstract class FixupSession( val future = group.show(range) // Make sure the lens is visible. ApplicationManager.getApplication().invokeLater { - val logicalPosition = LogicalPosition(range.start.line, range.start.character) - editor.scrollingModel.scrollTo(logicalPosition, ScrollType.CENTER) + if (!editor.isDisposed) { + val logicalPosition = LogicalPosition(range.start.line, range.start.character) + editor.scrollingModel.scrollTo(logicalPosition, ScrollType.CENTER) + } } if (!ApplicationManager.getApplication().isDispatchThread) { // integration test future.get() diff --git a/src/test/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoderTest.kt b/src/test/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoderTest.kt deleted file mode 100644 index 2b57ebf21..000000000 --- a/src/test/kotlin/com/sourcegraph/cody/agent/protocol/util/Rfc3986UriEncoderTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.sourcegraph.cody.agent.protocol.util - -import junit.framework.TestCase - -class Rfc3986UriEncoderTest : TestCase() { - - fun `test encode Windows path`() { - val fixedUri = Rfc3986UriEncoder.encode("file:///C:/Users/user/Test.java") - assertEquals("file:///c:/Users/user/Test.java", fixedUri) - } - - fun `test encode Windows jar path`() { - val uri = Rfc3986UriEncoder.encode("jar://C:/home/user/x.jar") - assertEquals("jar://c:/home/user/x.jar", uri) - } - - fun `test encode Windows path with lowercase partition`() { - val fixedUri = Rfc3986UriEncoder.encode("file:///c:/Users/user/Test.java") - assertEquals("file:///c:/Users/user/Test.java", fixedUri) - } - - fun `test encode Linux path`() { - val uri = Rfc3986UriEncoder.encode("file://home/user/Test.java") - assertEquals("file://home/user/Test.java", uri) - } -}