src/Pure/System/scala_compiler.ML
author wenzelm
Wed, 27 May 2020 15:51:10 +0200
changeset 71905 1ca5623888bb
parent 71900 f08cf9d8f90b
child 71906 a63072d875d1
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
     1
(*  Title:      Pure/System/scala_compiler.ML
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
     3
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
     4
Scala compiler operations.
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
     5
*)
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
     6
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
     7
signature SCALA_COMPILER =
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
     8
sig
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
     9
  val toplevel: string -> unit
71890
3b35b0fd7fe8 clarified static_check: avoid accidental evaluation;
wenzelm
parents: 71888
diff changeset
    10
  val static_check: string -> unit
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    11
end;
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    12
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
    13
structure Scala_Compiler: SCALA_COMPILER =
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    14
struct
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    15
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    16
(* check declaration *)
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    17
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
    18
fun toplevel source =
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    19
  let val errors =
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
    20
    \<^scala>\<open>scala_toplevel\<close> source
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    21
    |> YXML.parse_body
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    22
    |> let open XML.Decode in list string end
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    23
  in if null errors then () else error (cat_lines errors) end;
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    24
71890
3b35b0fd7fe8 clarified static_check: avoid accidental evaluation;
wenzelm
parents: 71888
diff changeset
    25
fun static_check source =
3b35b0fd7fe8 clarified static_check: avoid accidental evaluation;
wenzelm
parents: 71888
diff changeset
    26
  toplevel ("package test\nclass __Dummy__ { __dummy__ => " ^ source ^ " }");
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
    27
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    28
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    29
(* antiquotations *)
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    30
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    31
local
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    32
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    33
fun make_list bg en = space_implode "," #> enclose bg en;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    34
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    35
fun print_args [] = ""
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    36
  | print_args xs = make_list "(" ")" xs;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    37
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    38
fun print_types [] = ""
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    39
  | print_types Ts = make_list "[" "]" Ts;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    40
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    41
fun print_class (c, Ts) = c ^ print_types Ts;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    42
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    43
val types =
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    44
  Scan.optional (Parse.$$$ "[" |-- Parse.list1 Parse.name --| Parse.$$$ "]") [];
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    45
71905
wenzelm
parents: 71900
diff changeset
    46
val class =
wenzelm
parents: 71900
diff changeset
    47
  Scan.option
wenzelm
parents: 71900
diff changeset
    48
    (Parse.$$$ "(" |-- Parse.!!! (Parse.$$$ "in" |-- Parse.name -- types  --| Parse.$$$ ")"));
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    49
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    50
val arguments =
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    51
  (Parse.nat >> (fn n => replicate n "_") ||
71905
wenzelm
parents: 71900
diff changeset
    52
    Parse.list (Parse.underscore || Parse.name >> (fn T => "_ : " ^ T))) >> print_args;
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    53
71905
wenzelm
parents: 71900
diff changeset
    54
val args = Scan.optional (Parse.$$$ "(" |-- arguments --| Parse.$$$ ")") " _";
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    55
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    56
fun scala_name name =
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    57
  let val latex = Latex.string (Latex.output_ascii_breakable "." name)
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    58
  in Latex.enclose_block "\\isatt{" "}" [latex] end;
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    59
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    60
in
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    61
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    62
val _ =
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    63
  Theory.setup
71891
1b023a4498c3 check free-form Scala source;
wenzelm
parents: 71890
diff changeset
    64
    (Thy_Output.antiquotation_verbatim_embedded \<^binding>\<open>scala\<close>
1b023a4498c3 check free-form Scala source;
wenzelm
parents: 71890
diff changeset
    65
      (Scan.lift Parse.embedded) (fn _ => tap static_check) #>
1b023a4498c3 check free-form Scala source;
wenzelm
parents: 71890
diff changeset
    66
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    67
    Thy_Output.antiquotation_raw_embedded \<^binding>\<open>scala_type\<close>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    68
      (Scan.lift (Parse.embedded -- (types >> print_types)))
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    69
      (fn _ => fn (t, type_args) =>
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    70
        (static_check ("type _Test_" ^ type_args ^ " = " ^ t ^ type_args);
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    71
          scala_name (t ^ type_args))) #>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    72
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    73
    Thy_Output.antiquotation_raw_embedded \<^binding>\<open>scala_object\<close>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    74
      (Scan.lift Parse.embedded)
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    75
      (fn _ => fn object => (static_check ("val _test_ = " ^ object); scala_name object)) #>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    76
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    77
    Thy_Output.antiquotation_raw_embedded \<^binding>\<open>scala_method\<close>
71905
wenzelm
parents: 71900
diff changeset
    78
      (Scan.lift (class -- Parse.embedded -- types -- args))
wenzelm
parents: 71900
diff changeset
    79
      (fn _ => fn (((class_context, method), method_types), method_args) =>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    80
        let
71905
wenzelm
parents: 71900
diff changeset
    81
          val class_types = (case class_context of SOME (_, Ts) => Ts | NONE => []);
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    82
          val def = "def _test_" ^ print_types (merge (op =) (method_types, class_types));
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    83
          val def_context =
71905
wenzelm
parents: 71900
diff changeset
    84
            (case class_context of
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    85
              NONE => def ^ " = "
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    86
            | SOME c => def ^ "(_this_ : " ^ print_class c ^ ") = _this_.");
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    87
          val source = def_context ^ method ^ method_args;
71890
3b35b0fd7fe8 clarified static_check: avoid accidental evaluation;
wenzelm
parents: 71888
diff changeset
    88
          val _ = static_check source;
71905
wenzelm
parents: 71900
diff changeset
    89
          val text = (case class_context of NONE => method | SOME c => print_class c ^ "." ^ method);
wenzelm
parents: 71900
diff changeset
    90
        in scala_name text end));
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    91
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    92
end;
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    93
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    94
end;