Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

clients: extend completion request context for intelij idea #2044

Merged
merged 2 commits into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion clients/intellij/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ intellij {
version.set("2022.2.5")
type.set("IC") // Target IDE Platform

plugins.set(listOf(/* Plugin Dependencies */))
plugins.set(listOf("git4idea"))
}

tasks {
Expand Down Expand Up @@ -67,3 +67,4 @@ tasks {
channels.set(listOf("alpha"))
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,22 @@ class Agent : ProcessAdapter() {
val filepath: String,
val language: String,
val text: String,
val indentation: String?,
val position: Int,
val manually: Boolean?,
)
val workspace: String?,
val git: GitContext?
) {
data class GitContext(
val root: String,
val remotes: List<GitRemote>
) {
data class GitRemote(
val name: String,
val url: String,
)
}
}

data class CompletionResponse(
val id: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.intellij.notification.Notification
import com.intellij.notification.NotificationType
import com.intellij.notification.Notifications
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.application.ApplicationInfo
Expand All @@ -23,8 +22,11 @@ import com.intellij.openapi.keymap.Keymap
import com.intellij.openapi.keymap.KeymapManagerListener
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import com.tabbyml.intellijtabby.git.GitContextProvider
import com.tabbyml.intellijtabby.settings.ApplicationConfigurable
import com.tabbyml.intellijtabby.settings.ApplicationSettingsState
import com.tabbyml.intellijtabby.settings.KeymapSettings
Expand All @@ -36,6 +38,7 @@ import kotlinx.coroutines.flow.*
class AgentService : Disposable {
private val logger = Logger.getInstance(AgentService::class.java)
private var agent: Agent = Agent()
private var gitContextProvider: GitContextProvider = service<GitContextProvider>()
val scope: CoroutineScope = CoroutineScope(Dispatchers.IO)

private var initFailedNotification: Notification? = null
Expand Down Expand Up @@ -267,23 +270,42 @@ class AgentService : Disposable {

suspend fun provideCompletion(editor: Editor, offset: Int, manually: Boolean = false): Agent.CompletionResponse? {
waitForInitialized()
return ReadAction.compute<PsiFile, Throwable> {
editor.project?.let { project ->
val project = editor.project ?: return null

return ReadAction.compute<PsiFile?, Throwable> {
PsiDocumentManager.getInstance(project).getPsiFile(editor.document)
}
}?.let { file ->
}?.let { file ->
agent.provideCompletions(
Agent.CompletionRequest(
file.virtualFile.path,
file.getLanguageId(),
editor.document.text,
getIndention(project, file),
offset,
manually,
project.basePath,
getRemotesForProjectGit(project, file)
)
)
}
}

private fun getIndention(project: Project, file: PsiFile): String? {
val codeStyleSettingsManager = CodeStyleSettingsManager.getInstance(project)
val projectSettings = codeStyleSettingsManager.mainProjectCodeStyle ?: return null
val indentionOptions = projectSettings.getCommonSettings(file.language).indentOptions ?: return null

if (indentionOptions.USE_TAB_CHARACTER) {
return "\t"
}

return " ".repeat(indentionOptions.INDENT_SIZE)
}

private fun getRemotesForProjectGit(project: Project, file: PsiFile): Agent.CompletionRequest.GitContext? {
return gitContextProvider.getGitContextForFile(project, file.virtualFile)
}

suspend fun postEvent(event: Agent.LogEventRequest) {
waitForInitialized()
agent.postEvent(event)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.tabbyml.intellijtabby.git

import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.tabbyml.intellijtabby.agent.Agent

class DefaultGitContextProvider : GitContextProvider {
override fun getGitContextForFile(project: Project, file: VirtualFile): Agent.CompletionRequest.GitContext? {
return null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.tabbyml.intellijtabby.git

import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.tabbyml.intellijtabby.agent.Agent
import git4idea.repo.GitRepositoryManager

class Git4IdeaGitContextProvider : GitContextProvider {
override fun getGitContextForFile(project: Project, file: VirtualFile): Agent.CompletionRequest.GitContext? {
val manger = GitRepositoryManager.getInstance(project)
val repository = manger.getRepositoryForFile(file)
if (repository === null) return null

val remotes = ArrayList<Agent.CompletionRequest.GitContext.GitRemote>()

for (remote in repository.remotes) {
val url = remote.firstUrl
if (url !== null) {
remotes.add(Agent.CompletionRequest.GitContext.GitRemote(remote.name, url))
}
}

if (remotes.isEmpty()) return null

return Agent.CompletionRequest.GitContext(repository.root.path, remotes)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.tabbyml.intellijtabby.git

import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.tabbyml.intellijtabby.agent.Agent

interface GitContextProvider {
fun getGitContextForFile(project: Project, file: VirtualFile): Agent.CompletionRequest.GitContext?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceInterface="com.tabbyml.intellijtabby.git.GitContextProvider"
serviceImplementation="com.tabbyml.intellijtabby.git.Git4IdeaGitContextProvider"
overrides="true" />
</extensions>
</idea-plugin>
4 changes: 4 additions & 0 deletions clients/intellij/src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<depends optional="true" config-file="git4idea-features.xml">Git4Idea</depends>


<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
Expand All @@ -50,6 +52,8 @@
displayType="STICKY_BALLOON"
bundle="strings"
key="tabby.warning"/>
<applicationService serviceInterface="com.tabbyml.intellijtabby.git.GitContextProvider"
serviceImplementation="com.tabbyml.intellijtabby.git.DefaultGitContextProvider" />
</extensions>

<actions>
Expand Down
Loading