diff --git a/Cargo.lock b/Cargo.lock index b2389452b0..72dbfd3042 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,13 +160,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.59" +version = "0.1.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364" +checksum = "7b2d0f03b3640e3a630367e40c468cb7f309529c708ed1d88597047b0e7c6ef7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -189,7 +189,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1439,6 +1439,19 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lsp-types" +version = "0.93.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be6e9c7e2d18f651974370d7aff703f9513e0df6e464fd795660edc77e6ca51" +dependencies = [ + "bitflags", + "serde", + "serde_json", + "serde_repr", + "url", +] + [[package]] name = "mach_object" version = "0.1.17" @@ -1739,6 +1752,26 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.16", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1800,6 +1833,30 @@ dependencies = [ "yansi", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.69" @@ -2574,6 +2631,25 @@ dependencies = [ name = "roc_ident" version = "0.0.1" +[[package]] +name = "roc_lang_srv" +version = "0.0.1" +dependencies = [ + "bumpalo", + "parking_lot", + "roc_can", + "roc_load", + "roc_packaging", + "roc_problem", + "roc_region", + "roc_reporting", + "roc_solve_problem", + "roc_target", + "roc_types", + "tokio", + "tower-lsp", +] + [[package]] name = "roc_late_solve" version = "0.0.1" @@ -3329,13 +3405,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.9" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" +checksum = "6f0a21fba416426ac927b1691996e82079f8b6156e920c85345f135b2e9ba2de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -3883,13 +3959,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -3916,6 +3992,60 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-lsp" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43e094780b4447366c59f79acfd65b1375ecaa84e61dddbde1421aa506334024" +dependencies = [ + "async-trait", + "auto_impl", + "bytes", + "dashmap", + "futures", + "httparse", + "log", + "lsp-types", + "memchr", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tower", + "tower-lsp-macros", +] + +[[package]] +name = "tower-lsp-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebd99eec668d0a450c177acbc4d05e0d0d13b1f8d3db13cd706c52cbec4ac04" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "tower-service" version = "0.3.2" diff --git a/crates/compiler/load_internal/src/file.rs b/crates/compiler/load_internal/src/file.rs index f1807da1d5..2ef30243ba 100644 --- a/crates/compiler/load_internal/src/file.rs +++ b/crates/compiler/load_internal/src/file.rs @@ -2,9 +2,9 @@ use crate::docs::ModuleDocumentation; use crate::module::{ - ConstrainedModule, EntryPoint, Expectations, ExposedToHost, FoundSpecializationsModule, - LateSpecializationsModule, LoadedModule, ModuleHeader, ModuleTiming, MonomorphizedModule, - ParsedModule, ToplevelExpects, TypeCheckedModule, + CheckedModule, ConstrainedModule, EntryPoint, Expectations, ExposedToHost, + FoundSpecializationsModule, LateSpecializationsModule, LoadedModule, ModuleHeader, + ModuleTiming, MonomorphizedModule, ParsedModule, ToplevelExpects, TypeCheckedModule, }; use crate::module_cache::ModuleCache; use bumpalo::{collections::CollectIn, Bump}; @@ -3321,6 +3321,8 @@ fn finish( let exposed_values = exposed_vars_by_symbol.iter().map(|x| x.0).collect(); + let declarations_by_id = state.declarations_by_id; + roc_checkmate::dump_checkmate!(checkmate); LoadedModule { diff --git a/crates/compiler/load_internal/src/module.rs b/crates/compiler/load_internal/src/module.rs index 7c7a15ba1d..323456fb5f 100644 --- a/crates/compiler/load_internal/src/module.rs +++ b/crates/compiler/load_internal/src/module.rs @@ -45,6 +45,7 @@ pub struct LoadedModule { pub timings: MutMap, pub docs_by_module: VecMap, pub abilities_store: AbilitiesStore, + pub typechecked: MutMap, } impl LoadedModule { @@ -129,6 +130,13 @@ pub struct TypeCheckedModule<'a> { pub checkmate: Option, } +#[derive(Debug)] +pub struct CheckedModule { + pub solved_subs: Solved, + pub decls: Declarations, + pub abilities_store: AbilitiesStore, +} + #[derive(Debug)] pub(crate) struct FoundSpecializationsModule<'a> { pub(crate) ident_ids: IdentIds, diff --git a/crates/compiler/load_internal/src/module_cache.rs b/crates/compiler/load_internal/src/module_cache.rs index 299528bf66..4f42900083 100644 --- a/crates/compiler/load_internal/src/module_cache.rs +++ b/crates/compiler/load_internal/src/module_cache.rs @@ -1,7 +1,7 @@ use crate::docs::ModuleDocumentation; use crate::module::{ - ConstrainedModule, FoundSpecializationsModule, LateSpecializationsModule, ModuleHeader, - ParsedModule, TypeCheckedModule, + CheckedModule, ConstrainedModule, FoundSpecializationsModule, LateSpecializationsModule, + ModuleHeader, ParsedModule, TypeCheckedModule, }; use roc_can::abilities::PendingAbilitiesStore; use roc_collections::{MutMap, MutSet, VecMap}; @@ -25,6 +25,7 @@ pub(crate) struct ModuleCache<'a> { pub(crate) pending_abilities: MutMap, pub(crate) constrained: MutMap, pub(crate) typechecked: MutMap>, + pub(crate) checked: MutMap, pub(crate) found_specializations: MutMap>, pub(crate) late_specializations: MutMap>, pub(crate) external_specializations_requested: @@ -97,6 +98,7 @@ impl Default for ModuleCache<'_> { pending_abilities: Default::default(), constrained: Default::default(), typechecked: Default::default(), + checked: Default::default(), found_specializations: Default::default(), late_specializations: Default::default(), external_specializations_requested: Default::default(), diff --git a/crates/compiler/problem/src/can.rs b/crates/compiler/problem/src/can.rs index bd51f6bcc9..8c7395e49d 100644 --- a/crates/compiler/problem/src/can.rs +++ b/crates/compiler/problem/src/can.rs @@ -653,9 +653,11 @@ impl RuntimeError { | RuntimeError::DegenerateBranch(region) | RuntimeError::InvalidInterpolation(region) | RuntimeError::InvalidHexadecimal(region) + | RuntimeError::MultipleRecordBuilders(region) + | RuntimeError::UnappliedRecordBuilder(region) | RuntimeError::InvalidUnicodeCodePt(region) => *region, RuntimeError::UnresolvedTypeVar | RuntimeError::ErroneousType => Region::zero(), - RuntimeError::LookupNotInScope(ident, _) => ident.region, + RuntimeError::LookupNotInScope { loc_name, .. } => loc_name.region, RuntimeError::OpaqueNotDefined { usage, .. } => usage.region, RuntimeError::OpaqueNotApplied(ident) => ident.region, RuntimeError::CircularDef(cycle) => cycle[0].symbol_region, diff --git a/crates/compiler/solve_problem/src/lib.rs b/crates/compiler/solve_problem/src/lib.rs index 096bb3791a..f8118a4495 100644 --- a/crates/compiler/solve_problem/src/lib.rs +++ b/crates/compiler/solve_problem/src/lib.rs @@ -70,6 +70,8 @@ impl TypeError { TypeError::UnfulfilledAbility(ab, ..) => ab.region(), TypeError::Exhaustive(e) => Some(e.region()), TypeError::CircularDef(c) => c.first().map(|ce| ce.symbol_region), + TypeError::IngestedFileBadUtf8(_, _) => None, + TypeError::IngestedFileUnsupportedType(_, _) => None, } } } diff --git a/crates/lang_srv/src/convert.rs b/crates/lang_srv/src/convert.rs index ef30dab315..2ab778b7e6 100644 --- a/crates/lang_srv/src/convert.rs +++ b/crates/lang_srv/src/convert.rs @@ -90,6 +90,7 @@ pub(crate) mod diag { match self { Severity::RuntimeError => DiagnosticSeverity::ERROR, Severity::Warning => DiagnosticSeverity::WARNING, + Severity::Fatal => DiagnosticSeverity::ERROR, } } } @@ -130,7 +131,7 @@ pub(crate) mod diag { LoadingProblem::UnexpectedHeader(header) => { msg = format!("Unexpected header: {}", header); } - LoadingProblem::MsgChannelDied => { + LoadingProblem::ChannelProblem(_) => { msg = format!("Internal error: message channel died"); } LoadingProblem::ErrJoiningWorkerThreads => { diff --git a/crates/lang_srv/src/registry.rs b/crates/lang_srv/src/registry.rs index 2a8f5c767a..26678fc264 100644 --- a/crates/lang_srv/src/registry.rs +++ b/crates/lang_srv/src/registry.rs @@ -57,7 +57,7 @@ impl Document { } fn line_info(&self) -> &LineInfo { - &self.line_info.as_ref().unwrap() + self.line_info.as_ref().unwrap() } fn module(&mut self) -> Result<&mut LoadedModule, LoadingProblem<'_>> { @@ -74,8 +74,8 @@ impl Document { fi, &self.source, src_dir, - Default::default(), roc_target::TargetInfo::default_x86_64(), + roc_load::FunctionKind::LambdaSet, roc_reporting::report::RenderTarget::Generic, RocCacheDir::Persistent(cache::roc_cache_dir().as_path()), roc_reporting::report::DEFAULT_PALETTE, @@ -115,7 +115,7 @@ impl Document { let module_path = self.url.to_file_path().unwrap(); let fmt = ProblemFmt { alloc: &alloc, - line_info: &line_info, + line_info, path: &module_path, };