refactor: extract configuration state into standalone class

This commit is contained in:
Carl-Robert Linnupuu 2024-02-07 02:13:22 +02:00
parent d0132c6c34
commit 097f0914bf
25 changed files with 165 additions and 199 deletions

View file

@ -13,7 +13,7 @@ import com.intellij.openapi.startup.StartupActivity;
import com.intellij.openapi.updateSettings.impl.UpdateChecker;
import com.intellij.openapi.updateSettings.impl.UpdateSettings;
import com.intellij.util.concurrency.AppExecutorUtil;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.ui.OverlayUtil;
import java.util.concurrent.TimeUnit;
import org.jetbrains.annotations.NotNull;
@ -31,7 +31,7 @@ public class CodeGPTUpdateStartupActivity implements StartupActivity.Background
private void schedulePluginUpdateChecks(Project project) {
AppExecutorUtil.getAppScheduledExecutorService().scheduleWithFixedDelay(() -> {
if (project != null && ConfigurationState.getInstance().isCheckForPluginUpdates()) {
if (project != null && ConfigurationSettings.getCurrentState().isCheckForPluginUpdates()) {
new CheckForUpdatesTask(project).queue();
}
@ -67,7 +67,7 @@ public class CodeGPTUpdateStartupActivity implements StartupActivity.Background
.executeOnPooledThread(() -> installCodeGPTUpdate(myProject))))
.addAction(NotificationAction.createSimpleExpiring(
CodeGPTBundle.get("checkForUpdatesTask.notification.hideButton"),
() -> ConfigurationState.getInstance().setCheckForPluginUpdates(false)))
() -> ConfigurationSettings.getCurrentState().setCheckForPluginUpdates(false)))
.notify(myProject);
}
}

View file

@ -15,7 +15,7 @@ import com.intellij.openapi.compiler.CompilerMessageCategory;
import com.intellij.openapi.project.Project;
import ee.carlrobert.codegpt.completions.CompletionRequestProvider;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager;
import ee.carlrobert.codegpt.ui.OverlayUtil;
import ee.carlrobert.embedding.ReferencedFile;
@ -40,8 +40,7 @@ public class ProjectCompilationStatusListener implements CompilationStatusListen
int errors,
int warnings,
@NotNull CompileContext compileContext) {
var configuration = ConfigurationState.getInstance();
var success = !configuration.isCaptureCompileErrors()
var success = !ConfigurationSettings.getCurrentState().isCaptureCompileErrors()
|| (!aborted && errors == 0 && warnings == 0);
if (success) {
return;
@ -56,7 +55,7 @@ public class ProjectCompilationStatusListener implements CompilationStatusListen
.sendMessage(getMultiFileMessage(compileContext), FIX_COMPILE_ERRORS)))
.addAction(NotificationAction.createSimpleExpiring(
CodeGPTBundle.get("checkForUpdatesTask.notification.hideButton"),
() -> ConfigurationState.getInstance().setCaptureCompileErrors(false)))
() -> ConfigurationSettings.getCurrentState().setCaptureCompileErrors(false)))
.notify(project);
}
}

View file

