Top level attributes
This commit is contained in:
@@ -62,6 +62,7 @@ pub struct TopLevel(pub TopLevelKind, pub Vec<Attribute>);
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub enum TopLevelKind {
|
||||
ModAttribute,
|
||||
Include(Path),
|
||||
StructDecl {
|
||||
export: bool,
|
||||
|
||||
@@ -23,6 +23,10 @@ attribute = {
|
||||
"#" ~ "[" ~ meta ~ "]"
|
||||
}
|
||||
|
||||
mod_attribute = {
|
||||
"#" ~ "!" ~ "[" ~ meta ~ "]"
|
||||
}
|
||||
|
||||
meta = {
|
||||
static_path ~ ("=" ~ primary | "(" ~ meta_list? ~ ")")?
|
||||
}
|
||||
@@ -33,7 +37,7 @@ meta_list = {
|
||||
|
||||
attributes = { attribute* }
|
||||
|
||||
top_level = { attributes ~ (import | function_decl | struct_decl) }
|
||||
top_level = { (attributes ~ (import | function_decl | struct_decl)) | mod_attribute }
|
||||
|
||||
import = { sharp ~ "include" ~ "<" ~ static_path ~ ">" }
|
||||
|
||||
|
||||
+8
-4
@@ -84,9 +84,7 @@ impl From<pest::iterators::Pair<'_, Rule>> for TypeExprKind {
|
||||
impl From<pest::iterators::Pair<'_, Rule>> for Path {
|
||||
fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self {
|
||||
match pair.as_rule() {
|
||||
Rule::static_path => {
|
||||
Path(pair.into_inner().map(|i| i.as_str().to_string()).collect())
|
||||
}
|
||||
Rule::static_path => Path(pair.into_inner().map(|i| i.as_str().to_string()).collect()),
|
||||
_ => unimplemented!("{pair:#?}"),
|
||||
}
|
||||
}
|
||||
@@ -188,7 +186,13 @@ impl From<pest::iterators::Pair<'_, Rule>> for TopLevel {
|
||||
.map(Attribute::from)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
TopLevel(TopLevelKind::from(inner.next().unwrap()), attributes)
|
||||
TopLevel(
|
||||
inner
|
||||
.next()
|
||||
.map(TopLevelKind::from)
|
||||
.unwrap_or(TopLevelKind::ModAttribute),
|
||||
attributes,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -228,9 +228,18 @@ impl ToRust for Block {
|
||||
|
||||
impl ToRust for TopLevel {
|
||||
fn to_rust(&self, cg: &mut RustCodegen) {
|
||||
match &self.0 {
|
||||
TopLevelKind::ModAttribute => {
|
||||
for attr in &self.1 {
|
||||
cg.addln(&format!("#![{}]", attr.get_rust()));
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
for attr in &self.1 {
|
||||
cg.addln(&format!("#[{}]", attr.get_rust()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.0.to_rust(cg);
|
||||
}
|
||||
@@ -261,6 +270,7 @@ impl GetRust for Attribute {
|
||||
impl ToRust for TopLevelKind {
|
||||
fn to_rust(&self, cg: &mut RustCodegen) {
|
||||
match self {
|
||||
Self::ModAttribute => {}
|
||||
Self::Include(path) => {
|
||||
cg.addln(&format!("use {};", path.get_rust()));
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#![allow(unused_mut)]
|
||||
|
||||
#[derive(Debug)]
|
||||
public struct ApiCall {
|
||||
i32 x,
|
||||
|
||||
Reference in New Issue
Block a user