From 80646e2af0f6fad8dad7f99140bd0a03a779488d Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Thu, 27 Mar 2025 02:07:09 +0100 Subject: [PATCH] feat: Add additional language for handling to CodeCompletion settings (#150) --- CodeHandler.cpp | 41 +++++++++++++++++++++++++++++ settings/CodeCompletionSettings.cpp | 12 +++++++++ settings/CodeCompletionSettings.hpp | 2 ++ settings/SettingsConstants.hpp | 1 + 4 files changed, 56 insertions(+) diff --git a/CodeHandler.cpp b/CodeHandler.cpp index 4172bc6..bbc892a 100644 --- a/CodeHandler.cpp +++ b/CodeHandler.cpp @@ -19,6 +19,7 @@ */ #include "CodeHandler.hpp" +#include #include #include @@ -32,6 +33,44 @@ struct LanguageProperties QVector fileExtensions; }; +const QVector customLanguagesFromSettings() +{ + QVector customLanguages; + + const QStringList customLanguagesList = Settings::codeCompletionSettings().customLanguages(); + for (const QString &entry : customLanguagesList) { + if (entry.trimmed().isEmpty()) { + continue; + } + + QStringList parts = entry.split(','); + if (parts.size() < 4) { + continue; + } + + QString name = parts[0].trimmed(); + QString commentStyle = parts[1].trimmed(); + QStringList modelNamesList = parts[2].trimmed().split(' ', Qt::SkipEmptyParts); + QStringList extensionsList = parts[3].trimmed().split(' ', Qt::SkipEmptyParts); + + if (!name.isEmpty() && !commentStyle.isEmpty() && !modelNamesList.isEmpty() + && !extensionsList.isEmpty()) { + QVector modelNames; + for (const auto &modelName : modelNamesList) { + modelNames.append(modelName); + } + + QVector extensions; + for (const auto &ext : extensionsList) { + extensions.append(ext); + } + + customLanguages.append({name, commentStyle, modelNames, extensions}); + } + } + + return customLanguages; +} const QVector &getKnownLanguages() { static QVector knownLanguages = { @@ -55,6 +94,8 @@ const QVector &getKnownLanguages() {"qml", "//", {"qml"}, {"qml"}}, }; + knownLanguages.append(customLanguagesFromSettings()); + return knownLanguages; } diff --git a/settings/CodeCompletionSettings.cpp b/settings/CodeCompletionSettings.cpp index c82500a..3a42105 100644 --- a/settings/CodeCompletionSettings.cpp +++ b/settings/CodeCompletionSettings.cpp @@ -192,6 +192,16 @@ CodeCompletionSettings::CodeCompletionSettings() "Here is the code context with insertion points:\n" "\n${prefix}${suffix}\n\n\n"); + customLanguages.setSettingsKey(Constants::CC_CUSTOM_LANGUAGES); + customLanguages.setLabelText( + Tr::tr("Additional Programming Languages for handling: Example: rust,//,rust rs,rs")); + customLanguages.setToolTip(Tr::tr("Specify additional programming languages in format: " + "name,comment_style,model_names,extensions\n" + "Example: rust,//,rust rs,rs\n" + "Fields: language name, comment prefix, names from LLM " + "(space-separated), file extensions (space-separated)")); + customLanguages.setDefaultValue({{"cmake,#,cmake,CMakeLists.txt"}, {"qmake,#,qmake,pro pri"}}); + useProjectChangesCache.setSettingsKey(Constants::CC_USE_PROJECT_CHANGES_CACHE); useProjectChangesCache.setDefaultValue(true); useProjectChangesCache.setLabelText(Tr::tr("Max Changes Cache Size:")); @@ -259,6 +269,7 @@ CodeCompletionSettings::CodeCompletionSettings() Row{useUserMessageTemplateForCC, Stretch{1}}, systemPromptForNonFimModels, userMessageTemplateForCC, + customLanguages, }}, Row{useProjectChangesCache, maxChangesCacheSize, Stretch{1}}}; @@ -355,6 +366,7 @@ void CodeCompletionSettings::resetSettingsToDefaults() resetAspect(useUserMessageTemplateForCC); resetAspect(userMessageTemplateForCC); resetAspect(systemPromptForNonFimModels); + resetAspect(customLanguages); } } diff --git a/settings/CodeCompletionSettings.hpp b/settings/CodeCompletionSettings.hpp index c871e8d..a1d6daf 100644 --- a/settings/CodeCompletionSettings.hpp +++ b/settings/CodeCompletionSettings.hpp @@ -42,6 +42,8 @@ public: Utils::IntegerAspect autoCompletionCharThreshold{this}; Utils::IntegerAspect autoCompletionTypingInterval{this}; + Utils::StringListAspect customLanguages{this}; + // General Parameters Settings Utils::DoubleAspect temperature{this}; Utils::IntegerAspect maxTokens{this}; diff --git a/settings/SettingsConstants.hpp b/settings/SettingsConstants.hpp index 4724b0c..42c95ab 100644 --- a/settings/SettingsConstants.hpp +++ b/settings/SettingsConstants.hpp @@ -72,6 +72,7 @@ const char CA_TOKENS_THRESHOLD[] = "QodeAssist.caTokensThreshold"; const char CA_LINK_OPEN_FILES[] = "QodeAssist.caLinkOpenFiles"; const char CA_STREAM[] = "QodeAssist.caStream"; const char CA_AUTOSAVE[] = "QodeAssist.caAutosave"; +const char CC_CUSTOM_LANGUAGES[] = "QodeAssist.ccCustomLanguages"; const char QODE_ASSIST_GENERAL_OPTIONS_ID[] = "QodeAssist.GeneralOptions"; const char QODE_ASSIST_GENERAL_SETTINGS_PAGE_ID[] = "QodeAssist.1GeneralSettingsPageId";