From 8280be8973db27669af6a4cc1a748ffa5b2ee3ec Mon Sep 17 00:00:00 2001
From: itycodes <tranquillitycodes@proton.me>
Date: Fri, 7 Mar 2025 11:23:44 +0100
Subject: [PATCH] Added an explicit :void type param to `fn` declarations

Currently only :void is allowed. We still need to emit the OpTypeVoid.
---
 src/compiler/backend/tests.rs | 2 +-
 src/compiler/meta_compile.rs  | 4 +++-
 src/compiler/tests.rs         | 4 ++--
 src/parser/tests.rs           | 3 ++-
 4 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/compiler/backend/tests.rs b/src/compiler/backend/tests.rs
index 7319154..4a90b07 100644
--- a/src/compiler/backend/tests.rs
+++ b/src/compiler/backend/tests.rs
@@ -11,7 +11,7 @@ fn test_emit() {
 (dec frag-coord:*v4f32i Input)
 (dec out-color:*v4f32o Output)
 (entry main Fragment OriginUpperLeft (:frag-coord :out-color))
-(fun (main)
+(fun (main) :void
   (store-ptr (out-color)
     (v4f32i (/ (.xy (load-ptr frag-coord))
                (v2f32 1920.0 1080.0)) 
diff --git a/src/compiler/meta_compile.rs b/src/compiler/meta_compile.rs
index f88f500..7e8f937 100644
--- a/src/compiler/meta_compile.rs
+++ b/src/compiler/meta_compile.rs
@@ -181,6 +181,8 @@ pub fn compile_fun<I: Iterator<Item = Ast>>(
     let mut name_it = name.into_iter();
     let name = expect_symbol(name_it.next(), &name_loc)?;
     expect_empty(name_it, name_loc)?;
+    let _return_type = expect_one_of(&[":void"], expect_symbol(list.next(), &loc)?)?;
+    let return_type = _return_type.into_inner().replace(":", "");
     let body = list.collect::<Vec<_>>();
     let location = if let (Some(s), Some(e)) = (
         body.first().map(|a| a.location()),
@@ -192,7 +194,7 @@ pub fn compile_fun<I: Iterator<Item = Ast>>(
     };
     let fun = Function {
         name: name.to_string(),
-        return_type: "void".to_string(),
+        return_type: return_type,
         arguments: vec![],
         body: Some(vec![]),
         ast: Some(Ast::List(Localised {
diff --git a/src/compiler/tests.rs b/src/compiler/tests.rs
index 2a3dcee..cb47ba9 100644
--- a/src/compiler/tests.rs
+++ b/src/compiler/tests.rs
@@ -14,7 +14,7 @@ fn test_compile() {
 (dec frag-coord:*v4f32i Input)
 (dec out-color:*v4f32o Output)
 (entry main Fragment OriginUpperLeft (:frag-coord :out-color))
-(fun (main)
+(fun (main) :void
   (store-ptr (out-color)
     (v4f32i (/ (.xy (load-ptr frag-coord))
                (v2f32 1920.0 1080.0)) 
@@ -107,7 +107,7 @@ fn expected_symbol() {
 (dec frag-coord:*v4f32i Input)
 (dec out-color:*v4f32o Output)
 (entry main Fragment OriginUpperLeft (:frag-coord :out-color))
-(fun (main)
+(fun (main) :void
   (store-ptr (out-color)
     (v4f32i (/ (.xy (load-ptr frag-coord))
                (v2f32 1920.0 1080.0)) 
diff --git a/src/parser/tests.rs b/src/parser/tests.rs
index 07bde87..2dff458 100644
--- a/src/parser/tests.rs
+++ b/src/parser/tests.rs
@@ -43,7 +43,7 @@ fn test_parse() {
 (dec frag-coord:*v4f32i Input)
 (dec out-color:*v4f32o Output)
 (entry main Fragment OriginUpperLeft (:frag-coord :out-color))
-(fun (main)
+(fun (main) :void
   (store-ptr (out-color)
     (v4f32i (/ (.xy (load-ptr frag-coord))
                (v2f32 1920.0 1080.0)) 
@@ -108,6 +108,7 @@ fn test_parse() {
             Ast::List(Localised::dummy_location(vec![Ast::Symbol(
                 Localised::dummy_location("main".to_string()),
             )])),
+            Ast::Symbol(Localised::dummy_location(":void".to_string())),
             Ast::List(Localised::dummy_location(vec![
                 Ast::Symbol(Localised::dummy_location("store-ptr".to_string())),
                 Ast::List(Localised::dummy_location(vec![Ast::Symbol(