# This file is part of NIT (http://www.nitlanguage.org).
#
# Copyright 2014 Frédéric Vachon <fredvac@gmail.com>
+# Copyright 2015 Alexis Laferrière <alexis.laf@xymus.net>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# Contains the java and nit type representation used to convert java to nit code
module model
+import more_collections
+
import jtype_converter
class JavaType
- private var converter: JavaTypeConverter
var identifier = new Array[String]
var generic_params: nullable Array[JavaType] = null
var is_void = false
fun full_id: String do return identifier.join(".")
fun id: String do return identifier.last.replace("$", "")
- init(converter: JavaTypeConverter) do self.converter = converter
-
fun return_cast: String do return converter.cast_as_return(self.id)
fun param_cast: String
return nit_type
end
- fun is_iterable: Bool do return iterable.has(self.id)
-
fun is_collection: Bool do return is_primitive_array or collections_list.has(self.id)
fun is_wrapped: Bool do return find_extern_class != null
var name
if is_primitive_array then
# Primitive arrays have a special naming convention
- name = "Native" + extern_class_name.join("").capitalized + "Array"
+ name = "Java" + extern_class_name.join.capitalized + "Array"
else
- name = "Native" + extern_class_name.join("")
+ name = "Java" + extern_class_name.join
end
+ name = name.replace("-", "_")
+
var nit_type = new NitType(name)
nit_type.is_complete = false
return nit_type
return converter.cast_as_return(jtype)
end
- redef fun to_s: String
+ redef fun to_s
do
var id = self.full_id
if self.is_primitive_array then
- for i in [0..array_dimension[ do
- id += "[]"
- end
+ id += "[]" * array_dimension
else if self.has_generic_params then
- var gen_list = new Array[String]
-
- for param in generic_params do
- gen_list.add(param.to_s)
- end
-
- id += "<{gen_list.join(", ")}>"
+ var params = [for param in generic_params do param.to_s]
+ id += "<{params.join(", ")}>"
end
return id
var regex = "extern class [a-zA-Z1-9]\\\+[ ]\\\+in[ ]\\\+\"Java\"[ ]*`\{[ ]*" + self.to_s + "\\\+[ ]*`\}"
var nit_dir = "NIT_DIR".environ
+ if nit_dir.is_empty then return null
+
var grep = new ProcessReader("grep", "-r", regex, nit_dir/"lib/android/", nit_dir/"lib/java/")
var to_eat = ["private", "extern", "class"]
class NitType
var identifier: String
- var arg_id: String
var generic_params: nullable Array[NitType] = null
# If this NitType was found in `lib/android`, contains the module name to import
end
end
+# Model of a single Java class
class JavaClass
- var class_type = new JavaType(new JavaTypeConverter)
+ # Type of this class
+ var class_type = new JavaType
+
+ # Attributes of this class
var attributes = new HashMap[String, JavaType]
# Methods of this class organized by their name
- var methods = new HashMap[String, Array[JavaMethod]]
+ var methods = new MultiHashMap[String, JavaMethod]
- var unknown_types = new HashSet[JavaType]
+ # Importations from this class
var imports = new HashSet[NitModule]
- fun add_method(id: String, return_type: JavaType, params: Array[JavaType])
- do
- var signatures = methods.get_or_default(id, new Array[JavaMethod])
- signatures.add(new JavaMethod(return_type, new Array[JavaType].from(params)))
- methods[id] = signatures
- end
+ redef fun to_s do return class_type.to_s
+end
+
+# Model of all the Java class analyzed in one run
+class JavaModel
+ # Unknown Java types used in `classes`
+ var unknown_types = new HashSet[JavaType]
+
+ # All analyzed classes
+ var classes = new Array[JavaClass]
end
# A Java method, with its signature