Commit 49613311 authored by Günther Wagner's avatar Günther Wagner

rust-analyzer: cargo check command preference

parent 6fdbbd5f
Pipeline #184207 failed with stage
in 11 minutes and 19 seconds
......@@ -14,6 +14,7 @@ plugins_sources += files([
'rust-analyzer-search-provider.c',
'rust-analyzer-search-result.c',
'rust-analyzer-workbench-addin.c',
'rust-analyzer-preferences-addin.c',
])
plugin_rust_analyzer_resources = gnome.compile_resources(
......@@ -24,4 +25,6 @@ plugin_rust_analyzer_resources = gnome.compile_resources(
plugins_sources += plugin_rust_analyzer_resources
install_data(['org.gnome.builder.rust-analyzer.gschema.xml'], install_dir: schema_dir)
endif
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<schema id="org.gnome.builder.rust-analyzer" path="/org/gnome/builder/plugins/rust-analyzer/" gettext-domain="gnome-builder">
<key name="cargo-command" type="s">
<choices>
<choice value="check"/>
<choice value="clippy"/>
</choices>
<default>'check'</default>
</key>
</schema>
</schemalist>
/* rust-analyzer-preferences-addin.c
*
* Copyright 2020 Günther Wagner <info@gunibert.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "rust-analyzer-preferences-addin.h"
#include <glib/gi18n.h>
struct _RustAnalyzerPreferencesAddin
{
IdeObject parent_instance;
guint check_id;
guint clippy_id;
};
static void preferences_addin_iface_init (IdePreferencesAddinInterface *iface);
G_DEFINE_TYPE_WITH_CODE (RustAnalyzerPreferencesAddin,
rust_analyzer_preferences_addin,
IDE_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (IDE_TYPE_PREFERENCES_ADDIN, preferences_addin_iface_init))
static void
rust_analyzer_preferences_addin_class_init (RustAnalyzerPreferencesAddinClass *klass)
{
}
static void
rust_analyzer_preferences_addin_init (RustAnalyzerPreferencesAddin *self)
{
}
static void
rust_analyzer_preferences_addin_load (IdePreferencesAddin *addin,
DzlPreferences *preferences)
{
RustAnalyzerPreferencesAddin *self = (RustAnalyzerPreferencesAddin *)addin;
g_return_if_fail (RUST_IS_ANALYZER_PREFERENCES_ADDIN (self));
g_return_if_fail (DZL_IS_PREFERENCES (preferences));
dzl_preferences_add_list_group (preferences, "code-insight", "rust-analyzer", _("Rust Analyzer: Cargo command for diagnostics"), GTK_SELECTION_NONE, 0);
self->check_id = dzl_preferences_add_radio (preferences,
"code-insight",
"rust-analyzer",
"org.gnome.builder.rust-analyzer",
"cargo-command",
NULL,
"\"check\"",
"Cargo check",
_("the default cargo command"),
NULL, 1);
self->clippy_id = dzl_preferences_add_radio (preferences,
"code-insight",
"rust-analyzer",
"org.gnome.builder.rust-analyzer",
"cargo-command",
NULL,
"\"clippy\"",
"Cargo clippy",
_("clippy adds additional lints to catch common mistakes but is in general slower"),
NULL, 2);
}
static void
rust_analyzer_preferences_addin_unload (IdePreferencesAddin *addin,
DzlPreferences *preferences)
{
RustAnalyzerPreferencesAddin *self = (RustAnalyzerPreferencesAddin *)addin;
g_return_if_fail (RUST_IS_ANALYZER_PREFERENCES_ADDIN (self));
g_return_if_fail (DZL_IS_PREFERENCES (preferences));
dzl_preferences_remove_id (preferences, self->check_id);
dzl_preferences_remove_id (preferences, self->clippy_id);
}
static void
preferences_addin_iface_init (IdePreferencesAddinInterface *iface)
{
iface->load = rust_analyzer_preferences_addin_load;
iface->unload = rust_analyzer_preferences_addin_unload;
}
/* rust-analyzer-preferences-addin.h
*
* Copyright 2020 Günther Wagner <info@gunibert.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#pragma once
#include <libide-gui.h>
G_BEGIN_DECLS
#define RUST_TYPE_ANALYZER_PREFERENCES_ADDIN (rust_analyzer_preferences_addin_get_type())
G_DECLARE_FINAL_TYPE (RustAnalyzerPreferencesAddin, rust_analyzer_preferences_addin, RUST, ANALYZER_PREFERENCES_ADDIN, IdeObject)
G_END_DECLS
......@@ -38,6 +38,8 @@ struct _RustAnalyzerService
IdeSubprocessSupervisor *supervisor;
GFileMonitor *cargo_monitor;
RustAnalyzerSearchProvider *search_provider;
GSettings *settings;
gchar *cargo_command;
ServiceState state;
};
......@@ -47,6 +49,7 @@ G_DEFINE_TYPE (RustAnalyzerService, rust_analyzer_service, IDE_TYPE_OBJECT)
enum {
PROP_0,
PROP_CLIENT,
PROP_CARGO_COMMAND,
N_PROPS
};
......@@ -88,6 +91,27 @@ _get_search_engine (RustAnalyzerService *self)
return ide_object_get_child_typed (IDE_OBJECT (context), IDE_TYPE_SEARCH_ENGINE);
}
static GVariant *
rust_analyzer_service_load_configuration (IdeLspClient *client,
gpointer user_data)
{
RustAnalyzerService *self = (RustAnalyzerService *)user_data;
GVariant *ret = NULL;
g_assert (IDE_IS_LSP_CLIENT (client));
g_assert (RUST_IS_ANALYZER_SERVICE (self));
IDE_ENTRY;
ret = JSONRPC_MESSAGE_NEW_ARRAY ("{",
"checkOnSave", "{",
"command", JSONRPC_MESSAGE_PUT_STRING (self->cargo_command),
"}",
"}");
IDE_RETURN (ret);
}
static void
rust_analyzer_service_get_property (GObject *object,
guint prop_id,
......@@ -101,6 +125,9 @@ rust_analyzer_service_get_property (GObject *object,
case PROP_CLIENT:
g_value_set_object (value, rust_analyzer_service_get_client (self));
break;
case PROP_CARGO_COMMAND:
g_value_set_string (value, rust_analyzer_service_get_cargo_command (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
......@@ -119,6 +146,9 @@ rust_analyzer_service_set_property (GObject *object,
case PROP_CLIENT:
rust_analyzer_service_set_client (self, g_value_get_object (value));
break;
case PROP_CARGO_COMMAND:
rust_analyzer_service_set_cargo_command (self, g_value_dup_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
......@@ -204,6 +234,13 @@ rust_analyzer_service_class_init (RustAnalyzerServiceClass *klass)
IDE_TYPE_LSP_CLIENT,
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
properties [PROP_CARGO_COMMAND] =
g_param_spec_string ("cargo-command",
"Cargo-command",
"The used cargo command for rust-analyzer",
"check",
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_properties (object_class, N_PROPS, properties);
}
......@@ -212,6 +249,8 @@ rust_analyzer_service_init (RustAnalyzerService *self)
{
self->client = NULL;
self->state = RUST_ANALYZER_SERVICE_INIT;
self->settings = g_settings_new ("org.gnome.builder.rust-analyzer");
g_settings_bind (self->settings, "cargo-command", self, "cargo-command", G_SETTINGS_BIND_DEFAULT);
}
IdeLspClient *
......@@ -231,10 +270,25 @@ rust_analyzer_service_set_client (RustAnalyzerService *self,
if (g_set_object (&self->client, client))
{
g_signal_connect (self->client, "load-configuration", G_CALLBACK (rust_analyzer_service_load_configuration), self);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_CLIENT]);
}
}
static void
rust_analyzer_service_lsp_initialized (IdeLspClient *client,
gpointer user_data)
{
RustAnalyzerService *self = (RustAnalyzerService *) user_data;
g_autoptr(GVariant) params = NULL;
g_assert (IDE_IS_LSP_CLIENT (client));
g_assert (RUST_IS_ANALYZER_SERVICE (self));
params = JSONRPC_MESSAGE_NEW ("settings", "");
ide_lsp_client_send_notification_async (client, "workspace/didChangeConfiguration", params, NULL, NULL, NULL);
}
void
rust_analyzer_service_lsp_started (IdeSubprocessSupervisor *supervisor,
IdeSubprocess *subprocess,
......@@ -261,6 +315,7 @@ rust_analyzer_service_lsp_started (IdeSubprocessSupervisor *supervisor,
}
client = ide_lsp_client_new (io_stream);
g_signal_connect (client, "initialized", G_CALLBACK (rust_analyzer_service_lsp_initialized), self);
rust_analyzer_service_set_client (self, client);
ide_object_append (IDE_OBJECT (self), IDE_OBJECT (client));
ide_lsp_client_add_language (client, "rust");
......@@ -383,3 +438,27 @@ rust_analyzer_service_set_state (RustAnalyzerService *self,
self->state = state;
}
gchar *
rust_analyzer_service_get_cargo_command (RustAnalyzerService *self)
{
g_return_val_if_fail (RUST_IS_ANALYZER_SERVICE (self), NULL);
return self->cargo_command;
}
void
rust_analyzer_service_set_cargo_command (RustAnalyzerService *self,
const gchar *cargo_command)
{
g_autoptr(GVariant) params = NULL;
g_return_if_fail (RUST_IS_ANALYZER_SERVICE (self));
g_return_if_fail (cargo_command != NULL);
g_clear_pointer (&self->cargo_command, g_free);
self->cargo_command = g_strdup (cargo_command);
params = JSONRPC_MESSAGE_NEW ("settings", "");
ide_lsp_client_send_notification_async (self->client, "workspace/didChangeConfiguration", params, NULL, NULL, NULL);
}
......@@ -16,12 +16,15 @@ typedef enum {
RUST_ANALYZER_SERVICE_LSP_STARTED,
} ServiceState;
RustAnalyzerService *rust_analyzer_service_new (void);
IdeLspClient *rust_analyzer_service_get_client (RustAnalyzerService *self);
void rust_analyzer_service_set_client (RustAnalyzerService *self,
IdeLspClient *client);
void rust_analyzer_service_ensure_started (RustAnalyzerService *self);
void rust_analyzer_service_set_state (RustAnalyzerService *self,
ServiceState state);
RustAnalyzerService *rust_analyzer_service_new (void);
IdeLspClient *rust_analyzer_service_get_client (RustAnalyzerService *self);
void rust_analyzer_service_set_client (RustAnalyzerService *self,
IdeLspClient *client);
gchar *rust_analyzer_service_get_cargo_command (RustAnalyzerService *self);
void rust_analyzer_service_set_cargo_command (RustAnalyzerService *self,
const gchar *cargo_command);
void rust_analyzer_service_ensure_started (RustAnalyzerService *self);
void rust_analyzer_service_set_state (RustAnalyzerService *self,
ServiceState state);
G_END_DECLS
......@@ -29,6 +29,7 @@
#include "rust-analyzer-hover-provider.h"
#include "rust-analyzer-workbench-addin.h"
#include "rust-analyzer-rename-provider.h"
#include "rust-analyzer-preferences-addin.h"
_IDE_EXTERN void
_rust_analyzer_register_types (PeasObjectModule *module)
......@@ -57,4 +58,7 @@ _rust_analyzer_register_types (PeasObjectModule *module)
peas_object_module_register_extension_type (module,
IDE_TYPE_RENAME_PROVIDER,
RUST_TYPE_ANALYZER_RENAME_PROVIDER);
peas_object_module_register_extension_type (module,
IDE_TYPE_PREFERENCES_ADDIN,
RUST_TYPE_ANALYZER_PREFERENCES_ADDIN);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment