From c54e005b62a671aedc20bbe535a8b4c37eb03203 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Sun, 18 May 2025 08:57:50 -0500 Subject: [PATCH] Add build for platform function. --- sketching/may_2025/print.dm | 5 ++++ src/ast/build.rs | 46 ++++++++++++++++++++++++++++++++++++- src/ast/unparse.rs | 1 + src/name_analysis/mod.rs | 4 ++-- src/parser/deimos.pest | 1 + 5 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 sketching/may_2025/print.dm diff --git a/sketching/may_2025/print.dm b/sketching/may_2025/print.dm new file mode 100644 index 0000000..5630409 --- /dev/null +++ b/sketching/may_2025/print.dm @@ -0,0 +1,5 @@ +ns std::core; + +platform fn print(msg: Any) -> Void; + +platform fn println(msg: Any) -> Void; diff --git a/src/ast/build.rs b/src/ast/build.rs index 5bbe695..7c3a05f 100644 --- a/src/ast/build.rs +++ b/src/ast/build.rs @@ -594,7 +594,46 @@ fn build_platform_function_declaration( file_id: usize, platform_function_pair: Pair, ) -> PlatformFunctionDeclaration { - todo!() + let mut is_public = false; + let mut modifier = None; + let mut generics = GenericParameters::default(); + let mut identifier = None; + let mut parameters = Parameters::default(); + let mut return_type = None; + + for inner_pair in platform_function_pair.into_inner() { + match inner_pair.as_rule() { + Rule::Pub => { + is_public = true; + } + Rule::FunctionModifier => { + modifier = Some(build_function_modifier(file_id, inner_pair)); + } + Rule::Platform | Rule::Fn => {}, + Rule::GenericParameters => { + generics = build_generic_parameters(file_id, inner_pair); + } + Rule::Identifier => { + identifier = Some(build_identifier(file_id, inner_pair)); + } + Rule::Parameters => { + parameters = build_parameters(file_id, inner_pair); + } + Rule::ReturnType => { + return_type = Some(build_return_type(file_id, inner_pair)); + } + _ => unreachable!(), + } + } + + PlatformFunctionDeclaration { + is_public, + modifier, + generics, + identifier: identifier.unwrap(), + parameters, + return_type: return_type.unwrap(), + } } fn build_interface_function_declaration( @@ -1798,4 +1837,9 @@ mod tests { fn use_list() { assert_builds("use std::core::{print, println};"); } + + #[test] + fn platform_function() { + assert_builds("platform fn println(msg: Any) -> Void;"); + } } diff --git a/src/ast/unparse.rs b/src/ast/unparse.rs index e15bcab..c4caa67 100644 --- a/src/ast/unparse.rs +++ b/src/ast/unparse.rs @@ -574,6 +574,7 @@ impl Unparse for PlatformFunctionDeclaration { self.parameters.unparse(writer)?; writer.write(" ")?; self.return_type.unparse(writer)?; + writer.write(";")?; Ok(()) } } diff --git a/src/name_analysis/mod.rs b/src/name_analysis/mod.rs index 625f512..4996de5 100644 --- a/src/name_analysis/mod.rs +++ b/src/name_analysis/mod.rs @@ -90,7 +90,7 @@ mod tests { let file_id = files.add(file_name, source); let parse_result = DeimosParser::parse(Rule::CompilationUnit, source); if let Err(err) = &parse_result { - panic!("{:?}", err); + panic!("{}", err); } let mut pairs = parse_result.unwrap(); if pairs.as_str().trim() != source.trim() { @@ -148,7 +148,7 @@ mod tests { indoc! {" ns std::core; - declare platform fn println(msg: String) -> Void + platform fn println(msg: String) -> Void; "}, ), ]); diff --git a/src/parser/deimos.pest b/src/parser/deimos.pest index 3c284a8..50aba7a 100644 --- a/src/parser/deimos.pest +++ b/src/parser/deimos.pest @@ -385,6 +385,7 @@ PlatformFunction = { ~ Identifier ~ Parameters ~ ReturnType + ~ ";" } InterfaceFunction = {