1 # This file is part of NIT (http://www.nitlanguage.org).
3 # Copyright 2014 Frédéric Vachon <fredvac@gmail.com>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Services to generate extern class `in "Java"`
24 var with_attributes
: Bool
25 var comment_unknown_types
: Bool
26 var file_out
: FileWriter
27 var java_class
: JavaClass
29 var module_name
: nullable String = null
31 init (file_name
: String, jclass
: JavaClass, with_attributes
, comment
: Bool)
33 file_out
= new FileWriter.open
(file_name
)
36 if file_name
.has_suffix
(nit_ext
) then
37 # Output file ends with .nit, we expect it to be a valid name
38 module_name
= file_name
.strip_extension
(nit_ext
)
40 # Otherwise, it may be anything so do not declare a module
43 self.java_class
= jclass
44 self.with_attributes
= with_attributes
45 self.comment_unknown_types
= comment
50 var jclass
= self.java_class
52 var class_content
= new Array[String]
53 class_content
.add
(gen_class_header
(jclass
.class_type
))
55 if with_attributes
then
56 for id
, jtype
in jclass
.attributes
do class_content
.add
(gen_attribute
(id
, jtype
))
59 for id
, methods_info
in jclass
.methods
do
60 for method_info
in methods_info
do
62 if methods_info
.length
> 1 then nid
+= "{methods_info.index_of(method_info)}"
63 class_content
.add gen_method
(id
, nid
, method_info
.return_type
, method_info
.params
)
66 class_content
.add
("\nend\n")
68 var wrappers
= new Array[String]
69 for jtype
in jclass
.unknown_types
do
70 if jtype
== jclass
.class_type
then continue
72 wrappers
.add
(gen_unknown_class_header
(jtype
))
75 var imports
= new Array[String]
76 imports
.add
("import mnit_android\n")
77 for import_
in jclass
.imports
do
78 imports
.add
("import android::{import_}\n")
81 file_out
.write
(gen_licence
)
83 var module_name
= module_name
84 if module_name
!= null then file_out
.write
"module {module_name}\n"
87 file_out
.write
(imports
.join
(""))
89 file_out
.write
(class_content
.join
(""))
90 file_out
.write
(wrappers
.join
(""))
93 fun gen_licence
: String
96 # This file is part of NIT (http://www.nitlanguage.org).
98 # Licensed under the Apache License, Version 2.0 (the "License");
99 # you may not use this file except in compliance with the License.
100 # You may obtain a copy of the License at
102 # http://www.apache.org/licenses/LICENSE-2.0
104 # Unless required by applicable law or agreed to in writing, software
105 # distributed under the License is distributed on an "AS IS" BASIS,
106 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
107 # See the License for the specific language governing permissions and
108 # limitations under the License.
110 # This code has been generated using `jwrapper`
114 fun gen_class_header
(jtype
: JavaType): String
116 var temp
= new Array[String]
117 temp
.add
("extern class Native{jtype.id} in \"Java\
" `\{ {jtype} `\}\n")
118 temp
.add
("\tsuper JavaObject\n\n")
123 fun gen_unknown_class_header
(jtype
: JavaType): String
125 var nit_type
: NitType
126 if jtype
.extern_name
.has_generic_params
then
127 nit_type
= jtype
.extern_name
.generic_params
.first
129 nit_type
= jtype
.extern_name
132 var temp
= new Array[String]
133 temp
.add
("extern class {nit_type} in \"Java\
" `\{ {jtype.to_package_name} `\}\n")
134 temp
.add
("\tsuper JavaObject\n\nend\n")
139 fun gen_attribute
(jid
: String, jtype
: JavaType): String
141 return "\tvar {jid.to_nit_method_name}: {jtype.to_nit_type}\n"
144 fun gen_method
(jmethod_id
: String, nmethod_id
: String, jreturn_type
: JavaType, jparam_list
: Array[JavaType]): String
150 var nit_types
= new Array[NitType]
154 for i
in [0..jparam_list
.length
[ do
155 var jparam
= jparam_list
[i
]
156 var nit_type
= jparam
.to_nit_type
158 if not nit_type
.is_complete
then
159 if jparam
.is_wrapped
then
160 java_class
.imports
.add nit_type
.mod
.as(not null)
162 if comment_unknown_types
then
165 nit_type
= jparam
.extern_name
166 java_class
.unknown_types
.add
(jparam
)
173 if not jparam
.is_collection
then cast
= jparam
.param_cast
175 nit_types
.add
(nit_type
)
176 nit_type
.arg_id
= "{nit_id}{nit_id_no}"
178 if i
== jparam_list
.length
- 1 then
179 java_params
+= "{cast}{nit_id}{nit_id_no}"
180 nit_params
+= "{nit_id}{nit_id_no}: {nit_type}"
182 java_params
+= "{cast}{nit_id}{nit_id_no}" + ", "
183 nit_params
+= "{nit_id}{nit_id_no}: {nit_type}, "
190 var method_id
= nmethod_id
.to_nit_method_name
191 var nit_signature
= new Array[String]
193 nit_signature
.add
"\tfun {method_id}"
195 if not jparam_list
.is_empty
then
196 nit_signature
.add
"({nit_params})"
199 var return_type
= null
201 if not jreturn_type
.is_void
then
202 return_type
= jreturn_type
.to_nit_type
204 if not return_type
.is_complete
then
205 if jreturn_type
.is_wrapped
then
206 java_class
.imports
.add return_type
.mod
.as(not null)
208 if comment_unknown_types
then
211 return_type
= jreturn_type
.extern_name
212 java_class
.unknown_types
.add
(jreturn_type
)
217 nit_signature
.add
": {return_type} "
220 var temp
= new Array[String]
222 temp
.add
(comment
+ nit_signature
.join
(""))
224 # FIXME : This huge `if` block is only necessary to copy primitive arrays as long as there's no better way to do it
225 if comment
== "#" then
226 temp
.add
(" in \"Java\
" `\{\n{comment}\t\trecv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
227 # Methods with return type
228 else if return_type
!= null then
229 temp
.add
(" in \"Java\
" `\{\n{comment}\t\treturn {jreturn_type.return_cast}recv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
230 # Methods without return type
231 else if jreturn_type
.is_void
then
232 temp
.add
(" in \"Java\
" `\{\n{comment}\t\trecv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
235 temp
.add
(" in \"Java\
" `\{\n{comment}\t\trecv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
243 # Convert the Java method name `self` to the Nit style
245 # * Converts to snake case
246 # * Strips `Get` and `Set`
247 # * Add suffix `=` to setters
248 fun to_nit_method_name
: String
250 var name
= self.to_snake_case
251 if name
.has_prefix
("get_") then
252 name
= name
.substring_from
(4)
253 else if name
.has_prefix
("set_") then
254 name
= name
.substring_from
(4) + "="