src/Tools/Code/code_scala.ML
changeset 37384 5aba26803073
parent 37337 c0cf8b6c2c26
child 37437 4202e11ae7dc
equal deleted inserted replaced
37343:c333da19fe67 37384:5aba26803073
   210               applify "[" "]" NOBR ((concat o map str) ["sealed", "class", deresolve_base name])
   210               applify "[" "]" NOBR ((concat o map str) ["sealed", "class", deresolve_base name])
   211                 (map (str o prefix "+" o lookup_tyvar tyvars o fst) vs)
   211                 (map (str o prefix "+" o lookup_tyvar tyvars o fst) vs)
   212               :: map print_co cos
   212               :: map print_co cos
   213             )
   213             )
   214           end
   214           end
   215       | print_stmt (name, Code_Thingol.Class (_, (v, (superclasses, classparams)))) =
   215       | print_stmt (name, Code_Thingol.Class (_, (v, (super_classes, classparams)))) =
   216           let
   216           let
   217             val tyvars = intro_vars [v] reserved;
   217             val tyvars = intro_vars [v] reserved;
   218             val vs = [(v, [name])];
   218             val vs = [(v, [name])];
   219             fun add_typarg p = applify "[" "]" NOBR p [(str o lookup_tyvar tyvars) v];
   219             fun add_typarg p = applify "[" "]" NOBR p [(str o lookup_tyvar tyvars) v];
   220             fun print_superclasses [] = NONE
   220             fun print_super_classes [] = NONE
   221               | print_superclasses classes = SOME (concat (str "extends"
   221               | print_super_classes classes = SOME (concat (str "extends"
   222                   :: separate (str "with") (map (add_typarg o str o deresolve o fst) classes)));
   222                   :: separate (str "with") (map (add_typarg o str o deresolve o fst) classes)));
   223             fun print_tupled_typ ([], ty) =
   223             fun print_tupled_typ ([], ty) =
   224                   print_typ tyvars NOBR ty
   224                   print_typ tyvars NOBR ty
   225               | print_tupled_typ ([ty1], ty2) =
   225               | print_tupled_typ ([ty1], ty2) =
   226                   concat [print_typ tyvars BR ty1, str "=>", print_typ tyvars NOBR ty2]
   226                   concat [print_typ tyvars BR ty1, str "=>", print_typ tyvars NOBR ty2]
   244               end;
   244               end;
   245           in
   245           in
   246             Pretty.chunks (
   246             Pretty.chunks (
   247               (Pretty.block_enclose
   247               (Pretty.block_enclose
   248                 (concat ([str "trait", add_typarg ((str o deresolve_base) name)]
   248                 (concat ([str "trait", add_typarg ((str o deresolve_base) name)]
   249                   @ the_list (print_superclasses superclasses) @ [str "{"]), str "}")
   249                   @ the_list (print_super_classes super_classes) @ [str "{"]), str "}")
   250                 (map print_classparam_val classparams))
   250                 (map print_classparam_val classparams))
   251               :: map print_classparam_def classparams
   251               :: map print_classparam_def classparams
   252             )
   252             )
   253           end
   253           end
   254       | print_stmt (name, Code_Thingol.Classinst ((class, (tyco, vs)),
   254       | print_stmt (name, Code_Thingol.Classinst ((class, (tyco, vs)),
   255             (super_instances, classparam_insts))) =
   255             ((super_instances, _), classparam_instances))) =
   256           let
   256           let
   257             val tyvars = intro_vars (map fst vs) reserved;
   257             val tyvars = intro_vars (map fst vs) reserved;
   258             val insttyp = tyco `%% map (ITyVar o fst) vs;
   258             val insttyp = tyco `%% map (ITyVar o fst) vs;
   259             val p_inst_typ = print_typ tyvars NOBR insttyp;
   259             val p_inst_typ = print_typ tyvars NOBR insttyp;
   260             fun add_typ_params p = applify "[" "]" NOBR p (map (str o lookup_tyvar tyvars o fst) vs);
   260             fun add_typ_params p = applify "[" "]" NOBR p (map (str o lookup_tyvar tyvars o fst) vs);
   261             fun add_inst_typ p = Pretty.block [p, str "[", p_inst_typ, str "]"];
   261             fun add_inst_typ p = Pretty.block [p, str "[", p_inst_typ, str "]"];
   262             val ((implicit_names, implicit_ps), vars) = implicit_arguments tyvars vs reserved;
   262             val ((implicit_names, implicit_ps), vars) = implicit_arguments tyvars vs reserved;
   263             fun print_classparam_inst ((classparam, const as (_, (_, tys))), (thm, _)) =
   263             fun print_classparam_instance ((classparam, const as (_, (_, tys))), (thm, _)) =
   264               let
   264               let
   265                 val auxs = Name.invents (snd reserved) "a" (length tys);
   265                 val auxs = Name.invents (snd reserved) "a" (length tys);
   266                 val vars = intro_vars auxs reserved;
   266                 val vars = intro_vars auxs reserved;
   267                 val args = if null auxs then [] else
   267                 val args = if null auxs then [] else
   268                   [concat [enum "," "(" ")" (map2 (fn aux => fn ty => print_typed tyvars ((str o lookup_var vars) aux) ty)
   268                   [concat [enum "," "(" ")" (map2 (fn aux => fn ty => print_typed tyvars ((str o lookup_var vars) aux) ty)
   276               Pretty.block_enclose
   276               Pretty.block_enclose
   277                 (concat ([str "trait",
   277                 (concat ([str "trait",
   278                     add_typ_params ((str o deresolve_base) name),
   278                     add_typ_params ((str o deresolve_base) name),
   279                     str "extends",
   279                     str "extends",
   280                     Pretty.block [(str o deresolve) class, str "[", p_inst_typ, str "]"]]
   280                     Pretty.block [(str o deresolve) class, str "[", p_inst_typ, str "]"]]
   281                     @ map (fn (_, (_, (superinst, _))) => add_typ_params (str ("with " ^ deresolve superinst)))
   281                     @ map (fn (_, (_, (super_instance, _))) => add_typ_params (str ("with " ^ deresolve super_instance)))
   282                       super_instances @| str "{"), str "}")
   282                       super_instances @| str "{"), str "}")
   283                 (map (fn p => Pretty.block [str "implicit val arg$", p]) implicit_ps
   283                 (map (fn p => Pretty.block [str "implicit val arg$", p]) implicit_ps
   284                   @ map print_classparam_inst classparam_insts),
   284                   @ map print_classparam_instance classparam_instances),
   285               concat [str "implicit", str (if null vs then "val" else "def"),
   285               concat [str "implicit", str (if null vs then "val" else "def"),
   286                 applify "(implicit " ")" NOBR (applify "[" "]" NOBR
   286                 applify "(implicit " ")" NOBR (applify "[" "]" NOBR
   287                   ((str o deresolve_base) name) (map (str o lookup_tyvar tyvars o fst) vs))
   287                   ((str o deresolve_base) name) (map (str o lookup_tyvar tyvars o fst) vs))
   288                     implicit_ps,
   288                     implicit_ps,
   289                   str "=", str "new", applify "[" "]" NOBR ((str o deresolve_base) name)
   289                   str "=", str "new", applify "[" "]" NOBR ((str o deresolve_base) name)