diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 7efafd3..085a206 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -104,6 +104,7 @@ pub enum Prefix { Ref, RefMut, Deref, + New, } #[derive(Debug, Clone, Serialize)] diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 86d0f36..0b536c5 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -167,11 +167,13 @@ prefix = { deref_px | mut_ref_px | ref_px +| new_px } deref_px = { "*" } mut_ref_px = { "&" ~ mutable } ref_px = { "&" } +new_px = { "new" } expr = { prefix* ~ primary ~ postfix* diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 559a0f6..26f51f4 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -480,6 +480,7 @@ impl From> for Prefix { Rule::deref_px => Self::Deref, Rule::mut_ref_px => Self::RefMut, Rule::ref_px => Self::Ref, + Rule::new_px => Self::New, _ => unimplemented!("{pair:#?}"), } } diff --git a/src/codegen.rs b/src/codegen.rs index 1d3c873..865bf95 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -148,7 +148,12 @@ impl GetRust for Expression { initial, prefixes, postfixes, - } => prefixes.get_rust() + &initial.get_rust() + &postfixes.get_rust(), + } => { + prefixes.get_rust() + + &initial.get_rust() + + &Some(prefixes).get_rust() + + &postfixes.get_rust() + } } } } @@ -159,6 +164,7 @@ impl GetRust for Prefix { Self::Deref => "*", Self::Ref => "&", Self::RefMut => "&mut ", + Self::New => "", } .to_string() } @@ -170,6 +176,23 @@ impl GetRust for [Prefix] { } } +impl GetRust for Option<&Vec> { + fn get_rust(&self) -> String { + self.map(|prefixes| { + prefixes + .iter() + .last() + .map(|p| match p { + Prefix::New => "::new", + _ => "", + }) + .unwrap_or_default() + .to_string() + }) + .unwrap_or_default() + } +} + impl GetRust for Postfix { fn get_rust(&self) -> String { match self { diff --git a/test/src/main.mist b/test/src/main.mist index a376c85..9296bb1 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -7,6 +7,6 @@ class MyClass { } void main() { - var my_class = MyClass::new("World"); + var my_class = new MyClass("World"); println!("{}", my_class.message); }