From 3d0859dcae5ddbbdb88863af7207910657fee333 Mon Sep 17 00:00:00 2001 From: Piotr Magiera Date: Wed, 14 Aug 2024 16:54:47 +0200 Subject: [PATCH] Add notification on corelib mismatch --- crates/cairo-lang-compiler/src/db.rs | 2 +- crates/cairo-lang-language-server/src/lib.rs | 18 ++++++++++++++++++ vscode-cairo/src/cairols.ts | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/crates/cairo-lang-compiler/src/db.rs b/crates/cairo-lang-compiler/src/db.rs index 9ea7b152eb0..ccfb484f302 100644 --- a/crates/cairo-lang-compiler/src/db.rs +++ b/crates/cairo-lang-compiler/src/db.rs @@ -177,7 +177,7 @@ impl RootDatabaseBuilder { } /// Validates that the corelib version matches the expected one. -fn validate_corelib(db: &RootDatabase) -> Result<()> { +pub fn validate_corelib(db: &dyn FilesGroup) -> Result<()> { let Some(config) = db.crate_config(CrateLongId::Real(CORELIB_CRATE_NAME.into()).intern(db)) else { return Ok(()); diff --git a/crates/cairo-lang-language-server/src/lib.rs b/crates/cairo-lang-language-server/src/lib.rs index 1fa239dc545..8d98bde9b81 100644 --- a/crates/cairo-lang-language-server/src/lib.rs +++ b/crates/cairo-lang-language-server/src/lib.rs @@ -46,6 +46,7 @@ use std::sync::Arc; use std::time::{Duration, SystemTime}; use anyhow::{bail, Context}; +use cairo_lang_compiler::db::validate_corelib; use cairo_lang_compiler::project::{setup_project, update_crate_roots_from_project_config}; use cairo_lang_defs::db::DefsGroup; use cairo_lang_defs::ids::{ @@ -80,6 +81,7 @@ use serde_json::Value; use tokio::sync::Semaphore; use tokio::task::spawn_blocking; use tower_lsp::jsonrpc::{Error as LSPError, Result as LSPResult}; +use tower_lsp::lsp_types::notification::Notification; use tower_lsp::lsp_types::request::Request; use tower_lsp::lsp_types::*; use tower_lsp::{Client, ClientSocket, LanguageServer, LspService, Server}; @@ -597,6 +599,14 @@ impl Backend { // Try to set up a corelib at least. try_to_init_unmanaged_core(&*self.config.read().await, db); } + + let corelib_validation = validate_corelib(db); + if let Err(result) = corelib_validation { + let notifier = Notifier::new(&self.client); + spawn_blocking(move || { + notifier.send_notification::(result.to_string()); + }); + } } Some(ProjectManifestPath::CairoProject(config_path)) => { @@ -648,6 +658,14 @@ impl Backend { } } +#[derive(Debug)] +struct CorelibVersionMismatch {} + +impl Notification for CorelibVersionMismatch { + type Params = String; + const METHOD: &'static str = "corelib/version-mismatch"; +} + enum ServerCommands { Reload, } diff --git a/vscode-cairo/src/cairols.ts b/vscode-cairo/src/cairols.ts index 4f7924f4b08..e136ac4b69a 100644 --- a/vscode-cairo/src/cairols.ts +++ b/vscode-cairo/src/cairols.ts @@ -7,6 +7,7 @@ import { Scarb } from "./scarb"; import { isScarbProject } from "./scarbProject"; import { StandaloneLS } from "./standalonels"; import { registerMacroExpandProvider, registerVfsProvider } from "./textDocumentProviders"; +import { NotificationType } from "vscode-jsonrpc/lib/common/messages"; export interface LanguageServerExecutableProvider { languageServerExecutable(): lc.Executable; @@ -82,6 +83,15 @@ export async function setupLanguageServer(ctx: Context): Promise("corelib/version-mismatch"), (params) => { + const errorMessage = + "Corelib version missmatch. If you are using Scarb try reopening the project to fix this error. Resort to `scarb cache clean` if it doesn't help. ERROR: " + + params; + + vscode.window.showErrorMessage(errorMessage); + ctx.log.error(errorMessage); + }); + await client.start(); return client;