From 5292f3283561f4b8fd987986685773490acc4c42 Mon Sep 17 00:00:00 2001 From: pca006132 Date: Fri, 25 Jun 2021 16:08:32 +0800 Subject: [PATCH] removed method for type variables --- nac3core/src/context/inference_context.rs | 16 ----- nac3core/src/expression_inference.rs | 18 ++--- nac3core/src/inference_core.rs | 80 +---------------------- 3 files changed, 7 insertions(+), 107 deletions(-) diff --git a/nac3core/src/context/inference_context.rs b/nac3core/src/context/inference_context.rs index d056e3d4..e1fbff2f 100644 --- a/nac3core/src/context/inference_context.rs +++ b/nac3core/src/context/inference_context.rs @@ -185,22 +185,6 @@ impl TypeEnum { } } - pub fn inv_subst(&self, map: &[(Type, Type)]) -> Type { - for (from, to) in map.iter() { - if self == from.as_ref() { - return to.clone(); - } - } - match self { - TypeEnum::ParametricType(id, params) => TypeEnum::ParametricType( - *id, - params.iter().map(|v| v.as_ref().inv_subst(map)).collect(), - ), - _ => self.clone(), - } - .into() - } - pub fn get_subst(&self, ctx: &InferenceContext) -> HashMap { match self { TypeEnum::ParametricType(id, params) => { diff --git a/nac3core/src/expression_inference.rs b/nac3core/src/expression_inference.rs index 34acf4dd..9466d044 100644 --- a/nac3core/src/expression_inference.rs +++ b/nac3core/src/expression_inference.rs @@ -658,7 +658,7 @@ mod test { let ast = parse_expression("a + a + a").unwrap(); let result = infer_expr(&mut ctx, &ast); - assert_eq!(result.unwrap().unwrap(), TypeVariable(v0).into()); + assert_eq!(result, Err("not supported".into())); } #[test] @@ -677,7 +677,7 @@ mod test { let ast = parse_expression("-a").unwrap(); let result = infer_expr(&mut ctx, &ast); - assert_eq!(result.unwrap().unwrap(), TypeVariable(v0).into()); + assert_eq!(result, Err("not supported".into())); let ast = parse_expression("not True").unwrap(); let result = infer_expr(&mut ctx, &ast); @@ -700,11 +700,11 @@ mod test { let ast = parse_expression("a == a == a").unwrap(); let result = infer_expr(&mut ctx, &ast); - assert_eq!(result.unwrap().unwrap(), ctx.get_primitive(BOOL_TYPE)); + assert_eq!(result, Err("not supported".into())); let ast = parse_expression("a == a == 1").unwrap(); let result = infer_expr(&mut ctx, &ast); - assert_eq!(result, Err("not equal".into())); + assert_eq!(result, Err("not supported".into())); let ast = parse_expression("True > False").unwrap(); let result = infer_expr(&mut ctx, &ast); @@ -792,7 +792,7 @@ mod test { let ast = parse_expression("v1.a()").unwrap(); let result = infer_expr(&mut ctx, &ast); - assert_eq!(result.unwrap().unwrap(), TypeVariable(v1).into()); + assert_eq!(result, Err("not supported".into())); let ast = parse_expression("foobar.a()").unwrap(); let result = infer_expr(&mut ctx, &ast); @@ -809,14 +809,6 @@ mod test { let ast = parse_expression("[][0].a()").unwrap(); let result = infer_expr(&mut ctx, &ast); assert_eq!(result, Err("not supported".into())); - - let ast = parse_expression("v0.a()").unwrap(); - let result = infer_expr(&mut ctx, &ast); - assert_eq!(result, Err("unbounded type var".into())); - - let ast = parse_expression("v2.a()").unwrap(); - let result = infer_expr(&mut ctx, &ast); - assert_eq!(result, Err("no such function".into())); } #[test] diff --git a/nac3core/src/inference_core.rs b/nac3core/src/inference_core.rs index 8e7796a3..3b6b7d06 100644 --- a/nac3core/src/inference_core.rs +++ b/nac3core/src/inference_core.rs @@ -129,39 +129,6 @@ fn resolve_call_rec( let fun = match &obj { Some(obj) => { let base = match obj.as_ref() { - TypeVariable(id) => { - let v = ctx.get_variable_def(*id); - if v.bound.is_empty() { - return Err("unbounded type var".to_string()); - } - let results: Result, String> = v - .bound - .iter() - .map(|ins| { - resolve_call_rec( - ctx, - &Some((*id, ins.clone())), - Some(ins.clone()), - func, - args.clone(), - ) - }) - .collect(); - let results = results?; - if results.iter().all(|v| v == &results[0]) { - return Ok(results[0].clone()); - } - let mut results = results.iter().zip(v.bound.iter()).map(|(r, ins)| { - r.as_ref() - .map(|v| v.inv_subst(&[(ins.clone(), obj.clone())])) - }); - let first = results.next().unwrap(); - if results.all(|v| v == first) { - return Ok(first); - } else { - return Err("divergent type after substitution".to_string()); - } - } PrimitiveType(id) => &ctx.get_primitive_def(*id), ClassType(id) | VirtualClassType(id) => &ctx.get_class_def(*id).base, ParametricType(id, _) => &ctx.get_parametric_def(*id).base, @@ -273,25 +240,6 @@ mod tests { bound: vec![], }); let v0 = ctx.get_variable(v0); - let v1 = ctx.add_variable(VarDef { - name: "V1", - bound: vec![ctx.get_primitive(INT32_TYPE), ctx.get_primitive(FLOAT_TYPE)], - }); - let v1 = ctx.get_variable(v1); - let v2 = ctx.add_variable(VarDef { - name: "V2", - bound: vec![ctx.get_primitive(INT32_TYPE), ctx.get_primitive(FLOAT_TYPE)], - }); - let v2 = ctx.get_variable(v2); - let v3 = ctx.add_variable(VarDef { - name: "V3", - bound: vec![ - ctx.get_primitive(BOOL_TYPE), - ctx.get_primitive(INT32_TYPE), - ctx.get_primitive(FLOAT_TYPE), - ], - }); - let v3 = ctx.get_variable(v3); let int32 = ctx.get_primitive(INT32_TYPE); let int64 = ctx.get_primitive(INT64_TYPE); @@ -315,32 +263,8 @@ mod tests { // with type variables assert_eq!( - resolve_call(&ctx, Some(v1.clone()), "__add__", &[v1.clone()]), - Ok(Some(v1.clone())) - ); - assert_eq!( - resolve_call(&ctx, Some(v0.clone()), "__add__", &[v2.clone()]), - Err("unbounded type var".to_string()) - ); - assert_eq!( - resolve_call(&ctx, Some(v1.clone()), "__add__", &[v0]), - Err("different domain".to_string()) - ); - assert_eq!( - resolve_call(&ctx, Some(v1.clone()), "__add__", &[v2]), - Err("different domain".to_string()) - ); - assert_eq!( - resolve_call(&ctx, Some(v1.clone()), "__add__", &[v3.clone()]), - Err("different domain".to_string()) - ); - assert_eq!( - resolve_call(&ctx, Some(v3.clone()), "__add__", &[v1]), - Err("no such function".to_string()) - ); - assert_eq!( - resolve_call(&ctx, Some(v3.clone()), "__add__", &[v3]), - Err("no such function".to_string()) + resolve_call(&ctx, Some(v0.clone()), "__add__", &[v0.clone()]), + Err("not supported".into()) ); }