From 6c9692b819842c7613283c8dbf9e8e4d28b70a00 Mon Sep 17 00:00:00 2001 From: yonip23 Date: Tue, 8 Aug 2023 16:01:01 +0300 Subject: [PATCH 1/5] DEV2-3340 include text in workspace context --- .../context/BasicContextCache.kt | 11 ++++++++++ .../context/GetBasicContextHandler.kt | 21 +++++++++++-------- .../workspace/FindSymbolsCommandExecutor.kt | 12 ++++++++++- .../context/workspace/WorkspaceContext.kt | 4 +++- .../com/tabnine/unitTests/GsonSerDeTests.kt | 7 +++++++ 5 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt new file mode 100644 index 000000000..7698ee8ab --- /dev/null +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt @@ -0,0 +1,11 @@ +package com.tabnineCommon.chat.commandHandlers.context + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.util.Key + +object BasicContextCache { + private val fileMetadataKey = Key.create("com.tabnine.FileMetadataCacheEntry") + fun save(editor: Editor, entry: BasicContext) = editor.putUserData(fileMetadataKey, entry) + + fun get(editor: Editor) = editor.getUserData(fileMetadataKey) +} diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/GetBasicContextHandler.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/GetBasicContextHandler.kt index 893732034..625a83913 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/GetBasicContextHandler.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/GetBasicContextHandler.kt @@ -11,9 +11,9 @@ import com.tabnineCommon.general.DependencyContainer import java.io.File data class BasicContext( - private val fileUri: String? = null, - private val language: String? = null, - private var metadata: JsonObject? = null + val fileUri: String? = null, + val language: String? = null, + var metadata: JsonObject? = null ) { constructor(metadata: JsonObject?) : this() { this.metadata = metadata @@ -23,20 +23,23 @@ data class BasicContext( class GetBasicContextHandler(gson: Gson) : ChatMessageHandler(gson) { private val binaryRequestFacade = DependencyContainer.instanceOfBinaryRequestFacade() - override fun handle(payload: Unit?, project: Project): BasicContext? { + override fun handle(payload: Unit?, project: Project): BasicContext { val editor = getEditorFromProject(project) ?: return noEditorResponse(project) val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) val fileUri = psiFile?.virtualFile?.path - val language = psiFile?.language?.id - - var metadata = if (fileUri != null) binaryRequestFacade.executeRequest(FileMetadataRequest(fileUri)) else null - + var metadata = fileUri?.let { + binaryRequestFacade.executeRequest(FileMetadataRequest(it)) + } if (metadata?.has("error") == true) { metadata = null } + val language = metadata?.get("language")?.asString ?: psiFile?.language?.id + + val basicContext = BasicContext(fileUri, language, metadata) + BasicContextCache.save(editor, basicContext) - return BasicContext(fileUri, language, metadata) + return basicContext } override fun deserializeRequest(data: JsonElement?) {} diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt index 347117df9..8818d989c 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt @@ -1,12 +1,22 @@ package com.tabnineCommon.chat.commandHandlers.context.workspace +import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.tabnineCommon.chat.commandHandlers.context.BasicContextCache import com.tabnineCommon.chat.commandHandlers.utils.SymbolsResolver class FindSymbolsCommandExecutor : CommandsExecutor { override fun execute(arg: String, editor: Editor, project: Project): List { + val basicContext = BasicContextCache.get(editor) + if (basicContext == null || basicContext.language.isNullOrBlank()) { + Logger.getInstance(javaClass).warn("Could not obtain basic context, skipping findSymbols command execution") + return emptyList() + } + return SymbolsResolver.resolveSymbols(project, editor.document, arg, 5) - .map { "${it.name} - ${it.relativePath}" } + .filter { !it.text.isNullOrBlank() } + .take(2) + .map { "file: ${it.relativePath}\n```${basicContext.language}\n${it.text}\n```" } } } diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt index 952278963..5ba8988c4 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt @@ -41,7 +41,9 @@ data class WorkspaceContext( tasks.mapNotNull { it.get() }.forEach { executionResult -> when (executionResult.command) { - Command.FindSymbols -> symbols.addAll(executionResult.result) + // we reverse the list to get the most relevant symbols at the bottom - closer + // to the end of the prompt eventually. + Command.FindSymbols -> symbols.addAll(executionResult.result.distinct().reversed()) } } diff --git a/Tabnine/src/test/java/com/tabnine/unitTests/GsonSerDeTests.kt b/Tabnine/src/test/java/com/tabnine/unitTests/GsonSerDeTests.kt index 307ae5fef..03cc73dac 100644 --- a/Tabnine/src/test/java/com/tabnine/unitTests/GsonSerDeTests.kt +++ b/Tabnine/src/test/java/com/tabnine/unitTests/GsonSerDeTests.kt @@ -22,6 +22,13 @@ class GsonDeserializeTests { assert(testGson.test == "test" && testGson.number == 1) } + @Test + fun shouldIgnoreExtraFields() { + val json = "{\"test\":\"test\",\"number\":1,\"extra\":\"extra\"}" + val testGson = ourSingletonGson.fromJson(json, Simple::class.java) + assert(testGson.test == "test" && testGson.number == 1) + } + @Test fun shouldDeserializeDoubleCorrectly() { val json = "{\"double\":1.1}" From 212d34e50be883b0558fc9621231c4ea6758647e Mon Sep 17 00:00:00 2001 From: yonip23 Date: Tue, 8 Aug 2023 17:56:17 +0300 Subject: [PATCH 2/5] change cache terminology --- .../chat/commandHandlers/context/BasicContextCache.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt index 7698ee8ab..21b5e1d7a 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/BasicContextCache.kt @@ -4,8 +4,8 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.Key object BasicContextCache { - private val fileMetadataKey = Key.create("com.tabnine.FileMetadataCacheEntry") - fun save(editor: Editor, entry: BasicContext) = editor.putUserData(fileMetadataKey, entry) + private val basicContextKey = Key.create("com.tabnine.BasicContextCacheKey") + fun save(editor: Editor, entry: BasicContext) = editor.putUserData(basicContextKey, entry) - fun get(editor: Editor) = editor.getUserData(fileMetadataKey) + fun get(editor: Editor) = editor.getUserData(basicContextKey) } From bcc8cf52e0e6e8edbdf8717a7d443ed801ea9282 Mon Sep 17 00:00:00 2001 From: yonip23 Date: Tue, 8 Aug 2023 17:59:21 +0300 Subject: [PATCH 3/5] use lowercase language --- .../context/workspace/FindSymbolsCommandExecutor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt index 8818d989c..fd0ad3c90 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt @@ -17,6 +17,6 @@ class FindSymbolsCommandExecutor : CommandsExecutor { return SymbolsResolver.resolveSymbols(project, editor.document, arg, 5) .filter { !it.text.isNullOrBlank() } .take(2) - .map { "file: ${it.relativePath}\n```${basicContext.language}\n${it.text}\n```" } + .map { "file: ${it.relativePath}\n```${basicContext.language.toLowerCase()}\n${it.text}\n```" } } } From 0ab8731e8bad9f877ccb3f8f012bdef24ddcf1bf Mon Sep 17 00:00:00 2001 From: yonip23 Date: Tue, 8 Aug 2023 18:05:47 +0300 Subject: [PATCH 4/5] distinct on all symbols --- .../commandHandlers/context/workspace/WorkspaceContext.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt index 5ba8988c4..9c3168d8f 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/WorkspaceContext.kt @@ -43,11 +43,11 @@ data class WorkspaceContext( when (executionResult.command) { // we reverse the list to get the most relevant symbols at the bottom - closer // to the end of the prompt eventually. - Command.FindSymbols -> symbols.addAll(executionResult.result.distinct().reversed()) + Command.FindSymbols -> symbols.addAll(executionResult.result.reversed()) } } - WorkspaceContext(symbols) + WorkspaceContext(symbols.distinct()) } catch (e: TimeoutException) { Logger.getInstance(WorkspaceContext::class.java) .warn("Timeout while waiting for workspace commands to execute, continuing without workspace symbols") From 6cde8a4d72cb8128636523b73b676f9ae176f8d1 Mon Sep 17 00:00:00 2001 From: yonip23 Date: Fri, 11 Aug 2023 00:40:03 +0300 Subject: [PATCH 5/5] format --- .../context/workspace/FindSymbolsCommandExecutor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt index f0b7c0ef2..350066459 100644 --- a/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt +++ b/Common/src/main/java/com/tabnineCommon/chat/commandHandlers/context/workspace/FindSymbolsCommandExecutor.kt @@ -3,8 +3,8 @@ package com.tabnineCommon.chat.commandHandlers.context.workspace import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import com.tabnineCommon.chat.commandHandlers.utils.StringCaseConverter import com.tabnineCommon.chat.commandHandlers.context.BasicContextCache +import com.tabnineCommon.chat.commandHandlers.utils.StringCaseConverter import com.tabnineCommon.chat.commandHandlers.utils.SymbolsResolver import com.tabnineCommon.chat.commandHandlers.utils.submitReadAction import java.util.concurrent.CompletableFuture