From b43f5ead33b8f5469407c84c09968f5246a2c73a Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Fri, 10 Jan 2025 14:59:42 +0100 Subject: [PATCH 1/2] Add TypeName to AST, allowing type names to have a full path and generics --- Cargo.lock | 129 +++++++++++++++++++------------------- Cargo.toml | 4 +- src/ast/common.rs | 15 +++++ src/ast/types.rs | 5 +- src/grammar.lalrpop | 28 ++++++--- src/ir/lowering.rs | 17 ++--- src/ir/lowering/common.rs | 14 ++--- src/parser/tokens.rs | 2 + 8 files changed, 122 insertions(+), 92 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e6070fe..ef3dd32e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,7 +128,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -151,7 +151,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -188,9 +188,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" [[package]] name = "block-buffer" @@ -203,9 +203,9 @@ dependencies = [ [[package]] name = "bon" -version = "3.3.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f265cdb2e8501f1c952749e78babe8f1937be92c98120e5f78fc72d634682bad" +checksum = "fe7acc34ff59877422326db7d6f2d845a582b16396b6b08194942bf34c6528ab" dependencies = [ "bon-macros", "rustversion", @@ -213,9 +213,9 @@ dependencies = [ [[package]] name = "bon-macros" -version = "3.3.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38aa5c627cd7706490e5b003d685f8b9d69bc343b1a00b9fdd01e75fdf6827cf" +checksum = "4159dd617a7fbc9be6a692fe69dc2954f8e6bb6bb5e4d7578467441390d77fd0" dependencies = [ "darling", "ident_case", @@ -234,19 +234,18 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "caseless" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808dab3318747be122cb31d36de18d4d1c81277a76f8332a02b81a3d73463d7f" +checksum = "8b6fd507454086c8edfd769ca6ada439193cdb209c7681712ef6275cccbfe5d8" dependencies = [ - "regex", "unicode-normalization", ] [[package]] name = "cc" -version = "1.2.3" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -281,9 +280,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -291,9 +290,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -384,7 +383,7 @@ dependencies = [ "serde", "tempfile", "test-case", - "thiserror 2.0.9", + "thiserror 2.0.10", "toml", "tracing", "tracing-subscriber", @@ -424,18 +423,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -452,18 +451,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -674,7 +673,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", "libgit2-sys", "log", @@ -685,9 +684,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" @@ -727,11 +726,11 @@ checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -997,9 +996,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libgit2-sys" @@ -1041,9 +1040,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.20" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" dependencies = [ "cc", "libc", @@ -1053,9 +1052,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -1318,9 +1317,9 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkg-config" @@ -1336,9 +1335,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" dependencies = [ "proc-macro2", "syn", @@ -1355,9 +1354,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1388,7 +1387,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", ] [[package]] @@ -1464,11 +1463,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "errno", "libc", "linux-raw-sys", @@ -1477,9 +1476,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "salsa" @@ -1536,9 +1535,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" @@ -1643,9 +1642,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -1691,9 +1690,9 @@ dependencies = [ [[package]] name = "term" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4175de05129f31b80458c6df371a15e7fc3fd367272e6bf938e5c351c7ea0" +checksum = "a3bb6001afcea98122260987f8b7b5da969ecad46dbf0b5453702f776b491a41" dependencies = [ "home", "windows-sys 0.52.0", @@ -1743,11 +1742,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "a3ac7f54ca534db81081ef1c1e7f6ea8a3ef428d2fc069097c079443d24124d3" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.10", ] [[package]] @@ -1763,9 +1762,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "9e9465d30713b56a37ede7185763c3492a91be2f5fa68d958c44e41ab9248beb" dependencies = [ "proc-macro2", "quote", @@ -1794,9 +1793,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -2278,9 +2277,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 7eb0965a..1c9ffc2b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] tracing = "0.1.41" itertools = "0.14.0" -thiserror = "2.0.9" +thiserror = "2.0.10" educe = "0.5.11" lalrpop-util = { version = "0.22.0", features = ["unicode"] } logos = "0.15.0" @@ -23,7 +23,7 @@ mlir-sys = "0.4.1" anyhow = "1.0.95" git2 = "0.20.0" owo-colors = "4.1.0" -clap = { version = "4.5.24", features = ["derive"] } +clap = { version = "4.5.26", features = ["derive"] } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } serde = { version = "1.0.217", features = ["derive"] } toml = "0.8.19" diff --git a/src/ast/common.rs b/src/ast/common.rs index 6f6278cb..294019c9 100644 --- a/src/ast/common.rs +++ b/src/ast/common.rs @@ -23,12 +23,27 @@ pub struct DocString { contents: String, } +/// Identifiers, without a path or generics. #[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] pub struct Ident { pub name: String, pub span: Span, } +/// A type name, supporting fully qualified paths and generics: +/// ``` +/// std::module::X +/// ``` +/// Used only when specifying types. +#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] +pub struct TypeName { + pub path: Vec, + pub name: Ident, + pub generics: Vec, + pub span: Span, +} + +/// Used as a generic param in function and struct declarations. #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct GenericParam { pub name: Ident, diff --git a/src/ast/types.rs b/src/ast/types.rs index 206eeb43..7902478f 100644 --- a/src/ast/types.rs +++ b/src/ast/types.rs @@ -1,10 +1,9 @@ -use super::common::{DocString, Ident, Span}; +use super::common::{DocString, Ident, Span, TypeName}; #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub enum TypeDescriptor { Type { - name: Ident, - generics: Vec, + name: TypeName, span: Span, }, Ref { diff --git a/src/grammar.lalrpop b/src/grammar.lalrpop index 92927327..1c43af7b 100644 --- a/src/grammar.lalrpop +++ b/src/grammar.lalrpop @@ -52,6 +52,7 @@ extern { "=" => Token::Assign, ";" => Token::Semicolon, ":" => Token::Colon, + "::" => Token::DoubleColon, "->" => Token::Arrow, "," => Token::Coma, "#" => Token::Hashtag, @@ -101,6 +102,16 @@ Comma: Vec = { } }; +Colon: Vec = { + ":")*> => match e { + None => v, + Some(e) => { + v.push(e); + v + } + } +}; + SemiColon: Vec = { ";")*> => match e { None => v, @@ -147,15 +158,18 @@ Ident: ast::common::Ident = { } } -TypeDescriptor: ast::types::TypeDescriptor = { - => ast::types::TypeDescriptor::Type { +TypeName: ast::common::TypeName = { + "::")*> > ">")?> => ast::common::TypeName { name, - generics: Vec::new(), - span: Span::new(lo, hi), - }, - "<" > ">" => ast::types::TypeDescriptor::Type { + path, + generics: generics.unwrap_or_default(), + span: ast::common::Span::new(lo, hi), + } +} + +TypeDescriptor: ast::types::TypeDescriptor = { + => ast::types::TypeDescriptor::Type { name, - generics, span: Span::new(lo, hi), }, "[" )> "]" => ast::types::TypeDescriptor::Array { diff --git a/src/ir/lowering.rs b/src/ir/lowering.rs index 576837b2..2d3df9c8 100644 --- a/src/ir/lowering.rs +++ b/src/ir/lowering.rs @@ -1751,11 +1751,7 @@ pub fn lower_type( module_id: DefId, ) -> Result { Ok(match ty { - TypeDescriptor::Type { - name, - generics, - span, - } => match name.name.as_str() { + TypeDescriptor::Type { name, span } => match name.name.name.as_str() { "i64" => Ty::new(span, TyKind::Int(IntTy::I64)), "i32" => Ty::new(span, TyKind::Int(IntTy::I32)), "i16" => Ty::new(span, TyKind::Int(IntTy::I16)), @@ -1774,8 +1770,15 @@ pub fn lower_type( // Check if the type is a struct if let Some(struct_id) = module.symbols.structs.get(other) { let mut generic_tys = Vec::new(); - for generic in generics { - generic_tys.push(lower_type(ctx, generic, module_id)?); + for generic in &name.generics { + generic_tys.push(lower_type( + ctx, + &TypeDescriptor::Type { + name: generic.clone(), + span: generic.span, + }, + module_id, + )?); } Ty::new( span, diff --git a/src/ir/lowering/common.rs b/src/ir/lowering/common.rs index f34518ea..57cf6efb 100644 --- a/src/ir/lowering/common.rs +++ b/src/ir/lowering/common.rs @@ -1,6 +1,9 @@ use std::collections::HashMap; -use crate::ir::{DefId, FnBody, Local, LocalIndex, ModuleBody, ProgramBody, Statement, Ty, TyKind}; +use crate::{ + ast::types::TypeDescriptor, + ir::{DefId, FnBody, Local, LocalIndex, ModuleBody, ProgramBody, Statement, Ty, TyKind}, +}; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct IdGenerator { @@ -34,13 +37,8 @@ impl IdGenerator { #[derive(Debug, Clone)] pub struct BuildCtx { pub body: ProgramBody, - pub unresolved_function_signatures: HashMap< - DefId, - ( - Vec, - Option, - ), - >, + pub unresolved_function_signatures: + HashMap, Option)>, pub gen: IdGenerator, } diff --git a/src/parser/tokens.rs b/src/parser/tokens.rs index 25a7deeb..44ffd1b3 100644 --- a/src/parser/tokens.rs +++ b/src/parser/tokens.rs @@ -105,6 +105,8 @@ pub enum Token { Semicolon, #[token(":")] Colon, + #[token("::")] + DoubleColon, #[token("->")] Arrow, #[token(",")] From a2ad74de7aa6cc4040379bbf760c584236b2caa7 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Fri, 10 Jan 2025 15:01:51 +0100 Subject: [PATCH 2/2] remove unused --- src/grammar.lalrpop | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/grammar.lalrpop b/src/grammar.lalrpop index 1c43af7b..9f8fb9f0 100644 --- a/src/grammar.lalrpop +++ b/src/grammar.lalrpop @@ -102,16 +102,6 @@ Comma: Vec = { } }; -Colon: Vec = { - ":")*> => match e { - None => v, - Some(e) => { - v.push(e); - v - } - } -}; - SemiColon: Vec = { ";")*> => match e { None => v,