src/Pure/System/scala_compiler.ML
author wenzelm
Fri, 08 Apr 2022 09:58:49 +0200
changeset 75417 2c861b196d52
parent 74790 3ce6fb9db485
child 75429 436747f1f632
permissions -rw-r--r--
removed unused flag (see 25c6423ec538);
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
75417
2c861b196d52 removed unused flag (see 25c6423ec538);
wenzelm
parents: 74790
diff changeset
     9
  val toplevel: string -> unit
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    10
  val static_check: string * Position.T -> 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
75417
2c861b196d52 removed unused flag (see 25c6423ec538);
wenzelm
parents: 74790
diff changeset
    18
fun toplevel source =
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    19
  let val errors =
75417
2c861b196d52 removed unused flag (see 25c6423ec538);
wenzelm
parents: 74790
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
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    25
fun static_check (source, pos) =
75417
2c861b196d52 removed unused flag (see 25c6423ec538);
wenzelm
parents: 74790
diff changeset
    26
  toplevel ("package test\nclass __Dummy__ { __dummy__ => " ^ source ^ " }")
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    27
    handle ERROR msg => error (msg ^ Position.here pos);
71888
feb37a43ace6 clarified signature;
wenzelm
parents: 71887
diff changeset
    28
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    29
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    30
(* antiquotations *)
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    31
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    32
local
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    33
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    34
fun make_list bg en = space_implode "," #> enclose bg en;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    35
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    36
fun print_args [] = ""
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    37
  | print_args xs = make_list "(" ")" xs;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    38
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    39
fun print_types [] = ""
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    40
  | print_types Ts = make_list "[" "]" Ts;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    41
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    42
fun print_class (c, Ts) = c ^ print_types Ts;
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    43
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    44
val types =
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    45
  Scan.optional (Parse.$$$ "[" |-- Parse.list1 Parse.name --| Parse.$$$ "]") [];
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    46
71905
wenzelm
parents: 71900
diff changeset
    47
val class =
wenzelm
parents: 71900
diff changeset
    48
  Scan.option
wenzelm
parents: 71900
diff changeset
    49
    (Parse.$$$ "(" |-- Parse.!!! (Parse.$$$ "in" |-- Parse.name -- types  --| Parse.$$$ ")"));
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    50
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    51
val arguments =
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    52
  (Parse.nat >> (fn n => replicate n "_") ||
71905
wenzelm
parents: 71900
diff changeset
    53
    Parse.list (Parse.underscore || Parse.name >> (fn T => "_ : " ^ T))) >> print_args;
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    54
71905
wenzelm
parents: 71900
diff changeset
    55
val args = Scan.optional (Parse.$$$ "(" |-- arguments --| Parse.$$$ ")") " _";
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    56
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    57
fun scala_name name =
74790
3ce6fb9db485 more symbolic latex_output via XML;
wenzelm
parents: 74789
diff changeset
    58
  Latex.macro "isatt" (Latex.string (Latex.output_ascii_breakable "." name));
71900
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
73761
ef1a18e20ace clarified modules;
wenzelm
parents: 72294
diff changeset
    64
    (Document_Output.antiquotation_verbatim_embedded \<^binding>\<open>scala\<close>
74563
042041c0ebeb clarified modules;
wenzelm
parents: 73780
diff changeset
    65
      (Scan.lift Parse.embedded_position)
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    66
      (fn _ => fn (s, pos) => (static_check (s, pos); s)) #>
71891
1b023a4498c3 check free-form Scala source;
wenzelm
parents: 71890
diff changeset
    67
73761
ef1a18e20ace clarified modules;
wenzelm
parents: 72294
diff changeset
    68
    Document_Output.antiquotation_raw_embedded \<^binding>\<open>scala_type\<close>
74563
042041c0ebeb clarified modules;
wenzelm
parents: 73780
diff changeset
    69
      (Scan.lift (Parse.embedded_position -- (types >> print_types)))
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    70
      (fn _ => fn ((t, pos), type_args) =>
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    71
        (static_check ("type _Test_" ^ type_args ^ " = " ^ t ^ type_args, pos);
71900
f08cf9d8f90b breakable scala_name;
wenzelm
parents: 71891
diff changeset
    72
          scala_name (t ^ type_args))) #>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    73
73761
ef1a18e20ace clarified modules;
wenzelm
parents: 72294
diff changeset
    74
    Document_Output.antiquotation_raw_embedded \<^binding>\<open>scala_object\<close>
74563
042041c0ebeb clarified modules;
wenzelm
parents: 73780
diff changeset
    75
      (Scan.lift Parse.embedded_position)
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    76
      (fn _ => fn (x, pos) => (static_check ("val _test_ = " ^ x, pos); scala_name x)) #>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    77
73761
ef1a18e20ace clarified modules;
wenzelm
parents: 72294
diff changeset
    78
    Document_Output.antiquotation_raw_embedded \<^binding>\<open>scala_method\<close>
74563
042041c0ebeb clarified modules;
wenzelm
parents: 73780
diff changeset
    79
      (Scan.lift (class -- Parse.embedded_position -- types -- args))
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    80
      (fn _ => fn (((class_context, (method, pos)), method_types), method_args) =>
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    81
        let
71905
wenzelm
parents: 71900
diff changeset
    82
          val class_types = (case class_context of SOME (_, Ts) => Ts | NONE => []);
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    83
          val def = "def _test_" ^ print_types (merge (op =) (method_types, class_types));
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    84
          val def_context =
71905
wenzelm
parents: 71900
diff changeset
    85
            (case class_context of
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    86
              NONE => def ^ " = "
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    87
            | SOME c => def ^ "(_this_ : " ^ print_class c ^ ") = _this_.");
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    88
          val source = def_context ^ method ^ method_args;
71906
a63072d875d1 proper error positions;
wenzelm
parents: 71905
diff changeset
    89
          val _ = static_check (source, pos);
71905
wenzelm
parents: 71900
diff changeset
    90
          val text = (case class_context of NONE => method | SOME c => print_class c ^ "." ^ method);
wenzelm
parents: 71900
diff changeset
    91
        in scala_name text end));
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    92
71881
71de0a253842 proper check of registered Scala functions;
wenzelm
parents:
diff changeset
    93
end;
71887
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    94
f7d15620dd8e antiquotations for Scala entities;
wenzelm
parents: 71881
diff changeset
    95
end;