X-Git-Url: http://nitlanguage.org diff --git a/contrib/jwrapper/src/code_generator.nit b/contrib/jwrapper/src/code_generator.nit index a69414e..4014c75 100644 --- a/contrib/jwrapper/src/code_generator.nit +++ b/contrib/jwrapper/src/code_generator.nit @@ -18,6 +18,8 @@ # Services to generate extern class `in "Java"` module code_generator +import gen_nit + intrude import model class CodeGenerator @@ -78,26 +80,29 @@ class CodeGenerator generate_class_header(jclass) - for id, signatures in jclass.local_intro_methods do - for signature in signatures do - assert not signature.is_static - generate_method(jclass, id, id, signature.return_type, signature.params) - file_out.write "\n" + if not sys.opt_no_properties.value then + + for id, signatures in jclass.local_intro_methods do + for signature in signatures do + assert not signature.is_static + generate_method(jclass, id, id, signature.return_type, signature.params) + file_out.write "\n" + end end - end - # Constructors - for constructor in jclass.constructors do - var complex = jclass.constructors.length != 1 and constructor.params.not_empty - var base_name = if complex then "from" else "" - var name = jclass.nit_name_for(base_name, constructor.params, complex, false, local_only=true) + # Constructors + for constructor in jclass.constructors do + var complex = jclass.constructors.length != 1 and constructor.params.not_empty + var base_name = if complex then "from" else "" + var name = jclass.nit_name_for(base_name, constructor.params, complex, false, local_only=true) - generate_constructor(jclass, constructor, name) - end + generate_constructor(jclass, constructor, name) + end - # Attributes - for id, attribute in jclass.attributes do if not attribute.is_static then - generate_getter_setter(jclass, id, attribute) + # Attributes + for id, attribute in jclass.attributes do if not attribute.is_static then + generate_getter_setter(jclass, id, attribute) + end end # JNI services @@ -106,19 +111,22 @@ class CodeGenerator # Close the class file_out.write "end\n\n" - # Static functions as top-level methods - var static_functions_prefix = jclass.class_type.extern_name.to_snake_case - for id, signatures in jclass.methods do - for signature in signatures do if signature.is_static then - var nit_id = static_functions_prefix + "_" + id - generate_method(jclass, id, nit_id, signature.return_type, signature.params, is_static=true) - file_out.write "\n" + if not sys.opt_no_properties.value then + + # Static functions as top-level methods + var static_functions_prefix = jclass.class_type.extern_name.to_snake_case + for id, signatures in jclass.methods do + for signature in signatures do if signature.is_static then + var nit_id = static_functions_prefix + "_" + id + generate_method(jclass, id, nit_id, signature.return_type, signature.params, is_static=true) + file_out.write "\n" + end end - end - # Static attributes as top-level getters and setters - for id, attribute in jclass.attributes do if attribute.is_static then - generate_getter_setter(jclass, id, attribute) + # Static attributes as top-level getters and setters + for id, attribute in jclass.attributes do if attribute.is_static then + generate_getter_setter(jclass, id, attribute) + end end # Primitive arrays @@ -140,6 +148,8 @@ class CodeGenerator # Serialize `model` to a file next to `file_name` fun write_model_to_file do + if not sys.opt_save_model.value then return + # Write the model to file next to the Nit module var model_path = file_name.strip_extension + ".jwrapper.bin" var model_stream = model_path.to_path.open_wo @@ -190,13 +200,14 @@ class CodeGenerator end if effective_supers == 0 then - if java_class.class_type.package_name == "java.lang.Object" then + if java_class.class_type.java_full_name == "java.lang.Object" or + not model.knows_the_object_class then supers.add "super JavaObject" else supers.add "super Java_lang_Object" end file_out.write """ -# Java class: {{{java_type}}} +# Java class: {{{java_type.extern_equivalent}}} extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} {{{supers.join("\n\t")}}} @@ -256,7 +267,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} # Build the call in Java var java_call if is_static == true then - java_call = java_class.class_type.package_name + java_call = java_class.class_type.java_full_name else java_call = "self" java_call += ".{java_method_id}({java_args.join(", ")})" @@ -269,7 +280,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} # Write file_out.write """ -{{{t}}}# Java implementation: {{{java_return_type}}} {{{java_class}}}.{{{java_method_id}}}({{{java_params.join(", ")}}}) +{{{t}}}# Java implementation: {{{java_return_type}}} {{{java_class.class_type.extern_equivalent}}}.{{{java_method_id}}}({{{java_params.join(", ")}}}) {{{ct}}}{{{nit_signature.join}}} in "Java" `{ {{{ct}}} {{{java_call}}}; {{{ct}}}`} @@ -294,7 +305,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} var recv if attribute.is_static then - recv = java_class.class_type.package_name + recv = java_class.class_type.java_full_name else recv = "self" # Tabulation @@ -303,12 +314,12 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} var ct = c+t file_out.write """ -{{{t}}}# Java getter: {{{java_class}}}.{{{java_id}}} +{{{t}}}# Java getter: {{{java_class.class_type.extern_equivalent}}}.{{{java_id}}} {{{ct}}}fun {{{nit_id}}}: {{{nit_type}}} in "Java" `{ {{{ct}}} return {{{recv}}}.{{{java_id}}}; {{{ct}}}`} -{{{t}}}# Java setter: {{{java_class}}}.{{{java_id}}} +{{{t}}}# Java setter: {{{java_class.class_type.extern_equivalent}}}.{{{java_id}}} {{{ct}}}fun {{{nit_id}}}=(value: {{{nit_type}}}) in "Java" `{ {{{ct}}} {{{recv}}}.{{{java_id}}} = value; {{{ct}}}`} @@ -344,9 +355,9 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} end file_out.write """ - # Java constructor: {{{java_class}}} + # Java constructor: {{{java_class.class_type.extern_equivalent}}} {{{c}}} new {{{name}}}{{{nit_params_s}}} in "Java" `{ -{{{c}}} return new {{{java_class.class_type.package_name}}}({{{java_params_s}}}); +{{{c}}} return new {{{java_class.class_type.java_full_name}}}({{{java_params_s}}}); {{{c}}} `} """ @@ -362,7 +373,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} var nit_type = model.java_to_nit_type(java_type) file_out.write """ -# Java primitive array: {{{java_type}}} +# Java primitive array: {{{java_type.extern_equivalent}}} extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `} super AbstractJavaArray[{{{base_nit_type}}}] @@ -408,23 +419,23 @@ redef class Sys # List of Nit keywords # # These may also be keywords in Java, but there they would be used capitalized. - private var nit_keywords = new HashSet[String].from(["abort", "abstract", "and", "assert", - "break", "class", "continue", "do", "else", "end", "enum", "extern", "false", "implies", - "import", "init", "interface", "intrude", "if", "in", "is", "isa", "isset", "for", "label", - "loop", "module", "new", "not", "null", "nullable", "or", "package", "private", - "protected", "public", "return", "self", "super", "then", "true", "type", "var", "while", - - # Top-level methods - "class_name", "get_time", "hash", "inspect", "inspect_head", "is_same_type", - "is_same_instance", "object_id", "output", "output_class_name", "sys", "to_s", - - # Pointer or JavaObject methods - "free"]) + private var nit_keywords: Set[String] is lazy do + var set = new HashSet[String] + set.add_all keywords + set.add_all methods_in_pointer + return set + end # Name of methods used at the top-level # # Used by `JavaClass::nit_name_for` with static properties. private var top_level_used_names = new HashSet[String] + + # Option to _not_ generate properties (static or from classes) + var opt_no_properties = new OptionBool("Do not wrap properties, only classes and basic services", "-n", "--no-properties") + + # Should the model be serialized to a file? + var opt_save_model = new OptionBool("Save the model next to the generated Nit module", "-s", "--save-model") end redef class String