X-Git-Url: http://nitlanguage.org diff --git a/contrib/jwrapper/src/model.nit b/contrib/jwrapper/src/model.nit index 86d0176..011d0a8 100644 --- a/contrib/jwrapper/src/model.nit +++ b/contrib/jwrapper/src/model.nit @@ -24,6 +24,8 @@ import opts import jtype_converter class JavaType + super Cloneable + var identifier = new Array[String] var generic_params: nullable Array[JavaType] = null @@ -121,9 +123,22 @@ class JavaType end end - # Comparison based on fully qualified named and generic params - # Ignores primitive array so `a.b.c[][] == a.b.c` - redef fun ==(other) do return other isa JavaType and self.full_id == other.full_id + # Get a copy of `self` + redef fun clone + do + var jtype = new JavaType + jtype.identifier = identifier + jtype.generic_params = generic_params + jtype.is_void = is_void + jtype.is_vararg = is_vararg + jtype.array_dimension = array_dimension + return jtype + end + + # Comparison based on fully qualified named + redef fun ==(other) do return other isa JavaType and + self.full_id == other.full_id and + self.is_primitive_array == other.is_primitive_array redef fun hash do return self.full_id.hash end @@ -147,7 +162,7 @@ class JavaClass var class_type: JavaType # Attributes of this class - var attributes = new HashMap[String, JavaType] + var attributes = new HashMap[String, JavaAttribute] # Methods of this class organized by their name var methods = new MultiHashMap[String, JavaMethod] @@ -225,8 +240,17 @@ class JavaModel end end +# A property to a Java class +abstract class JavaProperty + + # Is this property marked static? + var is_static: Bool +end + # A Java method, with its signature class JavaMethod + super JavaProperty + # Type returned by the method var return_type: JavaType @@ -234,6 +258,14 @@ class JavaMethod var params: Array[JavaType] end +# An attribute in a Java class +class JavaAttribute + super JavaProperty + + # Type of the attribute + var java_type: JavaType +end + # A Java method, with its signature class JavaConstructor # Type of the parameters of this constructor @@ -262,19 +294,26 @@ redef class Sys var map = new DefaultMap[String, nullable NitType](null) var modules = new HashMap[String, NitModule] - var nit_dir = "NIT_DIR".environ - if nit_dir.is_empty then - # Simple heuristic to find the Nit lib - var dir = sys.program_name.dirname / "../../../" - nit_dir = dir.simplify_path - if not nit_dir.file_exists then return map + var lib_paths = opt_libs.value + if lib_paths == null then lib_paths = new Array[String] + + if lib_paths.has("auto") then + lib_paths.remove "auto" + var nit_dir = "NIT_DIR".environ + if nit_dir.is_empty then + # Simple heuristic to find the Nit lib + var dir = sys.program_name.dirname / "../../../lib/" + dir = dir.simplify_path + if dir.file_exists then lib_paths.add dir.simplify_path + end end + if lib_paths.is_empty then return map + # Use grep to find all extern classes implemented in Java - var grep_regex = "extern class [a-zA-Z0-9]\\\+[ ]\\\+in[ ]\\\+\"Java\"" - var grep_args = ["-r", grep_regex, - nit_dir/"lib/android/", - nit_dir/"lib/java/"] + var grep_regex = "extern class [a-zA-Z0-9_]\\\+[ ]\\\+in[ ]\\\+\"Java\"" + var grep_args = ["-r", "--with-filename", grep_regex] + grep_args.add_all lib_paths var grep = new ProcessReader("grep", grep_args...) var lines = grep.read_lines @@ -282,16 +321,16 @@ redef class Sys grep.wait # Sort out the modules, Nit class names and Java types - var regex = """(.+):\\s*extern +class +([a-zA-Z0-9]+) *in *"Java" *`\\{ *([a-zA-Z0-9.$/]+) *`\\}""".to_re + var regex = """(.+):\\s*extern +class +([a-zA-Z0-9_]+) *in *"Java" *`\\{(.+)`\\}""".to_re for line in lines do var matches = line.search_all(regex) for match in matches do var path = match[1].to_s var nit_name = match[2].to_s - var java_name = match[3].to_s + var java_name = match[3].to_s.trim # Debug code - # print "+ Found {nit_name}:{java_name} at {path}" + # print "+ Found {nit_name}: {java_name} at {path}" var mod = modules.get_or_null(path) if mod == null then @@ -311,6 +350,9 @@ redef class Sys # Prefix used to name extern classes, if `null` use the full namespace var extern_class_prefix: nullable String is lazy do return opt_extern_class_prefix.value + + # Libraries to search for existing wrappers + var opt_libs = new OptionArray("Paths to libraries with wrappers of Java classes ('auto' to use the full Nit lib)", "-i") end redef class Text