Skip to content

Commit

Permalink
fix: resolver ty mismatch in the assign statement with the schema typ…
Browse files Browse the repository at this point in the history
…e annotation (#384)

* refactor: enhance the sematic type parse using the AST type in the resolver.

* fix: assign stmt with schema type annotation type mismatch.
  • Loading branch information
Peefy committed Jan 18, 2023
1 parent c596ca2 commit c03012b
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 9 deletions.
4 changes: 2 additions & 2 deletions kclvm/sema/src/resolver/global.rs
Original file line number Diff line number Diff line change
Expand Up @@ -522,8 +522,8 @@ impl<'ctx> Resolver<'ctx> {
&index_signature.node.key_type.node,
index_signature.node.key_type.get_pos(),
);
let val_ty = self.parse_ty_str_with_scope(
&index_signature.node.value_type.node,
let val_ty = self.parse_ty_with_scope(
&index_signature.node.value_ty.node,
index_signature.node.value_type.get_pos(),
);
if !self
Expand Down
14 changes: 7 additions & 7 deletions kclvm/sema/src/resolver/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> {
fn walk_type_alias_stmt(&mut self, type_alias_stmt: &'ctx ast::TypeAliasStmt) -> Self::Result {
let (start, end) = type_alias_stmt.type_name.get_span_pos();
let mut ty = self
.parse_ty_str_with_scope(&type_alias_stmt.type_value.node, start.clone())
.parse_ty_with_scope(&type_alias_stmt.ty.node, start.clone())
.as_ref()
.clone();
if let TypeKind::Schema(schema_ty) = &mut ty.kind {
Expand Down Expand Up @@ -137,13 +137,13 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> {
self.clear_config_expr_context(init_stack_depth as usize, false)
} else {
value_ty = self.expr(&assign_stmt.value);
self.must_assignable_to(
value_ty.clone(),
expected_ty.clone(),
target.get_pos(),
None,
)
}
self.must_assignable_to(
value_ty.clone(),
expected_ty.clone(),
target.get_pos(),
None,
);
if !value_ty.is_any()
&& expected_ty.is_any()
&& assign_stmt.type_annotation.is_none()
Expand Down
9 changes: 9 additions & 0 deletions test/grammar/types/var_type_annotation/type_fail_10/main.k
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
schema Foo:
foo: int

schema Bar:
bar: int

foo: Foo = Bar {
bar: 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import sys
import kclvm.kcl.error as kcl_error
import os

cwd = os.path.dirname(os.path.realpath(__file__))

kcl_error.print_kcl_error_message(
kcl_error.get_exception(
err_type=kcl_error.ErrType.TypeError_Compile_TYPE,
file_msgs=[
kcl_error.ErrFileMsg(
filename=cwd + "/main.k",
line_no=7,
col_no=1,
arg_msg='got Bar',
)
],
arg_msg='expect Foo, got Bar',
),
file=sys.stdout,
)
7 changes: 7 additions & 0 deletions test/grammar/types/var_type_annotation/type_fail_11/main.k
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
schema Foo:
foo: int

schema Bar:
bar: int

foo: Foo = 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import sys
import kclvm.kcl.error as kcl_error
import os

cwd = os.path.dirname(os.path.realpath(__file__))

kcl_error.print_kcl_error_message(
kcl_error.get_exception(
err_type=kcl_error.ErrType.TypeError_Compile_TYPE,
file_msgs=[
kcl_error.ErrFileMsg(
filename=cwd + "/main.k",
line_no=7,
col_no=1,
arg_msg='got int(1)',
)
],
arg_msg='expect Foo, got int(1)',
),
file=sys.stdout,
)
9 changes: 9 additions & 0 deletions test/grammar/types/var_type_annotation/type_fail_12/main.k
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
schema Foo:
foo: int

schema Bar:
bar: int

foo: int = Foo {
foo = 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import sys
import kclvm.kcl.error as kcl_error
import os

cwd = os.path.dirname(os.path.realpath(__file__))

kcl_error.print_kcl_error_message(
kcl_error.get_exception(
err_type=kcl_error.ErrType.TypeError_Compile_TYPE,
file_msgs=[
kcl_error.ErrFileMsg(
filename=cwd + "/main.k", line_no=7, col_no=1, arg_msg="got Foo"
)
],
arg_msg="expect int, got Foo",
),
file=sys.stdout,
)

0 comments on commit c03012b

Please sign in to comment.