SymbolTable: Add Record type

This commit is contained in:
greg 2019-01-25 00:57:01 -08:00
parent c225e469ee
commit c0111e30bc
2 changed files with 13 additions and 1 deletions

View File

@ -482,6 +482,7 @@ impl<'a> State<'a> {
},
_ => unreachable!(),
},
SymbolSpec::RecordConstructor { .. } => return Err(format!("This shouldn't be a record!")),
},
/* see if it's an ordinary variable TODO make variables go in symbol table */
None => match self.values.lookup(&name) {

View File

@ -44,6 +44,9 @@ pub enum SymbolSpec {
type_name: Rc<String>,
type_args: Vec<Rc<String>>,
},
RecordConstructor {
fields: HashMap<Rc<String>, Rc<String>>
}
}
impl fmt::Display for SymbolSpec {
@ -52,6 +55,7 @@ impl fmt::Display for SymbolSpec {
match self {
Func(type_names) => write!(f, "Func({:?})", type_names),
DataConstructor { index, type_name, type_args } => write!(f, "DataConstructor(idx: {})({:?} -> {})", index, type_args, type_name),
RecordConstructor { fields } => write!(f, "RecordConstructor( <fields> )"),
}
}
}
@ -124,7 +128,14 @@ impl SymbolTable {
let symbol = Symbol { name: variant_name.clone(), spec };
self.values.insert(variant_name.clone(), symbol);
},
Variant::Record { .. } => return Err(format!("Record types not supported yet")),
//TODO if there is only one variant, and it is a record, it doesn't need to have an
//explicit name
Variant::Record { name, members } => {
let fields = HashMap::new();
let spec = SymbolSpec::RecordConstructor { fields };
let symbol = Symbol { name: name.clone(), spec };
self.values.insert(name.clone(), symbol);
},
}
}
Ok(())