From 1b71e254e3b13979d80a7ebeef9bf13b5e6cc958 Mon Sep 17 00:00:00 2001 From: Peefy Date: Mon, 20 Jun 2022 20:11:56 +0800 Subject: [PATCH] fix: issue #90 on config_expr type infer. (#91) fix: issue #88 on config_expr type infer. --- kclvm/sema/src/resolver/mod.rs | 1 - kclvm/sema/src/resolver/node.rs | 4 +++- kclvm/sema/src/resolver/test_fail_data/config_expr.k | 1 + kclvm/sema/src/resolver/tests.rs | 12 ++++++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 kclvm/sema/src/resolver/test_fail_data/config_expr.k diff --git a/kclvm/sema/src/resolver/mod.rs b/kclvm/sema/src/resolver/mod.rs index baae874b9..400c76b13 100644 --- a/kclvm/sema/src/resolver/mod.rs +++ b/kclvm/sema/src/resolver/mod.rs @@ -135,6 +135,5 @@ pub fn resolve_program(program: &mut Program) -> ProgramScope { let scope = resolver.check(kclvm_ast::MAIN_PKG); let type_alias_mapping = resolver.ctx.type_alias_mapping.clone(); process_program_type_alias(program, type_alias_mapping); - scope.check_scope_diagnostics(); scope } diff --git a/kclvm/sema/src/resolver/node.rs b/kclvm/sema/src/resolver/node.rs index 2b9aac9dc..1bec3a435 100644 --- a/kclvm/sema/src/resolver/node.rs +++ b/kclvm/sema/src/resolver/node.rs @@ -902,7 +902,9 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { } self.clear_config_expr_context(stack_depth, false); } - self.any_ty() + let key_ty = sup(&key_types); + let val_ty = sup(&val_types); + Type::dict_ref(key_ty, val_ty) } fn walk_check_expr(&mut self, check_expr: &'ctx ast::CheckExpr) -> Self::Result { diff --git a/kclvm/sema/src/resolver/test_fail_data/config_expr.k b/kclvm/sema/src/resolver/test_fail_data/config_expr.k new file mode 100644 index 000000000..f7ee275ce --- /dev/null +++ b/kclvm/sema/src/resolver/test_fail_data/config_expr.k @@ -0,0 +1 @@ +data: int = {key = 1} diff --git a/kclvm/sema/src/resolver/tests.rs b/kclvm/sema/src/resolver/tests.rs index 285199bef..b5b194096 100644 --- a/kclvm/sema/src/resolver/tests.rs +++ b/kclvm/sema/src/resolver/tests.rs @@ -3,6 +3,7 @@ use crate::resolver::resolve_program; use crate::resolver::scope::*; use crate::ty::Type; use kclvm_parser::parse_program; +use kclvm_error::*; use std::rc::Rc; #[test] @@ -34,3 +35,14 @@ fn test_resolve_program() { assert!(main_scope.lookup("b").is_some()); assert!(main_scope.lookup("print").is_none()); } + +#[test] +fn test_resolve_program_fail() { + let mut program = parse_program("./src/resolver/test_fail_data/config_expr.k").unwrap(); + let scope = resolve_program(&mut program); + assert_eq!(scope.diagnostics.len(), 1); + let diag = &scope.diagnostics[0]; + assert_eq!(diag.code, Some(DiagnosticId::Error(ErrorKind::TypeError))); + assert_eq!(diag.messages.len(), 1); + assert_eq!(diag.messages[0].message, "expect int, got {str:int(1)}"); +}