diff --git a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java index 6851dcc1..8b0ae298 100644 --- a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java +++ b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java @@ -24,4 +24,6 @@ public class CodeGPTKeys { Key.create("codegpt.editorCompletionLines"); public static final Key IS_FETCHING_COMPLETION = Key.create("codegpt.isFetchingCompletion"); + public static final Key IS_PROMPT_TEXT_FIELD_DOCUMENT = + Key.create("codegpt.isPromptTextFieldDocument"); } diff --git a/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java index 35104283..8c69c1b0 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java @@ -1,5 +1,7 @@ package ee.carlrobert.codegpt.completions; +import static ee.carlrobert.codegpt.CodeGPTKeys.IS_PROMPT_TEXT_FIELD_DOCUMENT; + import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElementBuilder; @@ -7,20 +9,31 @@ import com.intellij.codeInsight.lookup.LookupManagerListener; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.PsiElement; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtilCore; import ee.carlrobert.codegpt.Icons; import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; +import java.util.List; import java.util.Optional; import org.jetbrains.annotations.Nullable; public class MethodNameLookupListener implements LookupManagerListener { + private static final Logger LOG = Logger.getInstance(MethodNameLookupListener.class); + @Override public void activeLookupChanged(@Nullable Lookup oldLookup, @Nullable Lookup newLookup) { - if (!ConfigurationSettings.getState().getMethodNameGenerationEnabled() - || !CompletionRequestService.isRequestAllowed() - || !(newLookup instanceof LookupImpl lookup)) { + if (!(newLookup instanceof LookupImpl lookup)) { + return; + } + + Boolean isPromptTextFieldDocument = IS_PROMPT_TEXT_FIELD_DOCUMENT.get( + lookup.getEditor().getDocument()); + if ((isPromptTextFieldDocument != null && isPromptTextFieldDocument) + || !ConfigurationSettings.getState().getMethodNameGenerationEnabled() + || !CompletionRequestService.isRequestAllowed()) { return; } @@ -30,7 +43,7 @@ public class MethodNameLookupListener implements LookupManagerListener { .ifPresent(context -> application.runReadAction(() -> { var type = PsiUtilCore.getElementType(context); - if ("METHOD".equals(type.toString())) { + if (PSIMethodMapping.contains(type)) { var selection = context.getText(); application.executeOnPooledThread(() -> addCompletionLookupValues(lookup, application, selection)); @@ -45,13 +58,40 @@ public class MethodNameLookupListener implements LookupManagerListener { CompletionRequestService.getInstance().getLookupCompletion(prompt) .ifPresent(response -> { for (var value : response.split(",")) { - application.runReadAction(() -> { + application.invokeLater(() -> application.runReadAction(() -> { lookup.addItem( LookupElementBuilder.create(value.trim()).withIcon(Icons.Sparkle), PrefixMatcher.ALWAYS_TRUE); - application.invokeLater(() -> lookup.refreshUi(true, true)); - }); + lookup.refreshUi(true, true); + })); } }); } + + private enum PSIMethodMapping { + GO(List.of("FILE", "METHOD_DECLARATION|FUNCTION_DECLARATION")), + JAVA(List.of("java.FILE", "METHOD")), + PY(List.of("FILE", "Py:FUNCTION_DECLARATION")), + JAVASCRIPT(List.of("JS:FUNCTION_DECLARATION", "JS:TYPESCRIPT_FUNCTION")), + CS(List.of("FILE", "DUMMY_TYPE_DECLARATION", "DUMMY_BLOCK")), + PHP(List.of("FILE", "Class method|function|Function")), + KOTLIN(List.of("FUN")), + DEFAULT(List.of("FILE", "METHOD_DECLARATION")); + + private final List types; + + PSIMethodMapping(List codes) { + this.types = codes; + } + + public static boolean contains(IElementType type) { + LOG.info("Trying to find method mapping for type: " + type.toString()); + for (var value : PSIMethodMapping.values()) { + if (value.types.contains(type.toString())) { + return true; + } + } + return false; + } + } } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt index 13daf428..7864b397 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt @@ -15,6 +15,7 @@ import com.intellij.ui.EditorTextField import com.intellij.ui.JBColor import com.intellij.util.ui.JBUI import ee.carlrobert.codegpt.CodeGPTBundle +import ee.carlrobert.codegpt.CodeGPTKeys.IS_PROMPT_TEXT_FIELD_DOCUMENT import ee.carlrobert.codegpt.ui.textarea.suggestion.SuggestionsPopupManager import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionActionItem import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionItem @@ -49,6 +50,7 @@ class PromptTextField( background = JBColor.background() minimumSize = Dimension(100, 40) document.addDocumentListener(getDocumentListener(onTextChanged)) + IS_PROMPT_TEXT_FIELD_DOCUMENT.set(document, true) setPlaceholder(CodeGPTBundle.get("toolwindow.chat.textArea.emptyText")) IdeEventQueue.getInstance().addDispatcher( PromptTextFieldEventDispatcher(this, suggestionsPopupManager, appliedInlays) {