maint: Various cleanups and TODO stuff

This commit is contained in:
Jeremy Wall 2023-09-04 10:55:09 -04:00 committed by Jeremy Wall
parent c88b5eaf84
commit b1d6571194
3 changed files with 16 additions and 11 deletions

View File

@ -274,7 +274,8 @@ impl NarrowedShape {
} }
} }
#[doc = "Shapes represent the types that UCG values or expressions can have."] // TODO(jwall): Display implementations for shapes.
/// Shapes represent the types that UCG values or expressions can have.
#[derive(PartialEq, Debug, Clone)] #[derive(PartialEq, Debug, Clone)]
pub enum Shape { pub enum Shape {
Empty(Position), Empty(Position),
@ -309,12 +310,10 @@ impl Shape {
self.narrow_tuple_shapes(left_slist, right_slist, right) self.narrow_tuple_shapes(left_slist, right_slist, right)
} }
(Shape::Func(left_opshape), Shape::Func(right_opshape)) => { (Shape::Func(left_opshape), Shape::Func(right_opshape)) => {
// TODO todo!();
unimplemented!("Can't merge these yet.");
} }
(Shape::Module(left_opshape), Shape::Module(right_opshape)) => { (Shape::Module(left_opshape), Shape::Module(right_opshape)) => {
// TODO todo!();
unimplemented!("Can't merge these yet.");
} }
_ => Shape::TypeErr( _ => Shape::TypeErr(
right.pos().clone(), right.pos().clone(),

View File

@ -20,7 +20,9 @@ use crate::ast::walk::Visitor;
use crate::ast::{Expression, FailDef, ImportDef, IncludeDef, Shape, Statement, Value}; use crate::ast::{Expression, FailDef, ImportDef, IncludeDef, Shape, Statement, Value};
use crate::error::{BuildError, ErrorType}; use crate::error::{BuildError, ErrorType};
use super::{PositionedItem, NarrowedShape, ImportShape, CastType, NotDef, CopyDef, ModuleShape, FuncDef}; use super::{
CastType, CopyDef, FuncDef, ImportShape, ModuleShape, NarrowedShape, NotDef, PositionedItem,
};
/// Trait for shape derivation. /// Trait for shape derivation.
pub trait DeriveShape { pub trait DeriveShape {
@ -171,9 +173,7 @@ impl DeriveShape for Expression {
fn derive_shape(&self, symbol_table: &mut BTreeMap<Rc<str>, Shape>) -> Shape { fn derive_shape(&self, symbol_table: &mut BTreeMap<Rc<str>, Shape>) -> Shape {
match self { match self {
Expression::Simple(v) => v.derive_shape(symbol_table), Expression::Simple(v) => v.derive_shape(symbol_table),
Expression::Format(def) => { Expression::Format(def) => Shape::Str(PositionedItem::new("".into(), def.pos.clone())),
Shape::Str(PositionedItem::new("".into(), def.pos.clone()))
}
Expression::Not(def) => derive_not_shape(def, symbol_table), Expression::Not(def) => derive_not_shape(def, symbol_table),
Expression::Grouped(v, _pos) => v.as_ref().derive_shape(symbol_table), Expression::Grouped(v, _pos) => v.as_ref().derive_shape(symbol_table),
Expression::Range(def) => Shape::List(NarrowedShape::new_with_pos( Expression::Range(def) => Shape::List(NarrowedShape::new_with_pos(
@ -247,6 +247,14 @@ pub struct Checker {
shape_stack: Vec<Shape>, shape_stack: Vec<Shape>,
} }
// TODO(jwall): I am beginning to suspect that derive_shape should be a Trait.
// It would allow me to specify the contract a little more specifically now that
// I'm basically implementing the method all over the place.
// TODO(jwall): The symbol table contract also needs to be fleshed out a little better.
// I need to acccount for scopes syntactic scopes a bit. packages, functions and modules all are a
// factor.
impl Checker { impl Checker {
pub fn new() -> Self { pub fn new() -> Self {
return Self { return Self {
@ -295,7 +303,6 @@ impl Visitor for Checker {
} }
fn visit_value(&mut self, val: &mut Value) { fn visit_value(&mut self, val: &mut Value) {
// TODO(jwall): Some values can contain expressions. Handle those here.
match val { match val {
Value::Empty(p) => self.shape_stack.push(Shape::Empty(p.clone())), Value::Empty(p) => self.shape_stack.push(Shape::Empty(p.clone())),
Value::Boolean(p) => self.shape_stack.push(Shape::Boolean(p.clone())), Value::Boolean(p) => self.shape_stack.push(Shape::Boolean(p.clone())),

View File

@ -14,7 +14,6 @@
//! The tokenization stage of the ucg compiler. //! The tokenization stage of the ucg compiler.
use std; use std;
use std::rc::Rc;
use abortable_parser::combinators::*; use abortable_parser::combinators::*;
use abortable_parser::iter::SliceIter; use abortable_parser::iter::SliceIter;