diff --git a/compiler/shared_ast/renaming.ml b/compiler/shared_ast/renaming.ml index a310fabc..ba3113e2 100644 --- a/compiler/shared_ast/renaming.ml +++ b/compiler/shared_ast/renaming.ml @@ -340,33 +340,45 @@ let program let pctxmap, enums_map, constrs_map, ctx_enums = EnumName.Map.fold (fun name constrs (pctxmap, enums_map, constrs_map, ctx_enums) -> - let path = EnumName.path name in - let str, pos = EnumName.get_info name in - let pctxmap, ctx = - try pctxmap, PathMap.find path pctxmap - with Not_found -> PathMap.add path ctx pctxmap, ctx - in - let id, ctx = new_id ctx (f_enum str) in - let new_name = EnumName.fresh path (id, pos) in - let ctx1, constrs_map, ctx_constrs = - EnumConstructor.Map.fold - (fun name ty (ctx, constrs_map, ctx_constrs) -> - let str, pos = EnumConstructor.get_info name in - let id, ctx = new_id ctx (f_constr str) in - let new_name = EnumConstructor.fresh (id, pos) in - ( ctx, - EnumConstructor.Map.add name new_name constrs_map, - EnumConstructor.Map.add new_name ty ctx_constrs )) - constrs - ( (if namespaced_fields_constrs then ctx0 else ctx), - constrs_map, - EnumConstructor.Map.empty ) - in - let ctx = if namespaced_fields_constrs then ctx else ctx1 in - ( PathMap.add path ctx pctxmap, - EnumName.Map.add name new_name enums_map, - constrs_map, - EnumName.Map.add new_name ctx_constrs ctx_enums )) + if EnumName.equal name Expr.option_enum then + (* The option type shouldn't be renamed, it has special handling in + backends. FIXME: could the fact that it's special be detected + differently from id comparison ? Structure maybe, or a more + specific construct ? *) + ( pctxmap, + EnumName.Map.add name name enums_map, + EnumConstructor.Map.fold + (fun c _ constrs_map -> EnumConstructor.Map.add c c constrs_map) + Expr.option_enum_config constrs_map, + ctx_enums ) + else + let path = EnumName.path name in + let str, pos = EnumName.get_info name in + let pctxmap, ctx = + try pctxmap, PathMap.find path pctxmap + with Not_found -> PathMap.add path ctx pctxmap, ctx + in + let id, ctx = new_id ctx (f_enum str) in + let new_name = EnumName.fresh path (id, pos) in + let ctx1, constrs_map, ctx_constrs = + EnumConstructor.Map.fold + (fun name ty (ctx, constrs_map, ctx_constrs) -> + let str, pos = EnumConstructor.get_info name in + let id, ctx = new_id ctx (f_constr str) in + let new_name = EnumConstructor.fresh (id, pos) in + ( ctx, + EnumConstructor.Map.add name new_name constrs_map, + EnumConstructor.Map.add new_name ty ctx_constrs )) + constrs + ( (if namespaced_fields_constrs then ctx0 else ctx), + constrs_map, + EnumConstructor.Map.empty ) + in + let ctx = if namespaced_fields_constrs then ctx else ctx1 in + ( PathMap.add path ctx pctxmap, + EnumName.Map.add name new_name enums_map, + constrs_map, + EnumName.Map.add new_name ctx_constrs ctx_enums )) p.decl_ctx.ctx_enums ( pctxmap, EnumName.Map.empty, diff --git a/tests/backends/python_name_clash.catala_en b/tests/backends/python_name_clash.catala_en index 62dab911..00efc21f 100644 --- a/tests/backends/python_name_clash.catala_en +++ b/tests/backends/python_name_clash.catala_en @@ -91,81 +91,75 @@ class BIn: def some_name(some_name_in:SomeNameIn): i = some_name_in.i_in - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - o3 = Eoption(Eoption_Code.ESome, (i + integer_of_string("1"))) + o3 = (i + integer_of_string("1")) else: - o3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - o3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/backends/python_name_clash.catala_en", - start_line=10, start_column=23, - end_line=10, end_column=28, law_headings=[])], - [o3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + o3 = None + else: + x = perhaps_none_arg + o3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/backends/python_name_clash.catala_en", + start_line=10, start_column=23, + end_line=10, end_column=28, law_headings=[])], + [o3] + ) + if perhaps_none_arg is None: if False: - o2 = Eoption(Eoption_Code.ENone, Unit()) + o2 = None else: - o2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - o2 = Eoption(Eoption_Code.ESome, x) - match_arg = o2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + o2 = None + else: + x = perhaps_none_arg + o2 = x + perhaps_none_arg = o2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/backends/python_name_clash.catala_en", start_line=7, start_column=10, end_line=7, end_column=11, law_headings=[])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg o1 = arg o = o1 return SomeName(o = o) def b(b_in:BIn): - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - result3 = Eoption(Eoption_Code.ESome, integer_of_string("1")) + result3 = integer_of_string("1") else: - result3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - result3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/backends/python_name_clash.catala_en", - start_line=16, start_column=33, - end_line=16, end_column=34, law_headings=[])], - [result3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + result3 = None + else: + x = perhaps_none_arg + result3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/backends/python_name_clash.catala_en", + start_line=16, start_column=33, + end_line=16, end_column=34, law_headings=[])], + [result3] + ) + if perhaps_none_arg is None: if False: - result2 = Eoption(Eoption_Code.ENone, Unit()) + result2 = None else: - result2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - result2 = Eoption(Eoption_Code.ESome, x) - match_arg = result2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + result2 = None + else: + x = perhaps_none_arg + result2 = x + perhaps_none_arg = result2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/backends/python_name_clash.catala_en", start_line=16, start_column=14, end_line=16, end_column=25, law_headings=[])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg result1 = arg result = some_name(SomeNameIn(i_in = result1)) result1 = SomeName(o = result.o) diff --git a/tests/name_resolution/good/toplevel_defs.catala_en b/tests/name_resolution/good/toplevel_defs.catala_en index d0ad73e2..16091bff 100644 --- a/tests/name_resolution/good/toplevel_defs.catala_en +++ b/tests/name_resolution/good/toplevel_defs.catala_en @@ -446,215 +446,200 @@ glob6 = ( ) def s2(s2_in:S2In): - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - a3 = Eoption(Eoption_Code.ESome, - (glob3(money_of_cents_string("4400")) + - decimal_of_string("100."))) + a3 = (glob3(money_of_cents_string("4400")) + + decimal_of_string("100.")) else: - a3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/name_resolution/good/toplevel_defs.catala_en", - start_line=53, start_column=24, - end_line=53, end_column=43, - law_headings=["Test toplevel function defs"])], - [a3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a3 = None + else: + x = perhaps_none_arg + a3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/name_resolution/good/toplevel_defs.catala_en", + start_line=53, start_column=24, + end_line=53, end_column=43, + law_headings=["Test toplevel function defs"])], + [a3] + ) + if perhaps_none_arg is None: if False: - a2 = Eoption(Eoption_Code.ENone, Unit()) + a2 = None else: - a2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a2 = Eoption(Eoption_Code.ESome, x) - match_arg = a2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a2 = None + else: + x = perhaps_none_arg + a2 = x + perhaps_none_arg = a2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/name_resolution/good/toplevel_defs.catala_en", start_line=50, start_column=10, end_line=50, end_column=11, law_headings=["Test toplevel function defs"])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg a1 = arg a = a1 return S2(a = a) def s3(s3_in:S3In): - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - a3 = Eoption(Eoption_Code.ESome, - (decimal_of_string("50.") + + a3 = (decimal_of_string("50.") + glob4(money_of_cents_string("4400"), - decimal_of_string("55.")))) + decimal_of_string("55."))) else: - a3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/name_resolution/good/toplevel_defs.catala_en", - start_line=74, start_column=24, - end_line=74, end_column=47, - law_headings=["Test function def with two args"])], - [a3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a3 = None + else: + x = perhaps_none_arg + a3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/name_resolution/good/toplevel_defs.catala_en", + start_line=74, start_column=24, + end_line=74, end_column=47, + law_headings=["Test function def with two args"] + )], + [a3] + ) + if perhaps_none_arg is None: if False: - a2 = Eoption(Eoption_Code.ENone, Unit()) + a2 = None else: - a2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a2 = Eoption(Eoption_Code.ESome, x) - match_arg = a2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a2 = None + else: + x = perhaps_none_arg + a2 = x + perhaps_none_arg = a2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/name_resolution/good/toplevel_defs.catala_en", start_line=71, start_column=10, end_line=71, end_column=11, law_headings=["Test function def with two args"])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg a1 = arg a = a1 return S3(a = a) def s4(s4_in:S4In): - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - a3 = Eoption(Eoption_Code.ESome, - (glob5 + - decimal_of_string("1."))) + a3 = (glob5 + decimal_of_string("1.")) else: - a3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/name_resolution/good/toplevel_defs.catala_en", - start_line=98, start_column=24, - end_line=98, end_column=34, - law_headings=["Test inline defs in toplevel defs"])], - [a3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a3 = None + else: + x = perhaps_none_arg + a3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/name_resolution/good/toplevel_defs.catala_en", + start_line=98, start_column=24, + end_line=98, end_column=34, + law_headings=["Test inline defs in toplevel defs"] + )], + [a3] + ) + if perhaps_none_arg is None: if False: - a2 = Eoption(Eoption_Code.ENone, Unit()) + a2 = None else: - a2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a2 = Eoption(Eoption_Code.ESome, x) - match_arg = a2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a2 = None + else: + x = perhaps_none_arg + a2 = x + perhaps_none_arg = a2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/name_resolution/good/toplevel_defs.catala_en", start_line=95, start_column=10, end_line=95, end_column=11, law_headings=["Test inline defs in toplevel defs"])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg a1 = arg a = a1 return S4(a = a) def s5(s_in:SIn): - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - a3 = Eoption(Eoption_Code.ESome, (glob1 * glob1)) + a3 = (glob1 * glob1) else: - a3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/name_resolution/good/toplevel_defs.catala_en", - start_line=18, start_column=24, - end_line=18, end_column=37, - law_headings=["Test basic toplevel values defs"])], - [a3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a3 = None + else: + x = perhaps_none_arg + a3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/name_resolution/good/toplevel_defs.catala_en", + start_line=18, start_column=24, + end_line=18, end_column=37, + law_headings=["Test basic toplevel values defs"] + )], + [a3] + ) + if perhaps_none_arg is None: if False: - a2 = Eoption(Eoption_Code.ENone, Unit()) + a2 = None else: - a2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - a2 = Eoption(Eoption_Code.ESome, x) - match_arg = a2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + a2 = None + else: + x = perhaps_none_arg + a2 = x + perhaps_none_arg = a2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/name_resolution/good/toplevel_defs.catala_en", start_line=7, start_column=10, end_line=7, end_column=11, law_headings=["Test basic toplevel values defs"])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg a1 = arg a = a1 - match_arg = handle_exceptions([], []) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + perhaps_none_arg = handle_exceptions([], []) + if perhaps_none_arg is None: if True: - b3 = Eoption(Eoption_Code.ESome, glob6) + b3 = glob6 else: - b3 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - b3 = Eoption(Eoption_Code.ESome, x) - match_arg = handle_exceptions( - [SourcePosition( - filename="tests/name_resolution/good/toplevel_defs.catala_en", - start_line=19, start_column=24, - end_line=19, end_column=29, - law_headings=["Test basic toplevel values defs"])], - [b3] - ) - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + b3 = None + else: + x = perhaps_none_arg + b3 = x + perhaps_none_arg = handle_exceptions( + [SourcePosition( + filename="tests/name_resolution/good/toplevel_defs.catala_en", + start_line=19, start_column=24, + end_line=19, end_column=29, + law_headings=["Test basic toplevel values defs"] + )], + [b3] + ) + if perhaps_none_arg is None: if False: - b2 = Eoption(Eoption_Code.ENone, Unit()) + b2 = None else: - b2 = Eoption(Eoption_Code.ENone, Unit()) - elif match_arg.code == Eoption_Code.ESome: - x = match_arg.value - b2 = Eoption(Eoption_Code.ESome, x) - match_arg = b2 - if match_arg.code == Eoption_Code.ENone: - _ = match_arg.value + b2 = None + else: + x = perhaps_none_arg + b2 = x + perhaps_none_arg = b2 + if perhaps_none_arg is None: raise NoValue(SourcePosition( filename="tests/name_resolution/good/toplevel_defs.catala_en", start_line=8, start_column=10, end_line=8, end_column=11, law_headings=["Test basic toplevel values defs"])) - elif match_arg.code == Eoption_Code.ESome: - arg = match_arg.value + else: + arg = perhaps_none_arg b1 = arg b = b1 return S(a = a, b = b)