aboutsummaryrefslogtreecommitdiff
path: root/frontend/check.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/check.icl')
-rw-r--r--frontend/check.icl411
1 files changed, 142 insertions, 269 deletions
diff --git a/frontend/check.icl b/frontend/check.icl
index bdbb68b..0b2ce97 100644
--- a/frontend/check.icl
+++ b/frontend/check.icl
@@ -79,7 +79,7 @@ where
checkSpecial :: !Index !FunType !Index !SpecialSubstitution (!Index, ![FunType], !*Heaps, !*ErrorAdmin)
-> (!Special, (!Index, ![FunType], !*Heaps, !*ErrorAdmin))
checkSpecial mod_index fun_type=:{ft_type} fun_index subst (next_inst_index, special_types, heaps, error)
- # (special_type, hp_type_heaps) = substitute_type ft_type subst heaps.hp_type_heaps
+ # (special_type, hp_type_heaps, error) = substitute_type ft_type subst heaps.hp_type_heaps error
(spec_types, error) = checkAndCollectTypesOfContexts special_type.st_context error
ft_type = { special_type & st_context = [] }
(new_info_ptr, hp_var_heap) = newPtr VI_Empty heaps.hp_var_heap
@@ -87,11 +87,11 @@ checkSpecial mod_index fun_type=:{ft_type} fun_index subst (next_inst_index, spe
((inc next_inst_index), [{ fun_type & ft_type = ft_type, ft_specials = SP_FunIndex fun_index, ft_type_ptr = new_info_ptr} : special_types ],
{ heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap }, error))
where
- substitute_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment type_heaps
- # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, _, type_heaps)
- = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment [] type_heaps
+ substitute_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment type_heaps error
+ # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, _, type_heaps, Yes error)
+ = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment [] type_heaps (Yes error)
= ({st & st_vars = st_vars, st_args = st_args, st_result = st_result, st_attr_vars = st_attr_vars,
- st_context = st_context, st_attr_env = st_attr_env }, type_heaps)
+ st_context = st_context, st_attr_env = st_attr_env }, type_heaps, error)
checkDclFunctions :: !Index !Index ![FunType] !v:{#CheckedTypeDef} !x:{#ClassDef} !v:{#.DclModule} !*Heaps !*CheckState
-> (!Index, ![FunType], ![FunType], !v:{#CheckedTypeDef}, !x:{#ClassDef}, !v:{#DclModule}, !*Heaps, !*CheckState)
@@ -356,18 +356,18 @@ where
checkInstances :: !Index !*CommonDefs !u:{# DclModule} !*VarHeap !*TypeHeaps !*CheckState
-> (![(Index,SymbolType)], !*CommonDefs, !u:{# DclModule}, !*VarHeap , !*TypeHeaps, !*CheckState)
-checkInstances mod_index icl_common=:{com_instance_defs,com_class_defs,com_member_defs,/*AA*/com_generic_defs} modules var_heap type_heaps cs=:{cs_error}
+checkInstances mod_index icl_common=:{com_instance_defs,com_class_defs,com_member_defs,com_generic_defs,com_type_defs} modules var_heap type_heaps cs=:{cs_error}
| cs_error.ea_ok
- # (instance_types, com_instance_defs, com_class_defs, com_member_defs, com_generic_defs, modules, var_heap, type_heaps, cs)
- = check_instances 0 mod_index [] com_instance_defs com_class_defs com_member_defs /*AA*/com_generic_defs modules var_heap type_heaps cs
- = (instance_types, { icl_common & com_instance_defs = com_instance_defs,com_class_defs = com_class_defs,com_member_defs = com_member_defs, /*AA*/com_generic_defs = com_generic_defs },
+ # (instance_types, com_instance_defs, com_class_defs, com_member_defs, com_generic_defs, com_type_defs, modules, var_heap, type_heaps, cs)
+ = check_instances 0 mod_index [] com_instance_defs com_class_defs com_member_defs /*AA*/com_generic_defs com_type_defs modules var_heap type_heaps cs
+ = (instance_types, { icl_common & com_instance_defs = com_instance_defs,com_class_defs = com_class_defs,com_member_defs = com_member_defs, /*AA*/com_generic_defs = com_generic_defs, com_type_defs = com_type_defs },
modules, var_heap, type_heaps, cs)
= ([], icl_common, modules, var_heap, type_heaps, cs)
where
- check_instances :: !Index !Index ![(Index,SymbolType)] !x:{# ClassInstance} !w:{# ClassDef} !v:{# MemberDef} /*AA*/!w:{# GenericDef} !u:{# DclModule}
+ check_instances :: !Index !Index ![(Index,SymbolType)] !x:{# ClassInstance} !w:{# ClassDef} !v:{# MemberDef} /*AA*/!w:{# GenericDef} !nerd:{# CheckedTypeDef} !u:{# DclModule}
!*VarHeap !*TypeHeaps !*CheckState
- -> (![(Index,SymbolType)], !x:{# ClassInstance}, !w:{# ClassDef}, !v:{# MemberDef}, /*AA*/!w:{# GenericDef}, !u:{# DclModule}, !*VarHeap, !*TypeHeaps, !*CheckState)
- check_instances inst_index mod_index instance_types instance_defs class_defs member_defs generic_defs modules var_heap type_heaps cs
+ -> (![(Index,SymbolType)], !x:{# ClassInstance}, !w:{# ClassDef}, !v:{# MemberDef}, /*AA*/!w:{# GenericDef}, !nerd:{# CheckedTypeDef}, !u:{# DclModule}, !*VarHeap, !*TypeHeaps, !*CheckState)
+ check_instances inst_index mod_index instance_types instance_defs class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs
/*
| inst_index < size instance_defs
# ({ins_class,ins_members,ins_type, /*AA*/ins_generic}, instance_defs) = instance_defs![inst_index]
@@ -383,63 +383,65 @@ where
*/
// AA..
| inst_index < size instance_defs
- # (instance_def=:{ins_is_generic}, instance_defs) = instance_defs![inst_index]
- # (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs) =
+ # (instance_def=:{ins_ident,ins_is_generic, ins_pos}, instance_defs) = instance_defs![inst_index]
+ # (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs) =
(if ins_is_generic check_generic_instance check_class_instance)
- instance_def mod_index instance_types class_defs member_defs generic_defs modules var_heap type_heaps cs
- = check_instances (inc inst_index) mod_index instance_types instance_defs class_defs member_defs generic_defs modules var_heap type_heaps cs
+ instance_def mod_index instance_types class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs
+ = check_instances (inc inst_index) mod_index instance_types instance_defs class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs
// otherwise
- = (instance_types, instance_defs, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, instance_defs, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
- check_class_instance {ins_class,ins_members,ins_type} mod_index instance_types class_defs member_defs generic_defs modules var_heap type_heaps cs
+ check_class_instance {ins_pos,ins_class,ins_members,ins_type} mod_index instance_types class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs
# ({class_members,class_name}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules
class_size = size class_members
| class_size == size ins_members
- # (instance_types, member_defs, modules, var_heap, type_heaps, cs) = check_member_instances mod_index ins_class.glob_module
- 0 class_size ins_members class_members ins_type instance_types member_defs modules var_heap type_heaps cs
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ # (instance_types, member_defs, type_defs, modules, var_heap, type_heaps, cs)
+ = check_member_instances mod_index ins_class.glob_module
+ 0 class_size ins_members class_members class_name ins_pos ins_type instance_types member_defs type_defs modules var_heap type_heaps cs
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
// otherwise
# cs = { cs & cs_error = checkError class_name "different number of members specified" cs.cs_error }
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
- check_generic_instance {ins_class, ins_members, ins_generate} mod_index instance_types class_defs member_defs generic_defs modules var_heap type_heaps cs
+ check_generic_instance {ins_class, ins_members, ins_generate} mod_index instance_types class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs
# ({gen_name, gen_member_name}, generic_defs, modules) = getGenericDef ins_class mod_index generic_defs modules
| ins_generate
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
| size ins_members <> 1
# cs = { cs & cs_error = checkError gen_name "generic instance must have one memeber" cs.cs_error }
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
# member_name = ins_members.[0].ds_ident
| member_name <> gen_member_name
# cs = { cs & cs_error = checkError member_name "wrong member name" cs.cs_error }
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
// otherwise
- = (instance_types, class_defs, member_defs, generic_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs)
// ..AA
- check_member_instances :: !Index !Index !Int !Int !{#DefinedSymbol} !{#DefinedSymbol} !InstanceType ![(Index,SymbolType)]
- !v:{# MemberDef} !u:{# DclModule} !*VarHeap !*TypeHeaps !*CheckState
- -> (![(Index,SymbolType)], !v:{# MemberDef}, !u:{# DclModule},!*VarHeap, !*TypeHeaps, !*CheckState)
+ check_member_instances :: !Index !Index !Int !Int !{#DefinedSymbol} !{#DefinedSymbol} Ident !Position !InstanceType ![(Index,SymbolType)]
+ !v:{# MemberDef} !blah:{# CheckedTypeDef} !u:{# DclModule} !*VarHeap !*TypeHeaps !*CheckState
+ -> (![(Index,SymbolType)], !v:{# MemberDef}, !blah:{# CheckedTypeDef}, !u:{# DclModule},!*VarHeap, !*TypeHeaps, !*CheckState)
check_member_instances module_index member_mod_index mem_offset class_size ins_members class_members
- ins_type instance_types member_defs modules var_heap type_heaps cs
+ class_name ins_pos ins_type instance_types member_defs type_defs modules var_heap type_heaps cs=:{cs_x={x_main_dcl_module_n}}
| mem_offset == class_size
- = (instance_types, member_defs, modules, var_heap, type_heaps, cs)
+ = (instance_types, member_defs, type_defs, modules, var_heap, type_heaps, cs)
# ins_member = ins_members.[mem_offset]
class_member = class_members.[mem_offset]
| ins_member.ds_ident <> class_member.ds_ident
- = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members ins_type
- instance_types member_defs modules var_heap type_heaps
+ = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members class_name ins_pos ins_type
+ instance_types member_defs type_defs modules var_heap type_heaps
{ cs & cs_error = checkError class_member.ds_ident "instance of class member expected" cs.cs_error}
| ins_member.ds_arity <> class_member.ds_arity
- = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members ins_type
- instance_types member_defs modules var_heap type_heaps
+ = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members class_name ins_pos ins_type
+ instance_types member_defs type_defs modules var_heap type_heaps
{ cs & cs_error = checkError class_member.ds_ident "used with wrong arity" cs.cs_error}
# ({me_type,me_class_vars}, member_defs, modules) = getMemberDef member_mod_index class_member.ds_index module_index member_defs modules
- (instance_type, _, type_heaps) = determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None type_heaps
+ (instance_type, _, type_heaps, Yes cs_error) = determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None type_heaps (Yes cs.cs_error)
+ (type_defs, modules, cs_error) = checkTopLevelKinds x_main_dcl_module_n True ins_pos class_name instance_type type_defs modules cs_error
(st_context, var_heap) = initializeContextVariables instance_type.st_context var_heap
- = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members ins_type
- [ (ins_member.ds_index, { instance_type & st_context = st_context }) : instance_types ] member_defs modules var_heap type_heaps cs
+ = check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members class_name ins_pos ins_type
+ [ (ins_member.ds_index, { instance_type & st_context = st_context }) : instance_types ] member_defs type_defs modules var_heap type_heaps { cs & cs_error = cs_error }
getClassDef :: !(Global DefinedSymbol) !Int !u:{#ClassDef} !v:{#DclModule} -> (!ClassDef,!u:{#ClassDef},!v:{#DclModule})
@@ -468,27 +470,34 @@ getGenericDef {glob_module, glob_object={ds_ident, ds_index}} mod_index generic_
= (dcl_mod.dcl_common.com_generic_defs.[ds_index], generic_defs, modules)
// ..AA
-instantiateTypes :: ![TypeVar] ![AttributeVar] !types ![TypeContext] ![AttrInequality] !SpecialSubstitution ![SpecialSubstitution] !*TypeHeaps
- -> (![TypeVar], ![AttributeVar], !types , ![TypeContext], ![AttrInequality], ![SpecialSubstitution], !*TypeHeaps) | substitute types
-instantiateTypes old_type_vars old_attr_vars types type_contexts attr_env {ss_environ, ss_vars, ss_attrs, ss_context} special_subst_list type_heaps=:{th_vars, th_attrs}
+instantiateTypes :: ![TypeVar] ![AttributeVar] !types ![TypeContext] ![AttrInequality] !SpecialSubstitution ![SpecialSubstitution] !*TypeHeaps !(Optional *ErrorAdmin)
+ -> (![TypeVar], ![AttributeVar], !types , ![TypeContext], ![AttrInequality], ![SpecialSubstitution], !*TypeHeaps, !(Optional *ErrorAdmin)) | substitute types
+instantiateTypes old_type_vars old_attr_vars types type_contexts attr_env {ss_environ, ss_vars, ss_attrs, ss_context} special_subst_list type_heaps=:{th_vars, th_attrs} opt_error
# th_vars = clear_vars old_type_vars th_vars
(new_type_vars, th_vars) = foldSt build_var_subst ss_vars ([], th_vars)
(new_attr_vars, th_attrs) = foldSt build_attr_subst ss_attrs ([], th_attrs)
type_heaps = foldSt build_type_subst ss_environ { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
- (new_ss_context, type_heaps) = substitute ss_context type_heaps
+ (ok1, new_ss_context, type_heaps) = substitute ss_context type_heaps
(inst_vars, th_vars) = foldSt determine_free_var old_type_vars (new_type_vars, type_heaps.th_vars)
(inst_attr_vars, th_attrs) = foldSt build_attr_subst old_attr_vars (new_attr_vars, type_heaps.th_attrs)
- (inst_types, type_heaps) = substitute types { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
- (inst_contexts, type_heaps) = substitute type_contexts type_heaps
- (inst_attr_env, type_heaps) = substitute attr_env type_heaps
-
+ (ok2, inst_types, type_heaps) = substitute types { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
+ (ok3, inst_contexts, type_heaps) = substitute type_contexts type_heaps
+ (ok4, inst_attr_env, type_heaps) = substitute attr_env type_heaps
(special_subst_list, th_vars) = mapSt adjust_special_subst special_subst_list type_heaps.th_vars
-
- = (inst_vars, inst_attr_vars, inst_types, inst_contexts ++ new_ss_context, inst_attr_env, special_subst_list, { type_heaps & th_vars = th_vars })
+
+ opt_error = case ok1 && ok2 && ok3 && ok4 of
+ True -> opt_error
+ _ -> case opt_error of
+ No -> No
+ Yes error_admin
+ -> Yes (checkError "" "instance type incompatible with class type"
+ error_admin)
+ // e.g.:class c a :: (a Int); instance c Real
+ = (inst_vars, inst_attr_vars, inst_types, inst_contexts ++ new_ss_context, inst_attr_env, special_subst_list, { type_heaps & th_vars = th_vars }, opt_error)
where
clear_vars type_vars type_var_heap = foldSt (\tv -> writePtr tv.tv_info_ptr TVI_Empty) type_vars type_var_heap
@@ -501,7 +510,7 @@ where
-> (free_vars, type_var_heap)
build_type_subst {bind_src,bind_dst} type_heaps
- # (bind_src, type_heaps) = substitute bind_src type_heaps
+ # (_, bind_src, type_heaps) = substitute bind_src type_heaps
= { type_heaps & th_vars = writePtr bind_dst.tv_info_ptr (TVI_Type bind_src) type_heaps.th_vars}
build_var_subst var (free_vars, type_var_heap)
@@ -522,11 +531,11 @@ where
# (TVI_Type (TV new_tv), type_var_heap) = readPtr tv_info_ptr type_var_heap
= ({ bind & bind_dst = new_tv }, type_var_heap)
-substituteInstanceType :: !InstanceType !SpecialSubstitution !*TypeHeaps -> (!InstanceType,!*TypeHeaps)
-substituteInstanceType it=:{it_vars,it_attr_vars,it_types,it_context} environment type_heaps
- # (it_vars, it_attr_vars, it_types, it_context, _, _, type_heaps)
- = instantiateTypes it_vars it_attr_vars it_types it_context [] environment [] type_heaps
- = ({it & it_vars = it_vars, it_types = it_types, it_attr_vars = it_attr_vars, it_context = it_context }, type_heaps)
+substituteInstanceType :: !InstanceType !SpecialSubstitution !*TypeHeaps !*ErrorAdmin -> (!InstanceType,!*TypeHeaps,!.ErrorAdmin)
+substituteInstanceType it=:{it_vars,it_attr_vars,it_types,it_context} environment type_heaps cs_error
+ # (it_vars, it_attr_vars, it_types, it_context, _, _, type_heaps, Yes cs_error)
+ = instantiateTypes it_vars it_attr_vars it_types it_context [] environment [] type_heaps (Yes cs_error)
+ = ({it & it_vars = it_vars, it_types = it_types, it_attr_vars = it_attr_vars, it_context = it_context }, type_heaps, cs_error)
hasTypeVariables []
= False
@@ -535,79 +544,85 @@ hasTypeVariables [TV tvar : types]
hasTypeVariables [ _ : types]
= hasTypeVariables types
-determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps -> (!SymbolType, !Specials, !*TypeHeaps)
-determineTypeOfMemberInstance mem_st class_vars {it_types,it_vars,it_attr_vars,it_context} specials type_heaps
+determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps !(Optional *ErrorAdmin)
+ -> (!SymbolType, !Specials, !*TypeHeaps, !Optional *ErrorAdmin)
+determineTypeOfMemberInstance mem_st class_vars {it_types,it_vars,it_attr_vars,it_context} specials type_heaps opt_error
# env = { ss_environ = foldl2 (\binds var type -> [ {bind_src = type, bind_dst = var} : binds]) [] class_vars it_types,
ss_context = it_context, ss_vars = it_vars, ss_attrs = it_attr_vars}
- = determine_type_of_member_instance mem_st env specials type_heaps
+ (st, specials, type_heaps, opt_error)
+ = determine_type_of_member_instance mem_st env specials type_heaps opt_error
+ = (st, specials, type_heaps, opt_error)
where
- determine_type_of_member_instance mem_st=:{st_context} env (SP_Substitutions substs) type_heaps
- # (mem_st, substs, type_heaps) = substitute_symbol_type { mem_st & st_context = tl st_context } env substs type_heaps
- = (mem_st, SP_Substitutions substs, type_heaps)
- determine_type_of_member_instance mem_st=:{st_context} env SP_None type_heaps
- # (mem_st, _, type_heaps) = substitute_symbol_type { mem_st & st_context = tl st_context } env [] type_heaps
- = (mem_st, SP_None, type_heaps)
-
- substitute_symbol_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment specials type_heaps
- # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, specials, type_heaps)
- = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment specials type_heaps
+ determine_type_of_member_instance mem_st=:{st_context} env (SP_Substitutions substs) type_heaps opt_error
+ # (mem_st, substs, type_heaps, opt_error)
+ = substitute_symbol_type { mem_st & st_context = tl st_context } env substs type_heaps opt_error
+ = (mem_st, SP_Substitutions substs, type_heaps, opt_error)
+ determine_type_of_member_instance mem_st=:{st_context} env SP_None type_heaps opt_error
+ # (mem_st, _, type_heaps, opt_error)
+ = substitute_symbol_type { mem_st & st_context = tl st_context } env [] type_heaps opt_error
+ = (mem_st, SP_None, type_heaps, opt_error)
+
+ substitute_symbol_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment specials type_heaps opt_error
+ # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, specials, type_heaps, opt_error)
+ = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment specials type_heaps opt_error
= ({st & st_vars = st_vars, st_args = st_args, st_result = st_result, st_attr_vars = st_attr_vars,
- st_context = st_context, st_attr_env = st_attr_env }, specials, type_heaps)
+ st_context = st_context, st_attr_env = st_attr_env }, specials, type_heaps, opt_error)
determineTypesOfInstances :: !Index !Index !*{#ClassInstance} !*{# ClassDef} !*{# MemberDef}
!*{#DclModule} !*TypeHeaps !*VarHeap !*CheckState
-> (![FunType], !Index, ![ClassInstance], !*{#ClassInstance}, !*{# ClassDef}, !*{# MemberDef}, !*{#DclModule}, !*TypeHeaps, !*VarHeap, !*CheckState)
determineTypesOfInstances first_memb_inst_index mod_index com_instance_defs com_class_defs com_member_defs
- modules type_heaps var_heap cs=:{cs_error}
+ modules type_heaps var_heap cs=:{cs_error, cs_x={x_main_dcl_module_n}}
| cs_error.ea_ok
#! nr_of_class_instances = size com_instance_defs
# (memb_inst_defs, next_mem_inst_index, all_class_specials, com_class_defs, com_member_defs, modules, com_instance_defs, type_heaps, var_heap, cs_error)
- = determine_types_of_instances 0 nr_of_class_instances first_memb_inst_index mod_index [] com_class_defs com_member_defs
+ = determine_types_of_instances x_main_dcl_module_n 0 nr_of_class_instances first_memb_inst_index mod_index [] com_class_defs com_member_defs
modules com_instance_defs type_heaps var_heap cs_error
= (memb_inst_defs, next_mem_inst_index, all_class_specials, com_instance_defs, com_class_defs,
com_member_defs, modules, type_heaps, var_heap, { cs & cs_error = cs_error })
= ([], first_memb_inst_index, [], com_instance_defs, com_class_defs, com_member_defs, modules, type_heaps, var_heap, cs)
where
- determine_types_of_instances :: !Index !Index !Index !Index ![ClassInstance] !v:{#ClassDef} !w:{#MemberDef}
+ determine_types_of_instances :: !Index !Index !Index !Index !Index ![ClassInstance] !v:{#ClassDef} !w:{#MemberDef}
!x:{#DclModule} !*{#ClassInstance} !*TypeHeaps !*VarHeap !*ErrorAdmin
-> (![FunType], !Index, ![ClassInstance], !v:{#ClassDef}, !w:{#MemberDef}, !x:{#DclModule}, !*{#ClassInstance}, !*TypeHeaps, !*VarHeap, !*ErrorAdmin)
- determine_types_of_instances inst_index next_class_inst_index next_mem_inst_index mod_index all_class_specials
+ determine_types_of_instances x_main_dcl_module_n inst_index next_class_inst_index next_mem_inst_index mod_index all_class_specials
class_defs member_defs modules instance_defs type_heaps var_heap error
| inst_index < size instance_defs
# (instance_def, instance_defs) = instance_defs![inst_index]
# {ins_class,ins_pos,ins_type,ins_specials} = instance_def
- ({class_members}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules
+ ({class_name, class_members}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules
class_size = size class_members
- (ins_members, memb_inst_defs1, member_defs, modules, type_heaps, var_heap)
- = determine_instance_symbols_and_types next_mem_inst_index 0 mod_index ins_class.glob_module class_size class_members
- ins_type ins_specials ins_pos member_defs modules type_heaps var_heap
+ (ins_members, memb_inst_defs1, member_defs, modules, type_heaps, var_heap, error)
+ = determine_instance_symbols_and_types x_main_dcl_module_n next_mem_inst_index 0 mod_index ins_class.glob_module class_size class_members
+ ins_type ins_specials class_name ins_pos member_defs modules type_heaps var_heap error
instance_def = { instance_def & ins_members = { member \\ member <- ins_members }}
(ins_specials, next_class_inst_index, all_class_specials, type_heaps, error)
= check_instance_specials mod_index instance_def inst_index ins_specials next_class_inst_index all_class_specials type_heaps error
(memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error)
- = determine_types_of_instances (inc inst_index) next_class_inst_index (next_mem_inst_index + class_size) mod_index all_class_specials
+ = determine_types_of_instances x_main_dcl_module_n (inc inst_index) next_class_inst_index (next_mem_inst_index + class_size) mod_index all_class_specials
class_defs member_defs modules { instance_defs & [inst_index] = { instance_def & ins_specials = ins_specials }} type_heaps var_heap error
= (memb_inst_defs1 ++ memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error)
= ([], next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error)
- determine_instance_symbols_and_types :: !Index !Index !Index !Index !Int !{#DefinedSymbol} !InstanceType !Specials !Position
- !w:{#MemberDef} !u:{#DclModule} !*TypeHeaps !*VarHeap
- -> (![DefinedSymbol], ![FunType], !w:{#MemberDef}, !u:{#DclModule}, !*TypeHeaps, !*VarHeap)
- determine_instance_symbols_and_types first_inst_index mem_offset module_index member_mod_index class_size class_members
- ins_type ins_specials ins_pos member_defs modules type_heaps var_heap
+ determine_instance_symbols_and_types :: !Index !Index !Index !Index !Index !Int !{#DefinedSymbol} !InstanceType !Specials Ident !Position
+ !w:{#MemberDef} !u:{#DclModule} !*TypeHeaps !*VarHeap !*ErrorAdmin
+ -> (![DefinedSymbol], ![FunType], !w:{#MemberDef}, !u:{#DclModule}, !*TypeHeaps, !*VarHeap, !.ErrorAdmin)
+ determine_instance_symbols_and_types x_main_dcl_module_n first_inst_index mem_offset module_index member_mod_index class_size class_members
+ ins_type ins_specials class_name ins_pos member_defs modules type_heaps var_heap cs_error
| mem_offset == class_size
- = ([], [], member_defs, modules, type_heaps, var_heap)
+ = ([], [], member_defs, modules, type_heaps, var_heap, cs_error)
# class_member = class_members.[mem_offset]
({me_symb,me_type,me_priority,me_class_vars}, member_defs, modules) = getMemberDef member_mod_index class_member.ds_index module_index member_defs modules
- (instance_type, new_ins_specials, type_heaps) = determineTypeOfMemberInstance me_type me_class_vars ins_type ins_specials type_heaps
+ (instance_type, new_ins_specials, type_heaps, Yes cs_error) = determineTypeOfMemberInstance me_type me_class_vars ins_type ins_specials type_heaps (Yes cs_error)
+ (_, modules, cs_error) = checkTopLevelKinds x_main_dcl_module_n False ins_pos class_name instance_type cDummyArray modules cs_error
(new_info_ptr, var_heap) = newPtr VI_Empty var_heap
inst_def = MakeNewFunctionType me_symb me_type.st_arity me_priority instance_type ins_pos new_ins_specials new_info_ptr
- (inst_symbols, memb_inst_defs, member_defs, modules, type_heaps, var_heap)
- = determine_instance_symbols_and_types first_inst_index (inc mem_offset) module_index member_mod_index
- class_size class_members ins_type ins_specials ins_pos member_defs modules type_heaps var_heap
- = ([{ class_member & ds_index = first_inst_index + mem_offset } : inst_symbols], [inst_def : memb_inst_defs], member_defs, modules, type_heaps, var_heap)
+ (inst_symbols, memb_inst_defs, member_defs, modules, type_heaps, var_heap, cs_error)
+ = determine_instance_symbols_and_types x_main_dcl_module_n first_inst_index (inc mem_offset) module_index member_mod_index
+ class_size class_members ins_type ins_specials class_name ins_pos member_defs modules type_heaps var_heap cs_error
+ = ([{ class_member & ds_index = first_inst_index + mem_offset } : inst_symbols], [inst_def : memb_inst_defs], member_defs, modules, type_heaps, var_heap, cs_error)
check_instance_specials :: !Index !ClassInstance !Index !Specials !Index ![ClassInstance] !*TypeHeaps !*ErrorAdmin
-> (!Specials, !Index, ![ClassInstance], !*TypeHeaps, !*ErrorAdmin)
@@ -617,7 +632,7 @@ where
= (SP_ContextTypes list_of_specials, next_inst_index, all_instances, type_heaps, error)
where
check_specials mod_index inst=:{ins_type} type_offset [ subst : substs ] list_of_specials next_inst_index all_instances type_heaps error
- # (special_type, type_heaps) = substituteInstanceType ins_type subst type_heaps
+ # (special_type, type_heaps, error) = substituteInstanceType ins_type subst type_heaps error
(spec_types, error) = checkAndCollectTypesOfContexts special_type.it_context error
special = { spec_index = { glob_module = mod_index, glob_object = next_inst_index }, spec_types = spec_types,
spec_vars = subst.ss_vars, spec_attrs = subst.ss_attrs }
@@ -638,6 +653,43 @@ where
= (tc_types, error)
+checkTopLevelKinds :: !Index !Bool !Position Ident !SymbolType n:{# CheckedTypeDef} !r:{# DclModule} !*ErrorAdmin
+ -> (!n:{# CheckedTypeDef}, !r:{# DclModule}, !*ErrorAdmin)
+checkTopLevelKinds x_main_dcl_module_n is_icl_module ins_pos class_ident st=:{st_args, st_result} type_defs modules cs_error
+ #! ok = all (\{at_type} -> kind_is_ok x_main_dcl_module_n is_icl_module type_defs modules 0 at_type) [st_result:st_args]
+ # cs_error
+ = case ok of
+ True
+ -> cs_error
+ _
+ # cs_error
+ = pushErrorAdmin (newPosition class_ident ins_pos) cs_error
+ cs_error
+ = checkError "" "instance types have wrong kind" cs_error
+ -> popErrorAdmin cs_error
+ = (type_defs, modules, cs_error)
+ where
+ kind_is_ok x_main_dcl_module_n is_icl_module type_defs modules demanded_kind type=:(TA {type_index={glob_object,glob_module}} args)
+ # {td_arity}
+ = if (glob_module==x_main_dcl_module_n && is_icl_module) type_defs.[glob_object]
+ modules.[glob_module].dcl_common.com_type_defs.[glob_object]
+ = demanded_kind == td_arity-length args
+ kind_is_ok _ _ _ modules 0 (_ --> _)
+ = True
+ kind_is_ok _ _ _ modules _ (_ :@: _)
+ = True
+ kind_is_ok _ _ _ _ 0 (TB _)
+ = True
+ kind_is_ok _ _ _ _ _ (GTV _)
+ = True
+ kind_is_ok _ _ _ _ _ (TV _)
+ = True
+ kind_is_ok _ _ _ _ _ (TQV _)
+ = True
+ kind_is_ok _ _ _ _ _ _
+ = False
+
+
consOptional (Yes thing) things
= [ thing : things]
@@ -2676,182 +2728,3 @@ possibly_write_expl_imports_of_main_dcl_mod_to_file imports_ikh dcl_modules cs
Yes {si_explicit}
-> writeExplImportsToFile "dcl.txt" si_explicit dcl_modules cs
-write_expl_imports_to_file file_name si_explicit dcl_modules cs
- | switch_port_to_new_syntax False True
- = abort "write_expl_imports_to_file is only used for portToNewSyntax"
- # (file, cs)
- = openFile file_name cs
- (dcl_modules, file)
- = foldSt (write_expl_import (flatten (map fst si_explicit))) (reverse si_explicit) (dcl_modules, file)
- = (dcl_modules, closeFile file cs)
-
-write_expl_import all_expl_imp_decls (declarations, _) (dcl_modules, file)
- # (declaration_strings, dcl_modules)
- = mapFilterYesSt (decl_to_opt_string all_expl_imp_decls) (reverse declarations) dcl_modules
- = (dcl_modules, fwriteNewSyntax declaration_strings file)
-
-// only for portToNewSyntax
-decl_to_opt_string all_expl_imp_decls decl=:{dcl_ident, dcl_index, dcl_kind=STE_Imported ste_kind def_mod_index}
- dcl_modules
- = imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index ste_kind def_mod_index
- dcl_modules
-decl_to_opt_string _ {dcl_ident, dcl_kind=STE_FunctionOrMacro _} dcl_modules
- = (Yes dcl_ident.id_name, dcl_modules)
-decl_to_opt_string all_expl_imp_decls decl dcl_modules
- = abort ("decl_to_opt_string failed"--->decl)
-
-// only for portToNewSyntax
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_Constructor def_mod_index
- dcl_modules
- = (No, dcl_modules)
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_Member def_mod_index
- dcl_modules
- = (No, dcl_modules)
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_DclFunction def_mod_index
- dcl_modules
- = (Yes dcl_ident.id_name, dcl_modules)
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_Class def_mod_index
- dcl_modules
- = (Yes ("class "+++dcl_ident.id_name+++"(..)"), dcl_modules)
-// AA..
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_Generic def_mod_index
- dcl_modules
- = (Yes ("generic "+++dcl_ident.id_name+++"(..)"), dcl_modules)
-// ..AA
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index (STE_Instance _) def_mod_index
- dcl_modules
- # ({ins_type}, dcl_modules)
- = dcl_modules![def_mod_index].dcl_common.com_instance_defs.[dcl_index]
- = (Yes ("instance "+++dcl_ident.id_name+++" "+++
- separated " " (map type_to_string ins_type.it_types)), dcl_modules)
-imported_decl_to_opt_string all_expl_imp_decls dcl_ident dcl_index STE_Type def_mod_index
- dcl_modules
- # ({td_rhs}, dcl_modules)
- = dcl_modules![def_mod_index].dcl_common.com_type_defs.[dcl_index]
- dcl_string
- = ":: "+++(case td_rhs of
- AlgType constructors
- -> dcl_ident.id_name+++constructor_bracket def_mod_index all_expl_imp_decls constructors
- RecordType _
- -> dcl_ident.id_name+++"{..}"
- _
- -> dcl_ident.id_name)
- = (Yes dcl_string, dcl_modules)
-
-// only for portToNewSyntax
-type_to_string (TA {type_name} _) = possibly_replace_predef_symbols type_name.id_name
-type_to_string (TB type) = toString type
-type_to_string (TV {tv_name}) = tv_name.id_name
-type_to_string x = abort ("bug nr 945 in module check"--->x)
-
-possibly_replace_predef_symbols s
- | s=="_list"
- = "[]"
- | s % (0,5) == "_tuple"
- = (toString ['(':repeatn ((toInt (s%(6, (size s) - 1))) - 1) ','])+++")"
- | s=="_array"
- = "{}"
- | s=="_!array"
- = "{!}"
- | s=="_#array"
- = "{#}"
- = s
-
-instance toString BasicType
- where
- toString BT_Int = "Int"
- toString BT_Char = "Char"
- toString BT_Real = "Real"
- toString BT_Bool = "Bool"
- toString BT_Dynamic = "Dynamic"
- toString BT_File = "File"
- toString BT_World = "World"
- toString _ = abort "bug nr 346 in module check"
-
-// only for portToNewSyntax
-separated _ []
- = ""
-separated separator [h:t]
- = foldl (\l r->l+++separator+++r) h t
-
-constructor_bracket def_mod_index all_expl_imp_decls constructors
- # expl_imp_constructor_strings
- = [ ds_ident.id_name \\ {ds_ident} <- constructors
- | is_expl_imported_constructor def_mod_index ds_ident all_expl_imp_decls ]
- | isEmpty expl_imp_constructor_strings
- = ""
- = "("+++separated "," expl_imp_constructor_strings+++")"
-
-// only for portToNewSyntax
-is_expl_imported_constructor def_mod_index ds_ident []
- = False
-is_expl_imported_constructor def_mod_index ds_ident [{dcl_ident, dcl_kind=STE_Imported STE_Constructor def_mod_index2}:_]
- | dcl_ident==ds_ident && def_mod_index==def_mod_index2
- = True
- // GOTO next alternative
-is_expl_imported_constructor def_mod_index ds_ident [h:t]
- = is_expl_imported_constructor def_mod_index ds_ident t
-
-fwriteNewSyntax importStrings file
- | isEmpty importStrings
- = fwrites "import @#$@@!!" file
- # with_commas = (map (\s->s+++", ") (butLast importStrings))++[last importStrings+++";"]
- lines = split_in_lines 12 with_commas [] []
- lines = [hd lines:[["\t":line]\\ line<-tl lines]]
- line_strings = [ foldl (+++) " " (line++["\n"]) \\ line<-lines ]
- = fwrites (foldl (+++) "import" line_strings) file
- where
- max_line_length = 80
- split_in_lines i [] inner_accu outer_accu
- # accu = if (isEmpty inner_accu) outer_accu [reverse inner_accu:outer_accu]
- = reverse accu
- split_in_lines i [h:t] inner_accu outer_accu
- # s = size h
- | s+i>max_line_length
- | isEmpty inner_accu
- = split_in_lines (s+i) t [h] outer_accu
- = split_in_lines (s+cTabWidth) t [h] [inner_accu:outer_accu]
- = split_in_lines (s+i) t [h:inner_accu] outer_accu
-// only for portToNewSyntax
-
-butLast [] = []
-butLast [x] = []
-butLast [h:t] = [h: butLast t]
-
-// MW: fake..
-openFile file_name cs
- # world = bigBang
- (ok, newFile, world) = fopen file_name FWriteText world
- cs = forget world cs
- cs = case ok of
- True -> cs
- _ # cs_error = checkError "" ("can't open file \""+++file_name+++" in current directory.") cs.cs_error
- -> { cs & cs_error=cs_error }
- = (newFile, cs)
-
-closeFile file cs
- # world = bigBang
- (ok, world) = fclose file world
- = forget world cs
-
-bigBang :: .World
-bigBang = cast 1
-// creates a world from scratch
-
-forget :: !.x !.y -> .y
-forget x y = y
-
-cast :: !.a -> .b
-cast a
- = code
- {
- pop_a 0
- }
-// ..fake
-// END only for portToNewSyntax
-// END only for portToNewSyntax
-// END only for portToNewSyntax
-// END only for portToNewSyntax
-// END only for portToNewSyntax
-// END only for portToNewSyntax
-// END only for portToNewSyntax