Add build for platform function.

This commit is contained in:
Jesse Brault 2025-05-18 08:57:50 -05:00
parent 938391ae09
commit c54e005b62
5 changed files with 54 additions and 3 deletions

View File

@ -0,0 +1,5 @@
ns std::core;
platform fn print(msg: Any) -> Void;
platform fn println(msg: Any) -> Void;

View File

@ -594,7 +594,46 @@ fn build_platform_function_declaration(
file_id: usize,
platform_function_pair: Pair<Rule>,
) -> 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;");
}
}

View File

@ -574,6 +574,7 @@ impl Unparse for PlatformFunctionDeclaration {
self.parameters.unparse(writer)?;
writer.write(" ")?;
self.return_type.unparse(writer)?;
writer.write(";")?;
Ok(())
}
}

View File

@ -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;
"},
),
]);

View File

@ -385,6 +385,7 @@ PlatformFunction = {
~ Identifier
~ Parameters
~ ReturnType
~ ";"
}
InterfaceFunction = {