1060 |
1060 |
1061 fun declare_var (x, opt_T, mx) ctxt = |
1061 fun declare_var (x, opt_T, mx) ctxt = |
1062 let val T = (case opt_T of SOME T => T | NONE => Mixfix.mixfixT mx) |
1062 let val T = (case opt_T of SOME T => T | NONE => Mixfix.mixfixT mx) |
1063 in ((x, T, mx), ctxt |> Variable.declare_constraints (Free (x, T))) end; |
1063 in ((x, T, mx), ctxt |> Variable.declare_constraints (Free (x, T))) end; |
1064 |
1064 |
|
1065 fun add_syntax vars ctxt = |
|
1066 map_syntax_idents (Local_Syntax.add_syntax ctxt (map (pair Local_Syntax.Fixed) vars)) ctxt; |
|
1067 |
1065 fun check_var internal b = |
1068 fun check_var internal b = |
1066 let |
1069 let |
1067 val x = Variable.check_name b; |
1070 val x = Variable.check_name b; |
1068 val check = if internal then Name.reject_skolem else Name.reject_internal; |
1071 val check = if internal then Name.reject_skolem else Name.reject_internal; |
1069 val _ = |
1072 val _ = |
1071 else error ("Bad name: " ^ Binding.print b); |
1074 else error ("Bad name: " ^ Binding.print b); |
1072 in x end; |
1075 in x end; |
1073 |
1076 |
1074 local |
1077 local |
1075 |
1078 |
|
1079 fun check_mixfix ctxt (b, opt_T, mx) = |
|
1080 let |
|
1081 val ([x], ctxt') = Variable.add_fixes_binding [Binding.reset_pos b] ctxt; |
|
1082 val mx' = Mixfix.reset_pos mx; |
|
1083 val T = #2 (#1 (declare_var (x, opt_T, mx') ctxt)); |
|
1084 val _ = add_syntax [(x, T, if Context_Position.is_visible ctxt then mx else mx')] ctxt'; |
|
1085 in mx' end; |
|
1086 |
1076 fun prep_var prep_typ internal (b, raw_T, mx) ctxt = |
1087 fun prep_var prep_typ internal (b, raw_T, mx) ctxt = |
1077 let |
1088 let |
1078 val x = check_var internal b; |
1089 val x = check_var internal b; |
1079 fun cond_tvars T = |
1090 fun cond_tvars T = |
1080 if internal then T |
1091 if internal then T |
1081 else Type.no_tvars T handle TYPE (msg, _, _) => error msg; |
1092 else Type.no_tvars T handle TYPE (msg, _, _) => error msg; |
1082 val opt_T = Option.map (cond_tvars o prep_typ ctxt) raw_T; |
1093 val opt_T = Option.map (cond_tvars o prep_typ ctxt) raw_T; |
1083 val (_, ctxt') = ctxt |> declare_var (x, opt_T, mx); |
1094 val mx' = if Mixfix.is_empty mx then mx else check_mixfix ctxt (b, opt_T, mx); |
1084 in ((b, opt_T, mx), ctxt') end; |
1095 val (_, ctxt') = ctxt |> declare_var (x, opt_T, mx'); |
|
1096 in ((b, opt_T, mx'), ctxt') end; |
1085 |
1097 |
1086 in |
1098 in |
1087 |
1099 |
1088 val read_var = prep_var Syntax.read_typ false; |
1100 val read_var = prep_var Syntax.read_typ false; |
1089 val cert_var = prep_var cert_typ true; |
1101 val cert_var = prep_var cert_typ true; |
1183 val (vars, _) = fold_map prep_var raw_vars ctxt; |
1195 val (vars, _) = fold_map prep_var raw_vars ctxt; |
1184 val (xs, ctxt') = Variable.add_fixes_binding (map #1 vars) ctxt; |
1196 val (xs, ctxt') = Variable.add_fixes_binding (map #1 vars) ctxt; |
1185 in |
1197 in |
1186 ctxt' |
1198 ctxt' |
1187 |> fold_map declare_var (map2 (fn x => fn (_, T, mx) => (x, T, mx)) xs vars) |
1199 |> fold_map declare_var (map2 (fn x => fn (_, T, mx) => (x, T, mx)) xs vars) |
1188 |-> (map_syntax_idents o Local_Syntax.add_syntax ctxt o map (pair Local_Syntax.Fixed)) |
1200 |-> add_syntax |
1189 |> pair xs |
1201 |> pair xs |
1190 end; |
1202 end; |
1191 |
1203 |
1192 in |
1204 in |
1193 |
1205 |