diff --git a/crates/aiken-lang/Cargo.toml b/crates/aiken-lang/Cargo.toml index a443df3c..5b2ccafa 100644 --- a/crates/aiken-lang/Cargo.toml +++ b/crates/aiken-lang/Cargo.toml @@ -11,7 +11,7 @@ authors = [ "Kasey White ", "KtorZ ", ] -rust-version = "1.70.0" +rust-version = "1.80.0" build = "build.rs" [dependencies] diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index 9419ee83..774081e8 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -12,6 +12,7 @@ use crate::{ }, IdGenerator, }; +use std::{collections::BTreeSet, sync::LazyLock}; use indexmap::IndexMap; use std::{collections::HashMap, rc::Rc}; @@ -25,6 +26,16 @@ use uplc::{ pub const PRELUDE: &str = "aiken"; pub const BUILTIN: &str = "aiken/builtin"; +pub static INTERNAL_FUNCTIONS: LazyLock> = LazyLock::new(|| { + let mut set = BTreeSet::new(); + set.insert("diagnostic"); + set.insert("do_from_int"); + set.insert("encode_base16"); + set.insert("enumerate"); + set.insert("from_int"); + set +}); + /// Build a prelude that can be injected /// into a compiler pipeline pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { diff --git a/crates/aiken-lang/src/tipo/environment.rs b/crates/aiken-lang/src/tipo/environment.rs index 6473ce91..3a2cd2f2 100644 --- a/crates/aiken-lang/src/tipo/environment.rs +++ b/crates/aiken-lang/src/tipo/environment.rs @@ -796,8 +796,7 @@ impl<'a> Environment<'a> { self.module_types .keys() .filter_map(|t| { - // Avoid leaking special internal types such as __ScriptContext or - // __ScriptPurpose. + // Avoid leaking special internal types in error hints. if t.starts_with("__") { None } else { @@ -811,6 +810,9 @@ impl<'a> Environment<'a> { self.scope .keys() .filter(|&t| PIPE_VARIABLE != t) + // Avoid leaking internal functions in error hints. + .filter(|&t| !crate::builtins::INTERNAL_FUNCTIONS.contains(t.as_str())) + .filter(|&t| !t.starts_with("__") && !TypeConstructor::might_be(t)) .map(|t| t.to_string()) .collect() } @@ -818,7 +820,9 @@ impl<'a> Environment<'a> { pub fn local_constructor_names(&self) -> Vec { self.scope .keys() - .filter(|&t| t.chars().next().unwrap_or_default().is_uppercase()) + // Avoid leaking internal constructors in error hints. + .filter(|&t| !t.starts_with("__")) + .filter(|&t| TypeConstructor::might_be(t)) .map(|t| t.to_string()) .collect() }