Type* List__append_specializeType(Term* term) { Term* listInput = term->input(0); switch (list_get_parameter_type(&listInput->type->parameter)) { case sym_Untyped: return listInput->type; case sym_UniformListType: { Type* listElementType = list_get_repeated_type_from_type(listInput->type); Type* commonType = find_common_type(listElementType, term->input(1)->type); if (commonType == listElementType) return listInput->type; else return create_typed_unsized_list_type(commonType); } case sym_AnonStructType: case sym_StructType: { List elementTypes; copy(list_get_type_list_from_type(listInput->type), &elementTypes); set_type(elementTypes.append(), term->input(1)->type); return create_typed_unsized_list_type(find_common_type(&elementTypes)); } case sym_Invalid: default: return TYPES.any; } }
Type* infer_type_of_get_index(Term* input) { if (input == NULL) return &ANY_T; switch (list_get_parameter_type(&input->type->parameter)) { case LIST_UNTYPED: return &ANY_T; case LIST_TYPED_UNSIZED: return list_get_repeated_type_from_type(input->type); case LIST_TYPED_SIZED: case LIST_TYPED_SIZED_NAMED: return find_common_type(list_get_type_list_from_type(input->type)); case LIST_INVALID_PARAMETER: default: return &ANY_T; } }
Type* infer_type_of_get_index(Term* input) { if (input == NULL) return TYPES.any; switch (list_get_parameter_type(&input->type->parameter)) { case name_Untyped: return TYPES.any; case name_UniformListType: return list_get_repeated_type_from_type(input->type); case name_StructType: case name_AnonStructType: return find_common_type(list_get_type_list_from_type(input->type)); case name_Invalid: default: return TYPES.any; } }