diff options
-rw-r--r-- | frontend/analtypes.icl | 207 |
1 files changed, 97 insertions, 110 deletions
diff --git a/frontend/analtypes.icl b/frontend/analtypes.icl index 619426d..a0a40ad 100644 --- a/frontend/analtypes.icl +++ b/frontend/analtypes.icl @@ -1,7 +1,7 @@ implementation module analtypes import StdEnv -import syntax, checksupport, checktypes, check, typesupport, utilities, analunitypes //, RWSDebug +import syntax, checksupport, checktypes, check, typesupport, utilities, analunitypes :: TypeGroups :== [[GlobalIndex]] @@ -360,7 +360,6 @@ where = (info_ptr == kind_info_ptr, kind_heap) contains_kind_ptr info_ptr (KI_Const) kind_heap = (False, kind_heap) - unify_kinds kind k1=:(KI_Var info_ptr1) uni_info = unify_kinds k1 kind uni_info unify_kinds kind1=:(KI_Arrow x1 y1) kind2=:(KI_Arrow x2 y2) uni_info @@ -370,7 +369,6 @@ where unify_kinds kind1 kind2 uni_info=:{uki_error} = { uni_info & uki_error = kindError kind1 kind2 uki_error } - kindToKindInfo (KindVar info_ptr) = KI_Var info_ptr kindToKindInfo KindConst @@ -472,23 +470,24 @@ analTypes_for_TA type_ident glob_module glob_object type_arity types has_root_at where anal_types_of_rec_type_cons modules form_tvs [] _ conds_as = (cIsHyperStrict, conds_as) - anal_types_of_rec_type_cons modules form_tvs [type : types] [(KindVar kind_info_ptr) : tvs] conds_as + anal_types_of_rec_type_cons modules form_tvs [type : types] [KindVar kind_info_ptr : tvs] conds_as # (type_kind, type_props, (conds, as=:{as_kind_heap,as_error})) = analTypes has_root_attr modules [ kind_info_ptr : form_tvs ] type conds_as (kind, as_kind_heap) = readPtr kind_info_ptr as_kind_heap {uki_kind_heap, uki_error} = unifyKinds type_kind kind {uki_kind_heap = as_kind_heap, uki_error = as_error} | is_type_var type - # (other_type_props, conds_as) = anal_types_of_rec_type_cons modules form_tvs types tvs - (conds, { as & as_kind_heap = uki_kind_heap, as_error = uki_error }) + # (other_type_props, conds_as) + = anal_types_of_rec_type_cons modules form_tvs types tvs (conds, {as & as_kind_heap = uki_kind_heap, as_error = uki_error}) = (combineTypeProperties type_props other_type_props, conds_as) - # (other_type_props, conds_as) = anal_types_of_rec_type_cons modules form_tvs types tvs - ({ conds & con_top_var_binds = [kind_info_ptr : conds.con_top_var_binds]}, { as & as_kind_heap = uki_kind_heap, as_error = uki_error }) + # conds & con_top_var_binds = [kind_info_ptr : conds.con_top_var_binds] + # (other_type_props, conds_as) + = anal_types_of_rec_type_cons modules form_tvs types tvs (conds, {as & as_kind_heap = uki_kind_heap, as_error = uki_error}) = (combineTypeProperties type_props other_type_props, conds_as) where is_type_var {at_type = TV _} = True is_type_var _ = False - + anal_types_of_type_cons modules form_tvs [] _ conds_as = (cIsHyperStrict, conds_as) anal_types_of_type_cons modules form_tvs [type : types] [tk : tks] conds_as @@ -547,17 +546,9 @@ where (tks, is_non_coercible, conds_as) = check_type_list kind_var modules form_tvs types conds_as = (KI_Arrow tk tks, is_non_coercible || (type_props bitand cIsNonCoercible <> 0), conds_as) analTypes has_root_attr modules form_tvs (TFA vars type) (conds, as=:{as_type_var_heap,as_kind_heap}) - # (as_type_var_heap, as_kind_heap) = new_local_kind_variables vars as_type_var_heap as_kind_heap - = analTypes has_root_attr modules form_tvs type (conds, { as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap}) - where - new_local_kind_variables :: [ATypeVar] !*TypeVarHeap !*KindHeap -> (!*TypeVarHeap,!*KindHeap) - new_local_kind_variables type_vars type_var_heap as_kind_heap - = foldSt new_kind type_vars (type_var_heap, as_kind_heap) - where - new_kind :: !ATypeVar !(!*TypeVarHeap,!*KindHeap) -> (!*TypeVarHeap,!*KindHeap) - new_kind {atv_variable={tv_info_ptr}} (type_var_heap, kind_heap) - # (kind_info_ptr, kind_heap) = newPtr KI_Const kind_heap - = ( type_var_heap <:= (tv_info_ptr, TVI_TypeKind kind_info_ptr), kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr)) + # (as_type_var_heap, as_kind_heap) = new_local_kind_variables_for_universal_vars vars as_type_var_heap as_kind_heap + as = {as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} + = analTypes has_root_attr modules form_tvs type (conds,as) analTypes has_root_attr modules form_tvs type conds_as = (KI_Const, cIsHyperStrict, conds_as) @@ -603,8 +594,7 @@ where cons_props = if (arg_is_strict strictness_index args_strictness) (combineTypeProperties cv_props other_type_props) (combineCoercionProperties cv_props other_type_props) - = (cons_props, (conds, { as & as_kind_heap = uki_kind_heap, as_error = uki_error })) -// ---> ("anal_types_of_cons", type) + = (cons_props, (conds, {as & as_kind_heap = uki_kind_heap, as_error = uki_error})) isATopConsVar cv :== cv < 0 encodeTopConsVar cv :== dec (~cv) @@ -612,61 +602,61 @@ decodeTopConsVar cv :== ~(inc cv) emptyIdent name :== { id_name = name, id_info = nilPtr } -newKindVariables td_args (type_var_heap, as_kind_heap) - = mapSt new_kind td_args (type_var_heap, as_kind_heap) -where - new_kind :: ATypeVar *(*TypeVarHeap,*KindHeap) -> (!.TypeKind,!(!*TypeVarHeap,!*KindHeap)); - new_kind {atv_variable={tv_info_ptr}} (type_var_heap, kind_heap) - # (kind_info_ptr, kind_heap) = newPtr KI_Const kind_heap - = (KindVar kind_info_ptr, (type_var_heap <:= (tv_info_ptr, TVI_TypeKind kind_info_ptr), kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr))) - analyseTypeDefs :: !{#CommonDefs} !TypeGroups !{#CheckedTypeDef} !Int !*TypeDefInfos !*TypeVarHeap !*ErrorAdmin - -> (!*TypeDefInfos, !*TypeVarHeap, !*ErrorAdmin) + -> (!*TypeDefInfos,!*TypeVarHeap,!*ErrorAdmin) analyseTypeDefs modules groups dcl_types dcl_mod_index type_def_infos type_var_heap error - # as = { as_kind_heap = newHeap, as_type_var_heap = type_var_heap, as_td_infos = type_def_infos, as_error = error } + # as = {as_kind_heap = newHeap, as_type_var_heap = type_var_heap, as_td_infos = type_def_infos, as_error = error} {as_td_infos,as_type_var_heap,as_error} = foldSt (anal_type_defs_in_group modules) groups as = check_left_root_attribution_of_typedefs modules groups as_td_infos as_type_var_heap as_error where anal_type_defs_in_group modules group as=:{as_td_infos,as_type_var_heap,as_kind_heap} # (is_abstract_type, as_td_infos, as_type_var_heap, as_kind_heap) = foldSt (init_type_def_infos modules) group (False, as_td_infos, as_type_var_heap, as_kind_heap) - as = { as & as_td_infos = as_td_infos, as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap } + as = {as & as_td_infos = as_td_infos, as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} | is_abstract_type = as - # (type_properties, conds, as) = foldSt (anal_type_def modules) group (cIsHyperStrict, { con_top_var_binds = [], con_var_binds = [] }, as) + # (type_properties, conds, as) = foldSt (anal_type_def modules) group (cIsHyperStrict, {con_top_var_binds = [], con_var_binds = []}, as) (kinds_in_group, (as_kind_heap, as_td_infos)) = mapSt determine_kinds group (as.as_kind_heap, as.as_td_infos) - as_kind_heap = unify_var_binds conds.con_var_binds as_kind_heap + as_kind_heap = unify_var_binds conds.con_var_binds as_kind_heap (normalized_top_vars, (kind_var_store, as_kind_heap)) = normalize_top_vars conds.con_top_var_binds 0 as_kind_heap - (as_kind_heap, as_td_infos) = update_type_def_infos modules type_properties normalized_top_vars group - kinds_in_group kind_var_store as_kind_heap as_td_infos - as = { as & as_kind_heap = as_kind_heap, as_td_infos = as_td_infos } - as = foldSt (check_dcl_properties modules dcl_types dcl_mod_index type_properties) group as - = as + (as_kind_heap, as_td_infos) + = update_type_def_infos modules type_properties normalized_top_vars group kinds_in_group kind_var_store as_kind_heap as_td_infos + as & as_kind_heap = as_kind_heap, as_td_infos = as_td_infos + = foldSt (check_dcl_properties modules dcl_types dcl_mod_index type_properties) group as init_type_def_infos modules gi=:{gi_module,gi_index} (is_abstract_type, type_def_infos, as_type_var_heap, kind_heap) # {td_args,td_rhs} = modules.[gi_module].com_type_defs.[gi_index] = case td_rhs of AbstractType properties - # (tdi, type_def_infos) = type_def_infos![gi_module,gi_index] - new_tdi = { tdi & tdi_kinds = [ KindConst \\ _ <- td_args ], - tdi_group_vars = [ i \\ _ <- td_args & i <- [0..]], - tdi_properties = properties bitor cIsAnalysed } - -> (True, { type_def_infos & [gi_module].[gi_index] = new_tdi}, as_type_var_heap, kind_heap) + # type_def_infos = init_abstract_type_def properties td_args gi_module gi_index type_def_infos + -> (True, type_def_infos, as_type_var_heap, kind_heap) AbstractSynType properties _ - # (tdi, type_def_infos) = type_def_infos![gi_module,gi_index] - new_tdi = { tdi & tdi_kinds = [ KindConst \\ _ <- td_args ], - tdi_group_vars = [ i \\ _ <- td_args & i <- [0..]], - tdi_properties = properties bitor cIsAnalysed } - -> (True, { type_def_infos & [gi_module].[gi_index] = new_tdi}, as_type_var_heap, kind_heap) + # type_def_infos = init_abstract_type_def properties td_args gi_module gi_index type_def_infos + -> (True, type_def_infos, as_type_var_heap, kind_heap) _ # (tdi_kinds, (as_type_var_heap, kind_heap)) = newKindVariables td_args (as_type_var_heap, kind_heap) - -> (is_abstract_type, { type_def_infos & [gi_module].[gi_index].tdi_kinds = tdi_kinds }, as_type_var_heap, kind_heap) + -> (is_abstract_type, {type_def_infos & [gi_module].[gi_index].tdi_kinds = tdi_kinds}, as_type_var_heap, kind_heap) + + init_abstract_type_def properties td_args gi_module gi_index type_def_infos + # (tdi, type_def_infos) = type_def_infos![gi_module,gi_index] + new_tdi = { tdi & tdi_kinds = [ KindConst \\ _ <- td_args ], + tdi_group_vars = [ i \\ _ <- td_args & i <- [0..]], + tdi_properties = properties bitor cIsAnalysed } + = {type_def_infos & [gi_module].[gi_index] = new_tdi} + + newKindVariables td_args (type_var_heap, as_kind_heap) + = mapSt new_kind td_args (type_var_heap, as_kind_heap) + where + new_kind :: ATypeVar *(*TypeVarHeap,*KindHeap) -> (!TypeKind,!(!*TypeVarHeap,!*KindHeap)); + new_kind {atv_variable={tv_info_ptr}} (type_var_heap, kind_heap) + # (kind_info_ptr, kind_heap) = newPtr KI_Const kind_heap + = (KindVar kind_info_ptr, (type_var_heap <:= (tv_info_ptr, TVI_TypeKind kind_info_ptr), kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr))) anal_type_def modules gi=:{gi_module,gi_index} (group_properties, conds, as=:{as_error}) # {com_type_defs,com_cons_defs} = modules.[gi_module] {td_ident,td_pos,td_args,td_rhs} = com_type_defs.[gi_index] as_error = pushErrorAdmin (newPosition td_ident td_pos) as_error - (type_properties, (conds, as)) = anal_rhs_of_type_def modules com_cons_defs td_rhs (conds, { as & as_error = as_error }) + (type_properties, (conds, as)) = anal_rhs_of_type_def modules com_cons_defs td_rhs (conds, {as & as_error = as_error}) = (combineTypeProperties group_properties type_properties, conds, {as & as_error = popErrorAdmin as.as_error }) where anal_rhs_of_type_def modules com_cons_defs (AlgType conses) conds_as @@ -676,7 +666,7 @@ where anal_rhs_of_type_def modules _ (SynType type) conds_as # (type_kind, cv_props, (conds, as=:{as_kind_heap, as_error})) = analTypes True /* cDummyBool */ modules [] type.at_type conds_as {uki_kind_heap, uki_error} = unifyKinds type_kind KI_Const {uki_kind_heap = as_kind_heap, uki_error = as_error} - = (cv_props, (conds, { as & as_kind_heap = uki_kind_heap, as_error = uki_error })) + = (cv_props, (conds, {as & as_kind_heap = uki_kind_heap, as_error = uki_error})) anal_rhs_of_type_def modules com_cons_defs (NewType cons) conds_as = analTypesOfConstructor modules com_cons_defs cons conds_as @@ -714,13 +704,13 @@ where determine_var_bind kind_info_ptr kind_info kind_heap = (kind_info_ptr, kind_heap) - nomalize_var :: !KindInfoPtr !KindInfo !(!Int,!*KindHeap) -> (!Int,!(!Int,!*KindHeap)) - nomalize_var orig_kind_info (KI_VarBind kind_info_ptr) (kind_store, kind_heap) + normalize_var :: !KindInfoPtr !KindInfo !(!Int,!*KindHeap) -> (!Int,!(!Int,!*KindHeap)) + normalize_var orig_kind_info (KI_VarBind kind_info_ptr) (kind_store, kind_heap) # (kind_info, kind_heap) = readPtr kind_info_ptr kind_heap - = nomalize_var kind_info_ptr kind_info (kind_store, kind_heap) - nomalize_var kind_info_ptr (KI_NormVar var_number) (kind_store, kind_heap) + = normalize_var kind_info_ptr kind_info (kind_store, kind_heap) + normalize_var kind_info_ptr (KI_NormVar var_number) (kind_store, kind_heap) = (var_number, (kind_store, kind_heap)) - nomalize_var kind_info_ptr kind (kind_store, kind_heap) + normalize_var kind_info_ptr kind (kind_store, kind_heap) = (kind_store, (inc kind_store, writePtr kind_info_ptr (KI_NormVar kind_store) kind_heap)) normalize_top_vars top_vars kind_store kind_heap @@ -729,36 +719,35 @@ where normalize_top_var :: !KindInfoPtr !(!Int,!*KindHeap) -> (!Int,!(!Int,!*KindHeap)) normalize_top_var kind_info_ptr (kind_store, kind_heap) # (kind_info, kind_heap) = readPtr kind_info_ptr kind_heap - = nomalize_var kind_info_ptr kind_info (kind_store, kind_heap) - + = normalize_var kind_info_ptr kind_info (kind_store, kind_heap) + update_type_def_infos modules type_properties top_vars group updated_kinds_of_group kind_store kind_heap td_infos - # (_, as_kind_heap, as_td_infos) = fold2St (update_type_def_info modules (type_properties bitor cIsAnalysed) top_vars) group updated_kinds_of_group (kind_store, kind_heap, td_infos) - = (as_kind_heap, as_td_infos) + # (_,as_kind_heap,as_td_infos) = fold2St (update_type_def_info modules (type_properties bitor cIsAnalysed) top_vars) group updated_kinds_of_group (kind_store, kind_heap, td_infos) + = (as_kind_heap,as_td_infos) where update_type_def_info modules type_properties top_vars {gi_module,gi_index} updated_kinds - (kind_store, kind_heap, td_infos) -// # {com_type_defs} = modules.[gi_module] -// {td_ident} = com_type_defs.[gi_index] - # (td_info=:{tdi_kinds}, td_infos) = td_infos![gi_module].[gi_index] // ---> ("update_type_def_info", td_ident, type_properties) + (kind_store,kind_heap,td_infos) + # (td_info=:{tdi_kinds}, td_infos) = td_infos![gi_module].[gi_index] # (group_vars, cons_vars, kind_store, kind_heap) = determine_type_def_info tdi_kinds updated_kinds top_vars kind_store kind_heap - = (kind_store, kind_heap, { td_infos & [gi_module,gi_index] = - {td_info & tdi_properties = type_properties, tdi_kinds = updated_kinds, tdi_group_vars = group_vars, tdi_cons_vars = cons_vars }}) + # td_info & tdi_properties = type_properties, tdi_kinds = updated_kinds, tdi_group_vars = group_vars, tdi_cons_vars = cons_vars + #! td_infos & [gi_module,gi_index] = td_info + = (kind_store, kind_heap, td_infos) - determine_type_def_info [ KindVar kind_info_ptr : kind_vars ] [ kind : kinds ] top_vars kind_store kind_heap + determine_type_def_info [KindVar kind_info_ptr : kind_vars] [kind : kinds] top_vars kind_store kind_heap # (kind_info, kind_heap) = readPtr kind_info_ptr kind_heap - # (var_number, (kind_store, kind_heap)) = nomalize_var kind_info_ptr kind_info (kind_store, kind_heap) + # (var_number, (kind_store, kind_heap)) = normalize_var kind_info_ptr kind_info (kind_store, kind_heap) (group_vars, cons_vars, kind_store, kind_heap) = determine_type_def_info kind_vars kinds top_vars kind_store kind_heap = case kind of KindArrow _ | is_a_top_var var_number top_vars - -> ([ var_number : group_vars ], [ encodeTopConsVar var_number : cons_vars ], kind_store, kind_heap) - -> ([ var_number : group_vars ], [ var_number : cons_vars ], kind_store, kind_heap) + -> ([var_number : group_vars], [encodeTopConsVar var_number : cons_vars], kind_store, kind_heap) + -> ([var_number : group_vars], [var_number : cons_vars], kind_store, kind_heap) _ - -> ([ var_number : group_vars ], cons_vars, kind_store, kind_heap) + -> ([var_number : group_vars], cons_vars, kind_store, kind_heap) determine_type_def_info [] [] top_vars kind_store kind_heap = ([], [], kind_store, kind_heap) - is_a_top_var var_number [ top_var_number : top_var_numbers] + is_a_top_var var_number [top_var_number : top_var_numbers] = var_number == top_var_number || is_a_top_var var_number top_var_numbers is_a_top_var var_number [] = False @@ -776,17 +765,16 @@ where with check_abstract_type spec_properties td_ident td_args td_pos as # as_error = pushErrorAdmin (newPosition td_ident td_pos) as.as_error - | check_coercibility spec_properties properties -// ---> ("check_coercibility", td_ident, spec_properties, properties) + | check_coercibility spec_properties properties | check_hyperstrictness spec_properties properties | spec_properties bitand cIsNonCoercible == 0 # (as_type_var_heap, as_td_infos, as_error) = check_positive_sign gi_module gi_index modules td_args as.as_type_var_heap as.as_td_infos as_error = {as & as_type_var_heap = as_type_var_heap, as_td_infos = as_td_infos, as_error = popErrorAdmin as_error} = {as & as_error = popErrorAdmin as_error} - # as_error = checkError "abstract type as defined in the implementation module is not hyperstrict" "" as_error - = { as & as_error = popErrorAdmin as_error } - # as_error = checkError "abstract type as defined in the implementation module is not coercible" "" as_error - = { as & as_error = popErrorAdmin as_error } + # as_error = checkError "abstract type as defined in the implementation module is not hyperstrict" "" as_error + = {as & as_error = popErrorAdmin as_error} + # as_error = checkError "abstract type as defined in the implementation module is not coercible" "" as_error + = {as & as_error = popErrorAdmin as_error} = as where check_coercibility dcl_props icl_props @@ -794,7 +782,7 @@ where check_hyperstrictness dcl_props icl_props = dcl_props bitand cIsHyperStrict == 0 || icl_props bitand cIsHyperStrict > 0 - + check_positive_sign mod_index type_index modules td_args type_var_heap type_def_infos error # top_signs = [ TopSignClass \\ _ <- td_args ] # (signs, type_var_heap, type_def_infos) = signClassification type_index mod_index top_signs modules type_var_heap type_def_infos @@ -802,11 +790,9 @@ where = (type_var_heap, type_def_infos, error) # error = checkError "signs of abstract type variables should be positive" "" error = (type_var_heap, type_def_infos, error) - check_left_root_attribution_of_typedefs modules groups type_def_infos type_var_heap error - # (type_def_infos, type_var_heap, error) = foldSt (foldSt (checkLeftRootAttributionOfTypeDef modules)) groups (type_def_infos, type_var_heap, error) - = (type_def_infos, type_var_heap, error) + = foldSt (foldSt (checkLeftRootAttributionOfTypeDef modules)) groups (type_def_infos, type_var_heap, error) cDummyConditions =: { con_top_var_binds = [], con_var_binds = []} @@ -839,11 +825,11 @@ where determine_kinds_type_list :: !{#CommonDefs} [AType] !*AnalyseState -> *AnalyseState determine_kinds_type_list modules types as = foldSt (force_star_kind modules) types as -where - force_star_kind modules type as - # (off_kind, as=:{as_kind_heap,as_error}) = determineKind modules type as - {uki_kind_heap, uki_error} = unifyKinds off_kind KI_Const {uki_kind_heap = as_kind_heap, uki_error = as_error} - = { as & as_kind_heap = uki_kind_heap, as_error = uki_error } + +force_star_kind modules type as + # (off_kind, as=:{as_kind_heap,as_error}) = determineKind modules type as + {uki_kind_heap, uki_error} = unifyKinds off_kind KI_Const {uki_kind_heap = as_kind_heap, uki_error = as_error} + = { as & as_kind_heap = uki_kind_heap, as_error = uki_error } class_def_error = "cyclic dependencies between type classes" type_appl_error = "type constructor has too many arguments" @@ -907,8 +893,7 @@ where # (kind_info_ptr, kind_heap) = newPtr KI_Const kind_heap = fresh_kind_vars (dec nr_of_vars) [ kind_info_ptr : fresh_vars] (kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr)) = (fresh_vars, kind_heap) - - + isCyclicClass [ KindCycle : _ ] = True isCyclicClass _ = False @@ -965,6 +950,15 @@ where # (kind_info, kind_heap) = readPtr kind_info_ptr kind_heap = kindInfoToKind kind_info kind_heap +new_local_kind_variables_for_universal_vars :: [ATypeVar] !*TypeVarHeap !*KindHeap -> (!*TypeVarHeap,!*KindHeap) +new_local_kind_variables_for_universal_vars type_vars type_var_heap as_kind_heap + = foldSt new_kind type_vars (type_var_heap, as_kind_heap) + where + new_kind :: !ATypeVar !(!*TypeVarHeap,!*KindHeap) -> (!*TypeVarHeap,!*KindHeap) + new_kind {atv_variable={tv_info_ptr}} (type_var_heap, kind_heap) + # (kind_info_ptr, kind_heap) = newPtr KI_Const kind_heap + = (type_var_heap <:= (tv_info_ptr, TVI_TypeKind kind_info_ptr), kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr)) + bindFreshKindVariablesToTypeVars :: [TypeVar] !*TypeVarHeap !*KindHeap -> (!*TypeVarHeap,!*KindHeap) bindFreshKindVariablesToTypeVars type_vars type_var_heap as_kind_heap = foldSt new_kind type_vars (type_var_heap, as_kind_heap) @@ -1079,14 +1073,13 @@ where = {as & as_error = as_error, as_td_infos = as_td_infos} where rank_of_kind KindConst = 0 - rank_of_kind (KindArrow kinds) = 1 + foldr max 0 (map rank_of_kind kinds) - + rank_of_kind (KindArrow kinds) = 1 + foldr max 0 (map rank_of_kind kinds) check_kinds_of_gencase gencase as = as check_kinds_of_icl_fuction common_defs fun_index (icl_fun_defs, class_infos, expression_heap, as) # ({fun_type,fun_ident,fun_info,fun_pos}, icl_fun_defs) = icl_fun_defs![fun_index] - (expression_heap, as) = check_kinds_of_dynamics common_defs fun_info.fi_dynamics expression_heap as + (expression_heap,as) = check_kinds_of_dynamics common_defs fun_info.fi_dynamics expression_heap as = case fun_type of Yes symbol_type # as_error = pushErrorAdmin (newPosition fun_ident fun_pos) as.as_error @@ -1104,14 +1097,14 @@ where check_kinds_of_dcl_fuction common_defs dcl_functions fun_index (class_infos, as) # {ft_type,ft_ident,ft_pos} = dcl_functions.[fun_index] as_error = pushErrorAdmin (newPosition ft_ident ft_pos) as.as_error - (class_infos, as) = check_kinds_of_symbol_type common_defs ft_type class_infos - { as & as_error = as_error } + (class_infos, as) = check_kinds_of_symbol_type common_defs ft_type class_infos {as & as_error = as_error} = (class_infos, { as & as_error = popErrorAdmin as.as_error}) check_kinds_of_symbol_type :: !{#CommonDefs} !SymbolType !*ClassDefInfos !*AnalyseState -> (!*ClassDefInfos, !*AnalyseState) check_kinds_of_symbol_type common_defs {st_vars,st_result,st_args,st_context} class_infos as=:{as_type_var_heap,as_kind_heap} # (as_type_var_heap, as_kind_heap) = bindFreshKindVariablesToTypeVars st_vars as_type_var_heap as_kind_heap - as = determine_kinds_type_list common_defs [st_result:st_args] { as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} + as = {as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} + as = determine_kinds_type_list common_defs [st_result:st_args] as = determine_kinds_of_type_contexts common_defs st_context class_infos as check_kinds_of_dynamics :: {#CommonDefs} [DynamicPtr] *ExpressionHeap *AnalyseState -> (*ExpressionHeap, *AnalyseState) @@ -1119,21 +1112,18 @@ where = foldSt (check_kinds_of_dynamic common_defs) dynamic_ptrs (expr_heap, as) where check_kinds_of_dynamic :: {#CommonDefs} DynamicPtr (*ExpressionHeap, *AnalyseState) -> (*ExpressionHeap, *AnalyseState) - check_kinds_of_dynamic common_defs dynamic_ptr (expr_heap, as) + check_kinds_of_dynamic common_defs dynamic_ptr (expr_heap,as) # (dynamic_info, expr_heap) = readPtr dynamic_ptr expr_heap - (expr_heap, as) = check_kinds_of_dynamic_info common_defs dynamic_info (expr_heap, as) - = (expr_heap, as) + = check_kinds_of_dynamic_info common_defs dynamic_info (expr_heap, as) check_kinds_of_dynamic_info :: {#CommonDefs} ExprInfo (*ExpressionHeap, *AnalyseState) -> (*ExpressionHeap, *AnalyseState) check_kinds_of_dynamic_info common_defs (EI_Dynamic opt_type locals) (expr_heap, as) # as = check_kinds_of_opt_dynamic_type common_defs opt_type as - (expr_heap, as) = check_kinds_of_dynamics common_defs locals expr_heap as - = (expr_heap, as) + = check_kinds_of_dynamics common_defs locals expr_heap as check_kinds_of_dynamic_info common_defs (EI_DynamicTypeWithVars vars type locals) (expr_heap, as=:{as_type_var_heap,as_kind_heap}) # (as_type_var_heap, as_kind_heap) = bindFreshKindVariablesToTypeVars vars as_type_var_heap as_kind_heap as = check_kinds_of_dynamic_type common_defs type { as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} - (expr_heap, as) = check_kinds_of_dynamics common_defs locals expr_heap as - = (expr_heap, as) + = check_kinds_of_dynamics common_defs locals expr_heap as check_kinds_of_opt_dynamic_type :: {#CommonDefs} (Optional DynamicType) *AnalyseState -> *AnalyseState check_kinds_of_opt_dynamic_type common_defs (Yes type) as @@ -1143,9 +1133,7 @@ where check_kinds_of_dynamic_type :: {#CommonDefs} DynamicType *AnalyseState -> *AnalyseState check_kinds_of_dynamic_type common_defs {dt_type, dt_uni_vars, dt_global_vars} as=:{as_type_var_heap,as_kind_heap} - # (as_type_var_heap, as_kind_heap) - = bindFreshKindVariablesToTypeVars [atv_variable \\ {atv_variable} <- dt_uni_vars] - as_type_var_heap as_kind_heap + # (as_type_var_heap, as_kind_heap) = bindFreshKindVariablesToTypeVars [atv_variable \\ {atv_variable} <- dt_uni_vars] as_type_var_heap as_kind_heap (as_type_var_heap, as_kind_heap) = bindFreshKindVariablesToTypeVars dt_global_vars as_type_var_heap as_kind_heap = determine_kinds_type_list common_defs [dt_type] { as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap} @@ -1169,7 +1157,7 @@ checkLeftRootAttributionOfTypeDef common_defs {gi_module,gi_index} (td_infos, th = (td_infos, th_vars, checkErrorWithIdentPos (newPosition td_ident td_pos) " left root * attribute expected" error) = (td_infos, th_vars, error) - + isUniqueTypeRhs common_defs mod_index (AlgType constructors) state = has_unique_constructor constructors common_defs mod_index state isUniqueTypeRhs common_defs mod_index (SynType rhs) state @@ -1215,8 +1203,7 @@ instance isUnique Type isUnique_for_TA :: Int Int [AType] !{# CommonDefs} !*TypeDefInfos !*TypeVarHeap -> (!Bool, !(!*TypeDefInfos, !*TypeVarHeap)) isUnique_for_TA glob_module glob_object type_args common_defs td_infos th_vars - # type_def - = common_defs.[glob_module].com_type_defs.[glob_object] + # type_def = common_defs.[glob_module].com_type_defs.[glob_object] | isUniqueAttr type_def.td_attribute = (True, (td_infos, th_vars)) # (prop_classification, th_vars, td_infos) |