bitwise #15
62
rust_compiler/Cargo.lock
generated
62
rust_compiler/Cargo.lock
generated
@@ -173,7 +173,7 @@ dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -224,9 +224,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.53"
|
||||
version = "4.5.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
|
||||
checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -234,9 +234,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.53"
|
||||
version = "4.5.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
|
||||
checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -253,7 +253,7 @@ dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -523,9 +523,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.15"
|
||||
version = "1.0.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
||||
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
@@ -571,7 +571,7 @@ dependencies = [
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
"rustc_version",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -726,9 +726,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.103"
|
||||
version = "1.0.104"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
|
||||
checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -909,12 +909,6 @@ version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
|
||||
|
||||
[[package]]
|
||||
name = "safer-ffi"
|
||||
version = "0.1.13"
|
||||
@@ -992,20 +986,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.145"
|
||||
version = "1.0.148"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
|
||||
checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
"ryu",
|
||||
"serde",
|
||||
"serde_core",
|
||||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1016,7 +1010,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1108,9 +1102,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.111"
|
||||
version = "2.0.112"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
|
||||
checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1153,7 +1147,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1185,9 +1179,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.7.4+spec-1.0.0"
|
||||
version = "0.7.5+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe3cea6b2aa3b910092f6abd4053ea464fab5f9c170ba5e9a6aead16ec4af2b6"
|
||||
checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
@@ -1206,9 +1200,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_parser"
|
||||
version = "1.0.5+spec-1.0.0"
|
||||
version = "1.0.6+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c03bee5ce3696f31250db0bbaff18bc43301ce0e8db2ed1f07cbb2acf89984c"
|
||||
checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
|
||||
dependencies = [
|
||||
"winnow",
|
||||
]
|
||||
@@ -1303,7 +1297,7 @@ dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@@ -1471,5 +1465,11 @@ checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.111",
|
||||
"syn 2.0.112",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "317f17ff091ac4515f17cc7a190d2769a8c9a96d227de5d64b500b01cda8f2cd"
|
||||
|
||||
@@ -21,6 +21,7 @@ impl<'a> SymbolInfo<'a> {
|
||||
lsp_types::SymbolInformation {
|
||||
name: self.name.to_string(),
|
||||
kind: self.kind.to_lsp_symbol_kind(),
|
||||
#[allow(deprecated)]
|
||||
deprecated: None,
|
||||
location: lsp_types::Location {
|
||||
uri,
|
||||
|
||||
@@ -704,6 +704,10 @@ impl<'a> Compiler<'a> {
|
||||
let name_str = var_name.node;
|
||||
let name_span = var_name.span;
|
||||
|
||||
// Track the variable in metadata
|
||||
self.metadata
|
||||
.add_variable(name_str.clone(), Some(name_span));
|
||||
|
||||
// optimization. Check for a negated numeric literal (including nested negations)
|
||||
// e.g., -5, -(-5), -(-(5)), etc.
|
||||
if let Some(num) = self.try_fold_negation(&expr.node) {
|
||||
@@ -1063,6 +1067,10 @@ impl<'a> Compiler<'a> {
|
||||
value: const_value,
|
||||
} = expr;
|
||||
|
||||
// Track the const variable in metadata
|
||||
self.metadata
|
||||
.add_variable(const_name.node.clone(), Some(const_name.span));
|
||||
|
||||
// check for a hash expression or a literal
|
||||
let value = match const_value {
|
||||
LiteralOr::Or(Spanned {
|
||||
@@ -1486,6 +1494,14 @@ impl<'a> Compiler<'a> {
|
||||
) -> Result<(), Error<'a>> {
|
||||
let TupleDeclarationExpression { names, value } = tuple_decl;
|
||||
|
||||
// Track each variable in the tuple declaration
|
||||
for name_spanned in &names {
|
||||
if name_spanned.node.as_ref() != "_" {
|
||||
self.metadata
|
||||
.add_variable(name_spanned.node.clone(), Some(name_spanned.span));
|
||||
}
|
||||
}
|
||||
|
||||
match value.node {
|
||||
Expression::Invocation(invoke_expr) => {
|
||||
// Execute the function call - tuple values will be on the stack
|
||||
@@ -1924,6 +1940,10 @@ impl<'a> Compiler<'a> {
|
||||
&mut self,
|
||||
expr: DeviceDeclarationExpression<'a>,
|
||||
) -> Result<(), Error<'a>> {
|
||||
// Track the device declaration in metadata
|
||||
self.metadata
|
||||
.add_variable(expr.name.node.clone(), Some(expr.name.span));
|
||||
|
||||
if self.devices.contains_key(&expr.name.node) {
|
||||
self.errors.push(Error::DuplicateIdentifier(
|
||||
expr.name.node.clone(),
|
||||
@@ -2928,6 +2948,15 @@ impl<'a> Compiler<'a> {
|
||||
span: Span,
|
||||
scope: &mut VariableScope<'a, '_>,
|
||||
) -> Result<Option<CompileLocation<'a>>, Error<'a>> {
|
||||
// Track the syscall in metadata
|
||||
let syscall_name = expr.name();
|
||||
self.metadata.add_syscall(
|
||||
Cow::Borrowed(syscall_name),
|
||||
crate::SyscallType::System,
|
||||
expr.arg_count(),
|
||||
Some(span),
|
||||
);
|
||||
|
||||
macro_rules! cleanup {
|
||||
($($to_clean:expr),*) => {
|
||||
$(
|
||||
@@ -3325,6 +3354,15 @@ impl<'a> Compiler<'a> {
|
||||
span: Span,
|
||||
scope: &mut VariableScope<'a, '_>,
|
||||
) -> Result<Option<CompileLocation<'a>>, Error<'a>> {
|
||||
// Track the syscall in metadata
|
||||
let syscall_name = expr.name();
|
||||
self.metadata.add_syscall(
|
||||
Cow::Borrowed(syscall_name),
|
||||
crate::SyscallType::Math,
|
||||
expr.arg_count(),
|
||||
Some(span),
|
||||
);
|
||||
|
||||
macro_rules! cleanup {
|
||||
($($to_clean:expr),*) => {
|
||||
$(
|
||||
@@ -3585,6 +3623,11 @@ impl<'a> Compiler<'a> {
|
||||
|
||||
let span = expr.span;
|
||||
|
||||
// Track the function definition in metadata
|
||||
let param_names: Vec<Cow<'a, str>> = arguments.iter().map(|a| a.node.clone()).collect();
|
||||
self.metadata
|
||||
.add_function(name.node.clone(), param_names, Some(name.span));
|
||||
|
||||
if self.function_meta.locations.contains_key(&name.node) {
|
||||
self.errors
|
||||
.push(Error::DuplicateIdentifier(name.node.clone(), name.span));
|
||||
|
||||
@@ -127,6 +127,52 @@ impl<'a> std::fmt::Display for Math<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Math<'a> {
|
||||
/// Returns the name of this math function (e.g., "acos", "sin", "sqrt", etc.)
|
||||
pub fn name(&self) -> &'static str {
|
||||
match self {
|
||||
Math::Acos(_) => "acos",
|
||||
Math::Asin(_) => "asin",
|
||||
Math::Atan(_) => "atan",
|
||||
Math::Atan2(_, _) => "atan2",
|
||||
Math::Abs(_) => "abs",
|
||||
Math::Ceil(_) => "ceil",
|
||||
Math::Cos(_) => "cos",
|
||||
Math::Floor(_) => "floor",
|
||||
Math::Log(_) => "log",
|
||||
Math::Max(_, _) => "max",
|
||||
Math::Min(_, _) => "min",
|
||||
Math::Rand => "rand",
|
||||
Math::Sin(_) => "sin",
|
||||
Math::Sqrt(_) => "sqrt",
|
||||
Math::Tan(_) => "tan",
|
||||
Math::Trunc(_) => "trunc",
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the number of arguments this math function expects
|
||||
pub fn arg_count(&self) -> usize {
|
||||
match self {
|
||||
Math::Acos(_) => 1,
|
||||
Math::Asin(_) => 1,
|
||||
Math::Atan(_) => 1,
|
||||
Math::Atan2(_, _) => 2,
|
||||
Math::Abs(_) => 1,
|
||||
Math::Ceil(_) => 1,
|
||||
Math::Cos(_) => 1,
|
||||
Math::Floor(_) => 1,
|
||||
Math::Log(_) => 1,
|
||||
Math::Max(_, _) => 2,
|
||||
Math::Min(_, _) => 2,
|
||||
Math::Rand => 0,
|
||||
Math::Sin(_) => 1,
|
||||
Math::Sqrt(_) => 1,
|
||||
Math::Tan(_) => 1,
|
||||
Math::Trunc(_) => 1,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
documented! {
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum System<'a> {
|
||||
@@ -297,6 +343,48 @@ impl<'a> std::fmt::Display for System<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> System<'a> {
|
||||
/// Returns the name of this syscall (e.g., "yield", "sleep", "hash", etc.)
|
||||
pub fn name(&self) -> &'static str {
|
||||
match self {
|
||||
System::Yield => "yield",
|
||||
System::Sleep(_) => "sleep",
|
||||
System::Clr(_) => "clr",
|
||||
System::Hash(_) => "hash",
|
||||
System::LoadFromDevice(_, _) => "loadFromDevice",
|
||||
System::LoadBatch(_, _, _) => "loadBatch",
|
||||
System::LoadBatchNamed(_, _, _, _) => "loadBatchNamed",
|
||||
System::SetOnDevice(_, _, _) => "setOnDevice",
|
||||
System::SetOnDeviceBatched(_, _, _) => "setOnDeviceBatched",
|
||||
System::SetOnDeviceBatchedNamed(_, _, _, _) => "setOnDeviceBatchedNamed",
|
||||
System::LoadSlot(_, _, _) => "loadSlot",
|
||||
System::SetSlot(_, _, _, _) => "setSlot",
|
||||
System::LoadReagent(_, _, _) => "loadReagent",
|
||||
System::Rmap(_, _) => "rmap",
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the number of arguments this syscall expects
|
||||
pub fn arg_count(&self) -> usize {
|
||||
match self {
|
||||
System::Yield => 0,
|
||||
System::Sleep(_) => 1,
|
||||
System::Clr(_) => 1,
|
||||
System::Hash(_) => 1,
|
||||
System::LoadFromDevice(_, _) => 2,
|
||||
System::LoadBatch(_, _, _) => 3,
|
||||
System::LoadBatchNamed(_, _, _, _) => 4,
|
||||
System::SetOnDevice(_, _, _) => 3,
|
||||
System::SetOnDeviceBatched(_, _, _) => 3,
|
||||
System::SetOnDeviceBatchedNamed(_, _, _, _) => 4,
|
||||
System::LoadSlot(_, _, _) => 3,
|
||||
System::SetSlot(_, _, _, _) => 4,
|
||||
System::LoadReagent(_, _, _) => 3,
|
||||
System::Rmap(_, _) => 2,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
/// This represents built in functions that cannot be overwritten, but can be invoked by the user as functions.
|
||||
|
||||
Reference in New Issue
Block a user