Skip to content

Commit 91134b8

Browse files
committed
integrate virtualFile -> URI util function for consistent handling
1 parent 07fab42 commit 91134b8

File tree

5 files changed

+62
-62
lines changed

5 files changed

+62
-62
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.eclipse.lsp4j.TextDocumentIdentifier
2424
import org.eclipse.lsp4j.TextDocumentItem
2525
import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
2626
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
27+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
2728
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
2829

2930
class TextDocumentServiceHandler(
@@ -56,7 +57,7 @@ class TextDocumentServiceHandler(
5657
override fun beforeDocumentSaving(document: Document) {
5758
AmazonQLspService.executeIfRunning(project) { languageServer ->
5859
val file = FileDocumentManager.getInstance().getFile(document) ?: return@executeIfRunning
59-
file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
60+
toUriString(file)?.let { uri ->
6061
languageServer.textDocumentService.didSave(
6162
DidSaveTextDocumentParams().apply {
6263
textDocument = TextDocumentIdentifier().apply {
@@ -74,7 +75,7 @@ class TextDocumentServiceHandler(
7475
pluginAwareExecuteOnPooledThread {
7576
events.filterIsInstance<VFileContentChangeEvent>().forEach { event ->
7677
val document = FileDocumentManager.getInstance().getCachedDocument(event.file) ?: return@forEach
77-
event.file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
78+
toUriString(event.file)?.let { uri ->
7879
languageServer.textDocumentService.didChange(
7980
DidChangeTextDocumentParams().apply {
8081
textDocument = VersionedTextDocumentIdentifier().apply {
@@ -99,7 +100,7 @@ class TextDocumentServiceHandler(
99100
file: VirtualFile,
100101
) {
101102
AmazonQLspService.executeIfRunning(project) { languageServer ->
102-
file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
103+
toUriString(file)?.let { uri ->
103104
languageServer.textDocumentService.didOpen(
104105
DidOpenTextDocumentParams().apply {
105106
textDocument = TextDocumentItem().apply {
@@ -117,7 +118,7 @@ class TextDocumentServiceHandler(
117118
file: VirtualFile,
118119
) {
119120
AmazonQLspService.executeIfRunning(project) { languageServer ->
120-
file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
121+
toUriString(file)?.let { uri ->
121122
languageServer.textDocumentService.didClose(
122123
DidCloseTextDocumentParams().apply {
123124
textDocument = TextDocumentIdentifier().apply {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.util
66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.roots.ProjectRootManager
88
import org.eclipse.lsp4j.WorkspaceFolder
9+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
910

1011
object WorkspaceFolderUtil {
1112
fun createWorkspaceFolders(project: Project): List<WorkspaceFolder> =
@@ -15,7 +16,7 @@ object WorkspaceFolderUtil {
1516
ProjectRootManager.getInstance(project).contentRoots.map { contentRoot ->
1617
WorkspaceFolder().apply {
1718
name = contentRoot.name
18-
this.uri = contentRoot.url
19+
this.uri = toUriString(contentRoot)
1920
}
2021
}
2122
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.eclipse.lsp4j.RenameFilesParams
2727
import org.eclipse.lsp4j.WorkspaceFolder
2828
import org.eclipse.lsp4j.WorkspaceFoldersChangeEvent
2929
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
30+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
3031
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders
3132
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
3233
import java.nio.file.FileSystems
@@ -59,7 +60,7 @@ class WorkspaceServiceHandler(
5960
AmazonQLspService.executeIfRunning(project) { languageServer ->
6061
val validFiles = events.mapNotNull { event ->
6162
val file = event.file?.takeIf { shouldHandleFile(it) } ?: return@mapNotNull null
62-
file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
63+
toUriString(file)?.let { uri ->
6364
FileCreate().apply {
6465
this.uri = uri
6566
}
@@ -80,7 +81,7 @@ class WorkspaceServiceHandler(
8081
AmazonQLspService.executeIfRunning(project) { languageServer ->
8182
val validFiles = events.mapNotNull { event ->
8283
val file = event.file?.takeIf { shouldHandleFile(it) } ?: return@mapNotNull null
83-
file.toNioPath().toUri().toString().takeIf { it.isNotEmpty() }?.let { uri ->
84+
toUriString(file)?.let { uri ->
8485
FileDelete().apply {
8586
this.uri = uri
8687
}
@@ -109,7 +110,7 @@ class WorkspaceServiceHandler(
109110
// Construct old and new URIs
110111
val parentPath = file.parent?.toNioPath() ?: return@mapNotNull null
111112
val oldUri = parentPath.resolve(oldName).toUri().toString()
112-
val newUri = file.toNioPath().toUri().toString()
113+
val newUri = toUriString(file)
113114

114115
FileRename().apply {
115116
this.oldUri = oldUri
@@ -130,7 +131,7 @@ class WorkspaceServiceHandler(
130131
private fun didChangeWatchedFiles(events: List<VFileEvent>) {
131132
AmazonQLspService.executeIfRunning(project) { languageServer ->
132133
val validChanges = events.mapNotNull { event ->
133-
event.file?.toNioPath()?.toUri()?.toString()?.takeIf { it.isNotEmpty() }?.let { uri ->
134+
event.file?.let { toUriString(it) }?.let { uri ->
134135
FileEvent().apply {
135136
this.uri = uri
136137
type = when (event) {

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt

+34-46
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.intellij.util.messages.MessageBusConnection
1818
import io.mockk.every
1919
import io.mockk.just
2020
import io.mockk.mockk
21+
import io.mockk.mockkObject
2122
import io.mockk.mockkStatic
2223
import io.mockk.runs
2324
import io.mockk.slot
@@ -34,6 +35,7 @@ import org.junit.Before
3435
import org.junit.Test
3536
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
3637
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
38+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil
3739
import java.net.URI
3840
import java.nio.file.Path
3941
import java.util.concurrent.Callable
@@ -99,14 +101,7 @@ class TextDocumentServiceHandlerTest {
99101
every { text } returns "test content"
100102
}
101103

102-
val path = mockk<Path> {
103-
every { toUri() } returns uri
104-
}
105-
106-
val file = mockk<VirtualFile> {
107-
every { this@mockk.path } returns uri.path
108-
every { toNioPath() } returns path
109-
}
104+
val file = createMockVirtualFile(uri)
110105

111106
// Mock FileDocumentManager
112107
val fileDocumentManager = mockk<FileDocumentManager> {
@@ -136,17 +131,8 @@ class TextDocumentServiceHandlerTest {
136131
// Create test file
137132
val uri = URI.create("file:///test/path/file.txt")
138133
val content = "test content"
139-
val inputStream = content.byteInputStream()
140134

141-
val path = mockk<Path> {
142-
every { toUri() } returns uri
143-
}
144-
145-
val file = mockk<VirtualFile> {
146-
every { this@mockk.path } returns uri.path
147-
every { toNioPath() } returns path
148-
every { this@mockk.inputStream } returns inputStream
149-
}
135+
val file = createMockVirtualFile(uri, content)
150136

151137
// Call the handler method
152138
sut.fileOpened(mockk(), file)
@@ -164,13 +150,7 @@ class TextDocumentServiceHandlerTest {
164150
@Test
165151
fun `didClose runs on fileClosed`() = runTest {
166152
val uri = URI.create("file:///test/path/file.txt")
167-
val path = mockk<Path> {
168-
every { toUri() } returns uri
169-
}
170-
val file = mockk<VirtualFile> {
171-
every { this@mockk.path } returns uri.path
172-
every { toNioPath() } returns path
173-
}
153+
val file = createMockVirtualFile(uri)
174154

175155
sut.fileClosed(mockk(), file)
176156

@@ -188,14 +168,7 @@ class TextDocumentServiceHandlerTest {
188168
every { modificationStamp } returns 123L
189169
}
190170

191-
val path = mockk<Path> {
192-
every { toUri() } returns uri
193-
}
194-
195-
val file = mockk<VirtualFile> {
196-
every { this@mockk.path } returns uri.path
197-
every { toNioPath() } returns path
198-
}
171+
val file = createMockVirtualFile(uri)
199172

200173
val changeEvent = mockk<VFileContentChangeEvent> {
201174
every { this@mockk.file } returns file
@@ -227,23 +200,22 @@ class TextDocumentServiceHandlerTest {
227200
@Test
228201
fun `didSave does not run when URI is empty`() = runTest {
229202
val document = mockk<Document>()
230-
val path = mockk<Path> {
231-
every { toUri() } returns URI.create("")
232-
}
233-
val file = mockk<VirtualFile> {
234-
every { toNioPath() } returns path
235-
}
203+
val file = createMockVirtualFile(URI.create(""))
236204

237-
val fileDocumentManager = mockk<FileDocumentManager> {
238-
every { getFile(document) } returns file
239-
}
205+
mockkObject(FileUriUtil) {
206+
every { FileUriUtil.toUriString(file) } returns null
240207

241-
mockkStatic(FileDocumentManager::class) {
242-
every { FileDocumentManager.getInstance() } returns fileDocumentManager
208+
val fileDocumentManager = mockk<FileDocumentManager> {
209+
every { getFile(document) } returns file
210+
}
243211

244-
sut.beforeDocumentSaving(document)
212+
mockkStatic(FileDocumentManager::class) {
213+
every { FileDocumentManager.getInstance() } returns fileDocumentManager
245214

246-
verify(exactly = 0) { mockTextDocumentService.didSave(any()) }
215+
sut.beforeDocumentSaving(document)
216+
217+
verify(exactly = 0) { mockTextDocumentService.didSave(any()) }
218+
}
247219
}
248220
}
249221

@@ -298,4 +270,20 @@ class TextDocumentServiceHandlerTest {
298270
verify(exactly = 0) { mockTextDocumentService.didChange(any()) }
299271
}
300272
}
273+
274+
private fun createMockVirtualFile(uri: URI, content: String = ""): VirtualFile {
275+
val path = mockk<Path> {
276+
every { toUri() } returns uri
277+
}
278+
val inputStream = content.byteInputStream()
279+
return mockk<VirtualFile> {
280+
every { url } returns uri.path
281+
every { toNioPath() } returns path
282+
every { isDirectory } returns false
283+
every { fileSystem } returns mockk {
284+
every { protocol } returns "file"
285+
}
286+
every { this@mockk.inputStream } returns inputStream
287+
}
288+
}
301289
}

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt

+16-7
Original file line numberDiff line numberDiff line change
@@ -511,13 +511,18 @@ class WorkspaceServiceHandlerTest {
511511
}
512512

513513
private fun createMockVFileEvent(uri: URI, type: FileChangeType = FileChangeType.Changed, isDirectory: Boolean, extension: String = "py"): VFileEvent {
514-
val virtualFile = mockk<VirtualFile>()
515-
val nioPath = mockk<Path>()
516-
517-
every { virtualFile.isDirectory } returns isDirectory
518-
every { virtualFile.toNioPath() } returns nioPath
519-
every { nioPath.toUri() } returns uri
520-
every { virtualFile.path } returns "${uri.path}.$extension"
514+
val nioPath = mockk<Path> {
515+
every { toUri() } returns uri
516+
}
517+
val virtualFile = mockk<VirtualFile> {
518+
every { this@mockk.isDirectory } returns isDirectory
519+
every { toNioPath() } returns nioPath
520+
every { url } returns uri.path
521+
every { path } returns "${uri.path}.$extension"
522+
every { fileSystem } returns mockk {
523+
every { protocol } returns "file"
524+
}
525+
}
521526

522527
return when (type) {
523528
FileChangeType.Deleted -> mockk<VFileDeleteEvent>()
@@ -544,6 +549,10 @@ class WorkspaceServiceHandlerTest {
544549
every { file.toNioPath() } returns filePath
545550
every { file.isDirectory } returns isDirectory
546551
every { file.path } returns "/test/$newName"
552+
every { file.url } returns "file:///test/$newName"
553+
every { file.fileSystem } returns mockk {
554+
every { protocol } returns "file"
555+
}
547556

548557
every { parentPath.resolve(oldName) } returns mockk {
549558
every { toUri() } returns URI("file:///test/$oldName")

0 commit comments

Comments
 (0)