X-Git-Url: http://nitlanguage.org diff --git a/contrib/jwrapper/src/code_generator.nit b/contrib/jwrapper/src/code_generator.nit index c942ae9..fda1a57 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 @@ -137,6 +145,19 @@ class CodeGenerator file_out.close end + # 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 + var serializer = new BinarySerializer(model_stream) + serializer.serialize model + model_stream.close + end + # License for the header of the generated Nit module var license = """ # This file is part of NIT (http://www.nitlanguage.org). @@ -179,7 +200,8 @@ class CodeGenerator end if effective_supers == 0 then - if java_class.class_type.package_name == "java.lang.Object" then + if java_class.class_type.package_name == "java.lang.Object" or + not model.knows_the_object_class then supers.add "super JavaObject" else supers.add "super Java_lang_Object" end @@ -397,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