@ -4,7 +4,7 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import ee.carlrobert.codegpt.codecompletions.CodeGPTEditorManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import org.jetbrains.annotations.NotNull;
/**
@ -14,7 +14,7 @@ public class DisableCompletionsAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ConfigurationState.getInstance().setCodeCompletionsEnabled(false);
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(false);
CodeGPTEditorManager.getInstance().disposeAllInlays(e.getProject());
ApplicationManager.getApplication()
.getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC)
@ -23,7 +23,7 @@ public class DisableCompletionsAction extends AnAction {
@Override
public void update(@NotNull AnActionEvent e) {
var codeCompletionEnabled = ConfigurationState.getInstance().isCodeCompletionsEnabled();
var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled();
e.getPresentation().setEnabled(codeCompletionEnabled);
e.getPresentation().setVisible(codeCompletionEnabled);
}

View file

@ -3,7 +3,7 @@ package ee.carlrobert.codegpt.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import org.jetbrains.annotations.NotNull;
/**
@ -13,7 +13,7 @@ public class EnableCompletionsAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ConfigurationState.getInstance().setCodeCompletionsEnabled(true);
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true);
ApplicationManager.getApplication()
.getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC)
.onCodeCompletionsEnabledChange(true);
@ -21,7 +21,7 @@ public class EnableCompletionsAction extends AnAction {
@Override
public void update(@NotNull AnActionEvent e) {
var codeCompletionEnabled = ConfigurationState.getInstance().isCodeCompletionsEnabled();
var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled();
e.getPresentation().setEnabled(!codeCompletionEnabled);
e.getPresentation().setVisible(!codeCompletionEnabled);
}

View file

@ -12,7 +12,7 @@ import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.project.Project;
import ee.carlrobert.codegpt.CodeGPTKeys;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager;
import ee.carlrobert.codegpt.util.file.FileUtil;
import ee.carlrobert.embedding.ReferencedFile;
@ -52,7 +52,7 @@ public class EditorActionsUtil {
group.add(new CustomPromptAction());
group.addSeparator();
var configuredActions = ConfigurationState.getInstance().getTableData();
var configuredActions = ConfigurationSettings.getCurrentState().getTableData();
configuredActions.forEach((label, prompt) -> {
// using label as action description to prevent com.intellij.diagnostic.PluginException
// https://github.com/carlrobertoh/CodeGPT/issues/95

View file

@ -17,7 +17,7 @@ import javax.annotation.ParametersAreNonnullByDefault;
import org.jetbrains.annotations.Nullable;
@ParametersAreNonnullByDefault
class CodeCompletionEventListener implements CompletionEventListener {
class CodeCompletionEventListener implements CompletionEventListener<String> {
private static final Logger LOG = Logger.getInstance(CodeCompletionEventListener.class);

View file

@ -10,7 +10,7 @@ import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.event.SelectionEvent;
import com.intellij.openapi.editor.event.SelectionListener;
import ee.carlrobert.codegpt.actions.CodeCompletionEnabledListener;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -25,7 +25,7 @@ public class CodeCompletionListenerBinder implements Disposable {
public CodeCompletionListenerBinder(Editor editor) {
this.editor = editor;
if (ConfigurationState.getInstance().isCodeCompletionsEnabled()) {
if (ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled()) {
addListeners();
}

View file

@ -22,10 +22,8 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorCustomElementRenderer;
import com.intellij.openapi.editor.Inlay;
import com.intellij.openapi.editor.InlayModel;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
@ -35,7 +33,7 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock;
import com.intellij.util.concurrency.annotations.RequiresWriteLock;
import ee.carlrobert.codegpt.actions.CodeCompletionEnabledListener;
import ee.carlrobert.codegpt.completions.CompletionRequestService;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.util.EditorUtil;
import java.awt.event.KeyEvent;
import java.util.List;
@ -77,7 +75,7 @@ public final class CodeCompletionService implements Disposable {
Project project = editor.getProject();
if (project == null
|| project.isDisposed()
|| !ConfigurationState.getInstance().isCodeCompletionsEnabled()
|| !ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled()
|| !EditorUtil.isSelectedEditor(editor)
|| LookupManager.getActiveLookup(editor) != null
|| editor.isViewer()
@ -155,7 +153,7 @@ public final class CodeCompletionService implements Disposable {
Document document = editor.getDocument();
document.insertString(offset, text);
editor.getCaretModel().moveToOffset(offset + text.length());
if (ConfigurationState.getInstance().isAutoFormattingEnabled()) {
if (ConfigurationSettings.getCurrentState().isAutoFormattingEnabled()) {
EditorUtil.reformatDocument(
requireNonNull(editor.getProject()),
document,

View file

@ -14,7 +14,7 @@ import ee.carlrobert.codegpt.completions.llama.PromptTemplate;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.ConversationsState;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.settings.service.ServiceType;
import ee.carlrobert.codegpt.settings.state.IncludedFilesSettingsState;
import ee.carlrobert.codegpt.settings.state.LlamaSettingsState;
@ -123,7 +123,7 @@ public class CompletionRequestProvider {
systemPrompt,
message.getPrompt(),
conversation.getMessages());
var configuration = ConfigurationState.getInstance();
var configuration = ConfigurationSettings.getCurrentState();
return new LlamaCompletionRequest.Builder(prompt)
.setN_predict(configuration.getMaxTokens())
.setTemperature(configuration.getTemperature())
@ -154,13 +154,13 @@ public class CompletionRequestProvider {
CallParameters callParameters,
boolean useContextualSearch,
@Nullable String overriddenPath) {
var configuration = ConfigurationSettings.getCurrentState();
var builder = new OpenAIChatCompletionRequest.Builder(
buildMessages(model, callParameters, useContextualSearch))
.setModel(model)
.setMaxTokens(ConfigurationState.getInstance().getMaxTokens())
.setMaxTokens(configuration.getMaxTokens())
.setStream(true)
.setTemperature(ConfigurationState.getInstance().getTemperature());
.setTemperature(configuration.getTemperature());
if (overriddenPath != null) {
builder.setOverriddenPath(overriddenPath);
@ -183,7 +183,7 @@ public class CompletionRequestProvider {
if (callParameters.getConversationType() == ConversationType.DEFAULT) {
messages.add(new OpenAIChatCompletionMessage(
"system",
ConfigurationState.getInstance().getSystemPrompt()));
ConfigurationSettings.getCurrentState().getSystemPrompt()));
}
if (callParameters.getConversationType() == ConversationType.FIX_COMPILE_ERRORS) {
messages.add(new OpenAIChatCompletionMessage("system", FIX_COMPILE_ERRORS_SYSTEM_PROMPT));
@ -213,7 +213,7 @@ public class CompletionRequestProvider {
int totalUsage = messages.parallelStream()
.mapToInt(encodingManager::countMessageTokens)
.sum() + ConfigurationState.getInstance().getMaxTokens();
.sum() + ConfigurationSettings.getCurrentState().getMaxTokens();
int modelMaxTokens;
try {
modelMaxTokens = OpenAIChatCompletionModel.findByCode(model).getMaxTokens();

View file

@ -11,7 +11,7 @@ import ee.carlrobert.codegpt.codecompletions.CodeCompletionRequestProvider;
import ee.carlrobert.codegpt.codecompletions.InfillRequestDetails;
import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
@ -89,10 +89,10 @@ public final class CompletionRequestService {
public void generateCommitMessageAsync(
String prompt,
CompletionEventListener eventListener) {
CompletionEventListener<String> eventListener) {
var request = new OpenAIChatCompletionRequest.Builder(List.of(
new OpenAIChatCompletionMessage("system",
ConfigurationState.getInstance().getCommitMessagePrompt()),
ConfigurationSettings.getCurrentState().getCommitMessagePrompt()),
new OpenAIChatCompletionMessage("user", prompt)))
.setModel(OpenAISettingsState.getInstance().getModel())
.build();

View file

@ -11,7 +11,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiUtilCore;
import ee.carlrobert.codegpt.Icons;
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import java.util.Optional;
import org.jetbrains.annotations.Nullable;
@ -20,10 +20,10 @@ public class MethodNameLookupListener implements LookupManagerListener {
@Override
public void activeLookupChanged(@Nullable Lookup oldLookup, @Nullable Lookup newLookup) {
var application = ApplicationManager.getApplication();
var configuration = ConfigurationState.getInstance();
var configuration = ConfigurationSettings.getCurrentState();
var credentialsManager = OpenAICredentialsManager.getInstance();
if (!configuration.isMethodRefactoringEnabled()
if (!configuration.isMethodNameGenerationEnabled()
|| !credentialsManager.isApiKeySet()
|| !(newLookup instanceof LookupImpl)) {
return;

View file

@ -103,7 +103,8 @@ public class ConfigurationComponent {
systemPromptTextArea.setColumns(60);
systemPromptTextArea.setRows(3);
commitMessagePromptTextArea = new JBTextArea(configuration.getCommitMessagePrompt(), 3, 60);
commitMessagePromptTextArea = new JBTextArea(configuration.getCommitMessagePrompt(),
3, 60);
commitMessagePromptTextArea.setLineWrap(true);
commitMessagePromptTextArea.setBorder(JBUI.Borders.empty(8, 4));
@ -115,7 +116,7 @@ public class ConfigurationComponent {
configuration.isCreateNewChatOnEachAction());
methodNameGenerationCheckBox = new JBCheckBox(
CodeGPTBundle.get("configurationConfigurable.enableMethodNameGeneration.label"),
configuration.isMethodRefactoringEnabled());
configuration.isMethodNameGenerationEnabled());
autoFormattingCheckBox = new JBCheckBox(
CodeGPTBundle.get("configurationConfigurable.autoFormatting.label"),
configuration.isAutoFormattingEnabled());
@ -142,7 +143,36 @@ public class ConfigurationComponent {
return mainPanel;
}
public Map<String, String> getTableData() {
public ConfigurationState getCurrentFormState() {
var state = new ConfigurationState();
state.setTableData(getTableData());
state.setMaxTokens(maxTokensField.getValue());
state.setTemperature(Double.parseDouble(temperatureField.getText()));
state.setSystemPrompt(systemPromptTextArea.getText());
state.setCommitMessagePrompt(commitMessagePromptTextArea.getText());
state.setCheckForPluginUpdates(checkForPluginUpdatesCheckBox.isSelected());
state.setCreateNewChatOnEachAction(openNewTabCheckBox.isSelected());
state.setMethodNameGenerationEnabled(methodNameGenerationCheckBox.isSelected());
state.setAutoFormattingEnabled(autoFormattingCheckBox.isSelected());
state.setCodeCompletionsEnabled(
ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled());
return state;
}
public void resetForm() {
var configuration = ConfigurationSettings.getCurrentState();
setTableData(configuration.getTableData());
maxTokensField.setValue(configuration.getMaxTokens());
temperatureField.setText(String.valueOf(configuration.getTemperature()));
systemPromptTextArea.setText(configuration.getSystemPrompt());
commitMessagePromptTextArea.setText(configuration.getCommitMessagePrompt());
checkForPluginUpdatesCheckBox.setSelected(configuration.isCheckForPluginUpdates());
openNewTabCheckBox.setSelected(configuration.isCreateNewChatOnEachAction());
methodNameGenerationCheckBox.setSelected(configuration.isMethodNameGenerationEnabled());
autoFormattingCheckBox.setSelected(configuration.isAutoFormattingEnabled());
}
private Map<String, String> getTableData() {
var model = getModel();
Map<String, String> data = new LinkedHashMap<>();
for (int count = 0; count < model.getRowCount(); count++) {
@ -264,70 +294,6 @@ public class ConfigurationComponent {
tableData.forEach((action, prompt) -> model.addRow(new Object[]{action, prompt}));
}
public void setSystemPrompt(String systemPrompt) {
systemPromptTextArea.setText(systemPrompt);
}
public String getSystemPrompt() {
return systemPromptTextArea.getText();
}
public void setCommitMessagePrompt(String commitMessagePrompt) {
commitMessagePromptTextArea.setText(commitMessagePrompt);
}
public String getCommitMessagePrompt() {
return commitMessagePromptTextArea.getText();
}
public double getTemperature() {
return Double.parseDouble(temperatureField.getText());
}
public void setTemperature(double temperature) {
temperatureField.setText(String.valueOf(temperature));
}
public int getMaxTokens() {
return maxTokensField.getValue();
}
public void setMaxTokens(int maxTokens) {
maxTokensField.setValue(maxTokens);
}
public boolean isCheckForPluginUpdates() {
return checkForPluginUpdatesCheckBox.isSelected();
}
public void setCheckForPluginUpdates(boolean checkForUpdates) {
checkForPluginUpdatesCheckBox.setSelected(checkForUpdates);
}
public boolean isCreateNewChatOnEachAction() {
return openNewTabCheckBox.isSelected();
}
public void setCreateNewChatOnEachAction(boolean createNewChatOnEachAction) {
openNewTabCheckBox.setSelected(createNewChatOnEachAction);
}
public boolean isMethodNameGenerationEnabled() {
return methodNameGenerationCheckBox.isSelected();
}
public void setDisableMethodNameGeneration(boolean disableMethodNameGeneration) {
methodNameGenerationCheckBox.setSelected(disableMethodNameGeneration);
}
public boolean isAutoFormattingEnabled() {
return autoFormattingCheckBox.isSelected();
}
public void setAutoFormattingEnabled(boolean enabled) {
autoFormattingCheckBox.setSelected(enabled);
}
class RevertToDefaultsActionButton extends AnActionButton {
RevertToDefaultsActionButton() {

View file

@ -4,7 +4,6 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.util.Disposer;
import ee.carlrobert.codegpt.CodeGPTBundle;
import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil;
import javax.swing.JComponent;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.Nullable;
@ -24,63 +23,27 @@ public class ConfigurationConfigurable implements Configurable {
@Nullable
@Override
public JComponent createComponent() {
var configuration = ConfigurationState.getInstance();
parentDisposable = Disposer.newDisposable();
configurationComponent = new ConfigurationComponent(parentDisposable, configuration);
configurationComponent = new ConfigurationComponent(
parentDisposable,
ConfigurationSettings.getCurrentState());
return configurationComponent.getPanel();
}
@Override
public boolean isModified() {
var configuration = ConfigurationState.getInstance();
return !configurationComponent.getTableData().equals(configuration.getTableData())
|| configurationComponent.getMaxTokens() != configuration.getMaxTokens()
|| configurationComponent.getTemperature() != configuration.getTemperature()
|| !configurationComponent.getSystemPrompt().equals(configuration.getSystemPrompt())
|| !configurationComponent.getCommitMessagePrompt()
.equals(configuration.getCommitMessagePrompt())
|| configurationComponent.isCheckForPluginUpdates()
!= configuration.isCheckForPluginUpdates()
|| configurationComponent.isCreateNewChatOnEachAction()
!= configuration.isCreateNewChatOnEachAction()
|| configurationComponent.isMethodNameGenerationEnabled()
!= configuration.isMethodRefactoringEnabled()
|| configurationComponent.isAutoFormattingEnabled()
!= configuration.isAutoFormattingEnabled();
return !configurationComponent.getCurrentFormState()
.equals(ConfigurationSettings.getCurrentState());
}
@Override
public void apply() {
var configuration = ConfigurationState.getInstance();
configuration.setTableData(configurationComponent.getTableData());
configuration.setMaxTokens(configurationComponent.getMaxTokens());
configuration.setTemperature(configurationComponent.getTemperature());
configuration.setSystemPrompt(configurationComponent.getSystemPrompt());
configuration.setCommitMessagePrompt(configurationComponent.getCommitMessagePrompt());
configuration.setCheckForPluginUpdates(configurationComponent.isCheckForPluginUpdates());
configuration.setCreateNewChatOnEachAction(
configurationComponent.isCreateNewChatOnEachAction());
configuration.setMethodNameGenerationEnabled(
configurationComponent.isMethodNameGenerationEnabled());
configuration.setAutoFormattingEnabled(configurationComponent.isAutoFormattingEnabled());
EditorActionsUtil.refreshActions();
ConfigurationSettings.getInstance().loadState(configurationComponent.getCurrentFormState());
}
@Override
public void reset() {
var configuration = ConfigurationState.getInstance();
configurationComponent.setTableData(configuration.getTableData());
configurationComponent.setMaxTokens(configuration.getMaxTokens());
configurationComponent.setTemperature(configuration.getTemperature());
configurationComponent.setSystemPrompt(configuration.getSystemPrompt());
configurationComponent.setCommitMessagePrompt(configuration.getCommitMessagePrompt());
configurationComponent.setCheckForPluginUpdates(configuration.isCheckForPluginUpdates());
configurationComponent.setCreateNewChatOnEachAction(
configuration.isCreateNewChatOnEachAction());
configurationComponent.setDisableMethodNameGeneration(
configuration.isMethodRefactoringEnabled());
configurationComponent.setAutoFormattingEnabled(configuration.isAutoFormattingEnabled());
EditorActionsUtil.refreshActions();
configurationComponent.resetForm();
}
@Override

View file

@ -0,0 +1,34 @@
package ee.carlrobert.codegpt.settings.configuration;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import org.jetbrains.annotations.NotNull;
@State(
name = "CodeGPT_ConfigurationSettings_210",
storages = @Storage("CodeGPT_ConfigurationSettings_210.xml"))
public class ConfigurationSettings implements PersistentStateComponent<ConfigurationState> {
private ConfigurationState state = new ConfigurationState();
@Override
@NotNull
public ConfigurationState getState() {
return state;
}
@Override
public void loadState(@NotNull ConfigurationState state) {
this.state = state;
}
public static ConfigurationState getCurrentState() {
return getInstance().getState();
}
public static ConfigurationSettings getInstance() {
return ApplicationManager.getApplication().getService(ConfigurationSettings.class);
}
}

View file

@ -3,20 +3,11 @@ package ee.carlrobert.codegpt.settings.configuration;
import static ee.carlrobert.codegpt.completions.CompletionRequestProvider.COMPLETION_SYSTEM_PROMPT;
import static ee.carlrobert.codegpt.completions.CompletionRequestProvider.GENERATE_COMMIT_MESSAGE_SYSTEM_PROMPT;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.util.xmlb.XmlSerializerUtil;
import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
@State(
name = "CodeGPT_ConfigurationSettings_210",
storages = @Storage("CodeGPT_ConfigurationSettings_210.xml"))
public class ConfigurationState implements PersistentStateComponent<ConfigurationState> {
public class ConfigurationState {
private String systemPrompt = COMPLETION_SYSTEM_PROMPT;
private String commitMessagePrompt = GENERATE_COMMIT_MESSAGE_SYSTEM_PROMPT;
@ -31,21 +22,6 @@ public class ConfigurationState implements PersistentStateComponent<Configuratio
private boolean codeCompletionsEnabled;
private Map<String, String> tableData = EditorActionsUtil.DEFAULT_ACTIONS;
public static ConfigurationState getInstance() {
return ApplicationManager.getApplication().getService(ConfigurationState.class);
}
@Nullable
@Override
public ConfigurationState getState() {
return this;
}
@Override
public void loadState(@NotNull ConfigurationState state) {
XmlSerializerUtil.copyBean(state, this);
}
public String getSystemPrompt() {
return systemPrompt;
}
@ -110,7 +86,7 @@ public class ConfigurationState implements PersistentStateComponent<Configuratio
this.ignoreGitCommitTokenLimit = ignoreGitCommitTokenLimit;
}
public boolean isMethodRefactoringEnabled() {
public boolean isMethodNameGenerationEnabled() {
return methodNameGenerationEnabled;
}
@ -141,4 +117,35 @@ public class ConfigurationState implements PersistentStateComponent<Configuratio
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
this.codeCompletionsEnabled = codeCompletionsEnabled;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ConfigurationState that = (ConfigurationState) o;
return maxTokens == that.maxTokens
&& Double.compare(that.temperature, temperature) == 0
&& checkForPluginUpdates == that.checkForPluginUpdates
&& createNewChatOnEachAction == that.createNewChatOnEachAction
&& ignoreGitCommitTokenLimit == that.ignoreGitCommitTokenLimit
&& methodNameGenerationEnabled == that.methodNameGenerationEnabled
&& captureCompileErrors == that.captureCompileErrors
&& autoFormattingEnabled == that.autoFormattingEnabled
&& codeCompletionsEnabled == that.codeCompletionsEnabled
&& Objects.equals(systemPrompt, that.systemPrompt)
&& Objects.equals(commitMessagePrompt, that.commitMessagePrompt)
&& Objects.equals(tableData, that.tableData);
}
@Override
public int hashCode() {
return Objects.hash(systemPrompt, commitMessagePrompt, maxTokens, temperature,
checkForPluginUpdates, createNewChatOnEachAction, ignoreGitCommitTokenLimit,
methodNameGenerationEnabled, captureCompileErrors, autoFormattingEnabled,
codeCompletionsEnabled, tableData);
}
}

View file

@ -16,7 +16,7 @@ import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.ConversationService;
import ee.carlrobert.codegpt.conversations.ConversationsState;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import java.util.Arrays;
import java.util.Optional;
import org.jetbrains.annotations.NotNull;
@ -37,7 +37,7 @@ public final class StandardChatToolWindowContentManager {
public void sendMessage(Message message, ConversationType conversationType) {
getToolWindow().show();
if (ConfigurationState.getInstance().isCreateNewChatOnEachAction()
if (ConfigurationSettings.getCurrentState().isCreateNewChatOnEachAction()
|| ConversationsState.getCurrentConversation() == null) {
createNewTabPanel().sendMessage(message, conversationType);
return;

View file

@ -1,7 +1,7 @@
package ee.carlrobert.codegpt.toolwindow.chat.ui.textarea;
import ee.carlrobert.codegpt.EncodingManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
public class TotalTokensDetails {
@ -13,7 +13,7 @@ public class TotalTokensDetails {
public TotalTokensDetails(EncodingManager encodingManager) {
systemPromptTokens = encodingManager.countTokens(
ConfigurationState.getInstance().getSystemPrompt());
ConfigurationSettings.getCurrentState().getSystemPrompt());
}
public int getSystemPromptTokens() {

View file

@ -27,7 +27,7 @@ import com.intellij.util.ui.JBUI;
import ee.carlrobert.codegpt.CodeGPTBundle;
import ee.carlrobert.codegpt.conversations.ConversationsState;
import ee.carlrobert.codegpt.indexes.FolderStructureTreePanel;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.util.EditorUtil;
import java.awt.Point;
import java.awt.event.MouseEvent;
@ -115,7 +115,7 @@ public class OverlayUtil {
@Override
public void rememberChoice(boolean isSelected, int exitCode) {
if (isSelected) {
ConfigurationState.getInstance().setIgnoreGitCommitTokenLimit(true);
ConfigurationSettings.getCurrentState().setIgnoreGitCommitTokenLimit(true);
}
}

View file

@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.testFramework.LightVirtualFile;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.jetbrains.annotations.NotNull;
@ -116,7 +116,7 @@ public final class EditorUtil {
document.replaceString(startOffset, endOffset, text);
if (ConfigurationState.getInstance().isAutoFormattingEnabled()) {
if (ConfigurationSettings.getCurrentState().isAutoFormattingEnabled()) {
reformatDocument(project, document, startOffset, endOffset);
}

View file

@ -33,7 +33,7 @@
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.state.YouSettingsState"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.state.LlamaSettingsState"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.state.IncludedFilesSettingsState"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.configuration.ConfigurationState"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.settings.advanced.AdvancedSettingsState"/>
<applicationService serviceImplementation="ee.carlrobert.codegpt.conversations.ConversationsState"/>
<editorFactoryListener implementation="ee.carlrobert.codegpt.codecompletions.CodeGPTEditorListener"/>

View file

@ -12,7 +12,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.VisualPosition;
import com.intellij.openapi.util.TextRange;
import com.intellij.testFramework.PlatformTestUtil;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange;
import java.util.List;
import testsupport.IntegrationTest;
@ -23,7 +23,7 @@ public class CodeCompletionServiceTest extends IntegrationTest {
public void testFetchCodeCompletionLlama() {
useLlamaService();
ConfigurationState.getInstance().setCodeCompletionsEnabled(true);
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true);
myFixture.configureByText(
"CompletionTest.java",
getResourceContent("/codecompletions/code-completion-file.txt"));
@ -61,7 +61,7 @@ public class CodeCompletionServiceTest extends IntegrationTest {
}
public void testApplyInlayAction() {
ConfigurationState.getInstance().setAutoFormattingEnabled(false);
ConfigurationSettings.getCurrentState().setAutoFormattingEnabled(false);
myFixture.configureByText(
"CompletionTest.java",
getResourceContent("/codecompletions/code-completion-file.txt"));

View file

@ -12,7 +12,7 @@ import static org.assertj.core.groups.Tuple.tuple;
import ee.carlrobert.codegpt.conversations.ConversationService;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
import ee.carlrobert.llm.client.http.ResponseEntity;
import ee.carlrobert.llm.client.http.exchange.BasicHttpExchange;
@ -26,7 +26,7 @@ public class CompletionRequestProviderTest extends IntegrationTest {
public void testChatCompletionRequestWithSystemPromptOverride() {
OpenAICredentialsManager.getInstance().setApiKey("TEST_API_KEY");
OpenAISettingsState.getInstance().setBaseHost(null);
ConfigurationState.getInstance().setSystemPrompt("TEST_SYSTEM_PROMPT");
ConfigurationSettings.getCurrentState().setSystemPrompt("TEST_SYSTEM_PROMPT");
var conversation = ConversationService.getInstance().startConversation();
var firstMessage = createDummyMessage(500);
var secondMessage = createDummyMessage(250);
@ -85,7 +85,7 @@ public class CompletionRequestProviderTest extends IntegrationTest {
}
public void testChatCompletionRequestRetry() {
ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
var conversation = ConversationService.getInstance().startConversation();
var firstMessage = createDummyMessage("FIRST_TEST_PROMPT", 500);
var secondMessage = createDummyMessage("SECOND_TEST_PROMPT", 250);

View file

@ -12,10 +12,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import ee.carlrobert.codegpt.CodeGPTPlugin;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.ConversationService;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange;
import java.util.List;
@ -180,7 +179,7 @@ public class DefaultCompletionRequestHandlerTest extends IntegrationTest {
public void testLlamaChatCompletionCall() {
useLlamaService();
ConfigurationState.getInstance().setMaxTokens(99);
ConfigurationSettings.getCurrentState().setMaxTokens(99);
var message = new Message("TEST_PROMPT");
var conversation = ConversationService.getInstance().startConversation();
conversation.addMessage(new Message("Ping", "Pong"));

View file

@ -18,7 +18,7 @@ import ee.carlrobert.codegpt.completions.ConversationType;
import ee.carlrobert.codegpt.completions.HuggingFaceModel;
import ee.carlrobert.codegpt.conversations.ConversationService;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.codegpt.settings.state.LlamaSettingsState;
import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowTabPanel;
import ee.carlrobert.embedding.ReferencedFile;
@ -31,7 +31,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest {
public void testSendingOpenAIMessage() {
useOpenAIService();
ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
var message = new Message("Hello!");
var conversation = ConversationService.getInstance().startConversation();
var panel = new StandardChatToolWindowTabPanel(getProject(), conversation);
@ -94,7 +94,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest {
new ReferencedFile("TEST_FILE_NAME_2", "TEST_FILE_PATH_2", "TEST_FILE_CONTENT_2"),
new ReferencedFile("TEST_FILE_NAME_3", "TEST_FILE_PATH_3", "TEST_FILE_CONTENT_3")));
useOpenAIService();
ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
var message = new Message("TEST_MESSAGE");
message.setUserMessage("TEST_MESSAGE");
message.setReferencedFilePaths(
@ -181,7 +181,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest {
new ReferencedFile("TEST_FILE_NAME_2", "TEST_FILE_PATH_2", "TEST_FILE_CONTENT_2"),
new ReferencedFile("TEST_FILE_NAME_3", "TEST_FILE_PATH_3", "TEST_FILE_CONTENT_3")));
useOpenAIService();
ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
var message = new Message("TEST_MESSAGE");
message.setUserMessage("TEST_MESSAGE");
message.setReferencedFilePaths(
@ -264,7 +264,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest {
public void testSendingLlamaMessage() {
useLlamaService();
var configurationState = ConfigurationState.getInstance();
var configurationState = ConfigurationSettings.getCurrentState();
configurationState.setSystemPrompt(COMPLETION_SYSTEM_PROMPT);
configurationState.setMaxTokens(1000);
configurationState.setTemperature(0.1);

View file

@ -6,7 +6,7 @@ import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.testFramework.fixtures.BasePlatformTestCase;
import ee.carlrobert.codegpt.CodeGPTKeys;
import ee.carlrobert.codegpt.codecompletions.CodeGPTEditorManager;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
import ee.carlrobert.llm.client.mixin.ExternalServiceTestMixin;
import java.util.Collections;
import testsupport.mixin.ShortcutsTestMixin;
@ -22,7 +22,7 @@ public class IntegrationTest extends BasePlatformTestCase implements
@Override
protected void tearDown() throws Exception {
ExternalServiceTestMixin.clearAll();
ConfigurationState.getInstance().setCodeCompletionsEnabled(false);
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(false);
CodeGPTEditorManager.getInstance().disposeAllInlays(getProject());
ActionManager.getInstance().unregisterAction(APPLY_INLAY_ACTION_ID);
getProject().putUserData(CodeGPTKeys.SELECTED_FILES, Collections.emptyList());