Implement support for global variables in nac3standalone #546
|
@ -650,6 +650,11 @@ impl Nac3 {
|
|||
}
|
||||
}
|
||||
}
|
||||
TopLevelDef::Variable { .. } => {
|
||||
return Err(CompileError::new_err(String::from(
|
||||
"Unsupported @rpc annotation on global variable",
|
||||
)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -977,6 +977,7 @@ pub fn gen_call<'ctx, G: CodeGenerator>(
|
|||
TopLevelDef::Class { .. } => {
|
||||
return Ok(Some(generator.gen_constructor(ctx, fun.0, &def, params)?))
|
||||
}
|
||||
TopLevelDef::Variable { .. } => unreachable!(),
|
||||
}
|
||||
}
|
||||
.or_else(|_: String| {
|
||||
|
|
|
@ -101,7 +101,8 @@ impl TopLevelComposer {
|
|||
.iter()
|
||||
.map(|def_ast| match *def_ast.0.read() {
|
||||
TopLevelDef::Class { name, .. } => name.to_string(),
|
||||
TopLevelDef::Function { simple_name, .. } => simple_name.to_string(),
|
||||
TopLevelDef::Function { simple_name, .. }
|
||||
| TopLevelDef::Variable { simple_name, .. } => simple_name.to_string(),
|
||||
})
|
||||
.collect_vec();
|
||||
|
||||
|
|
|
@ -391,6 +391,9 @@ impl TopLevelDef {
|
|||
r
|
||||
}
|
||||
),
|
||||
TopLevelDef::Variable { name, ty, .. } => {
|
||||
format!("Variable {{ name: {name:?}, ty: {:?} }}", unifier.stringify(*ty),)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -592,6 +595,18 @@ impl TopLevelComposer {
|
|||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn make_top_level_variable_def(
|
||||
name: String,
|
||||
simple_name: StrRef,
|
||||
ty: Type,
|
||||
ty_decl: Expr,
|
||||
resolver: Option<Arc<dyn SymbolResolver + Send + Sync>>,
|
||||
loc: Option<Location>,
|
||||
) -> TopLevelDef {
|
||||
TopLevelDef::Variable { name, simple_name, ty, ty_decl, resolver, loc }
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn make_class_method_name(mut class_name: String, method_name: &str) -> String {
|
||||
class_name.push('.');
|
||||
|
|
|
@ -10,7 +10,7 @@ use inkwell::values::BasicValueEnum;
|
|||
use itertools::Itertools;
|
||||
use parking_lot::RwLock;
|
||||
|
||||
use nac3parser::ast::{self, Location, Stmt, StrRef};
|
||||
use nac3parser::ast::{self, Expr, Location, Stmt, StrRef};
|
||||
|
||||
use crate::{
|
||||
codegen::{CodeGenContext, CodeGenerator},
|
||||
|
@ -148,6 +148,25 @@ pub enum TopLevelDef {
|
|||
/// Definition location.
|
||||
loc: Option<Location>,
|
||||
},
|
||||
Variable {
|
||||
/// Qualified name of the global variable, should be unique globally.
|
||||
name: String,
|
||||
|
||||
/// Simple name, the same as in method/function definition.
|
||||
simple_name: StrRef,
|
||||
|
||||
/// Type of the global variable.
|
||||
ty: Type,
|
||||
|
||||
/// The declared type of the global variable.
|
||||
ty_decl: Expr,
|
||||
|
||||
/// Symbol resolver of the module defined the class.
|
||||
resolver: Option<Arc<dyn SymbolResolver + Send + Sync>>,
|
||||
|
||||
/// Definition location.
|
||||
loc: Option<Location>,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct TopLevelContext {
|
||||
|
|
Loading…
Reference in New Issue