1 # This file is part of NIT (http://www.nitlanguage.org).
3 # Copyright 2014 Frédéric Vachon <fredvac@gmail.com>
4 # Copyright 2015 Alexis Laferrière <alexis.laf@xymus.net>
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
18 # Uses a visitor to extract data from the javap output AST
19 # It sends the data to `code_generator` module
22 import javap_test_parser
24 import jtype_converter
27 # Visitor of the AST generated from javap output
31 # Model of all the analyzed classes
34 # Java class in construction
35 var java_class
: JavaClass is noinit
37 redef fun visit
(n
) do n
.accept_visitor
(self)
41 private fun accept_visitor
(v
: JavaVisitor) do visit_children
(v
)
47 redef class Nclass_declaration
48 redef fun accept_visitor
(v
)
50 var jtype
= n_full_class_name
.to_java_type
52 v
.java_class
= new JavaClass(jtype
)
53 v
.model
.add_class v
.java_class
55 # Visit all properties
60 # Extends declaration in the class header
61 redef class Nextends_declaration
62 redef fun accept_visitor
(v
)
68 # Implements declaration in the class header
69 redef class Nimplements_declaration
70 redef fun accept_visitor
(v
)
80 redef class Nproperty_declaration_method
81 redef fun accept_visitor
(v
)
84 var modifiers
= n_modifier
85 if modifiers
!= null then is_static
= modifiers
.has_static
87 var id
= n_identifier
.text
88 var return_jtype
= n_type
.to_java_type
91 var n_params
= n_generic_parameters
93 if n_params
!= null then
94 generic_params
= n_params
.n_parameters
.to_a
95 else generic_params
= new Array[JavaType]
98 var n_parameters
= n_parameters
100 if n_parameters
!= null then
101 params
= n_parameters
.to_a
102 else params
= new Array[JavaType]
104 var method
= new JavaMethod(is_static
, return_jtype
, params
, generic_params
)
105 v
.java_class
.methods
[id
].add method
109 # Constructor declaration
110 redef class Nproperty_declaration_constructor
111 redef fun accept_visitor
(v
)
114 var n_parameters
= n_parameters
116 if n_parameters
!= null then
117 params
= n_parameters
.to_a
118 else params
= new Array[JavaType]
121 var n_params
= n_generic_parameters
123 if n_params
!= null then
124 generic_params
= n_params
.n_parameters
.to_a
125 else generic_params
= new Array[JavaType]
127 var method
= new JavaConstructor(params
, generic_params
)
128 v
.java_class
.constructors
.add method
132 # Variable property declaration
133 redef class Nproperty_declaration_attribute
134 redef fun accept_visitor
(v
)
136 var id
= n_identifier
.text
137 var jtype
= n_type
.to_java_type
139 # Manually count the array depth as it is after the id
140 var brackets
= n_brackets
141 if brackets
!= null then jtype
.array_dimension
+= brackets
.children
.length
143 var is_static
= false
144 var modifiers
= n_modifier
145 if modifiers
!= null then is_static
= modifiers
.has_static
147 v
.java_class
.attributes
[id
] = new JavaAttribute(is_static
, jtype
)
151 # Static property declaration
152 redef class Nproperty_declaration_static
153 redef fun accept_visitor
(v
)
163 private fun to_java_type
: JavaType
165 var jtype
= n_base_type
.to_java_type
167 var brackets
= n_brackets
168 if brackets
!= null then jtype
.array_dimension
+= brackets
.children
.length
174 redef class Nbase_type
175 private fun to_java_type
: JavaType
177 # By default, everything is bound by object
178 var jtype
= new JavaType
179 jtype
.identifier
.add_all
(["java", "lang", "object"])
184 redef class Nbase_type_class
185 redef fun to_java_type
do return n_full_class_name
.to_java_type
188 redef class Nbase_type_primitive
189 redef fun to_java_type
191 # All the concrete nodes under this production are tokens
193 if not node
isa NToken then continue
195 var jtype
= new JavaType
196 jtype
.identifier
.add node
.text
204 redef class Nbase_type_void
205 redef fun to_java_type
207 var jtype
= new JavaType
213 redef class Nbase_type_extends
214 redef fun to_java_type
do return n_generic_identifier
.to_java_type
217 redef class Nbase_type_super
218 redef fun to_java_type
220 var bounds
= n_type_bound
.to_a
222 # Java use more than one lower bound,
223 # it can't be translated statically to Nit,
224 # so we use the only the first one.
225 # This may cause problems on complex generic types,
226 # but these cases can be handled manually.
231 redef class Ngeneric_identifier
232 private fun to_java_type
: JavaType is abstract
235 redef class Ngeneric_identifier_class
236 redef fun to_java_type
do return n_full_class_name
.to_java_type
239 redef class Ngeneric_identifier_wildcard
240 redef fun to_java_type
242 var jtype
= new JavaType
243 jtype
.identifier
.add_all
(["java", "lang", "Object"])
248 redef class Nfull_class_name
249 # All the identifiers composing this class name
250 private fun to_a
: Array[String] is abstract
252 # Access `n_class_name` on both alternatives
253 private fun n_class_name_common
: Nclass_name is abstract
255 private fun to_java_type
: JavaType
257 var jtype
= new JavaType
258 jtype
.identifier
= to_a
261 var n_params
= n_class_name_common
.n_generic_parameters
262 if n_params
!= null then jtype
.generic_params
= n_params
.n_parameters
.to_a
268 redef class Nfull_class_name_head
269 redef fun n_class_name_common
do return n_class_name
271 redef fun to_a
do return [n_class_name
.n_identifier
.text
]
274 redef class Nfull_class_name_tail
275 redef fun n_class_name_common
do return n_class_name
279 var a
= n_full_class_name
.to_a
280 a
.add n_class_name
.n_identifier
.text
285 redef class Nparameters
286 # Get the types composing this list of parameters
288 # This is used both on methods signatures and type parameters.
289 private fun to_a
: Array[JavaType] is abstract
292 redef class Nparameters_head
293 redef fun to_a
do return [n_parameter
.to_java_type
]
296 redef class Nparameters_tail
299 var a
= n_parameters
.to_a
300 a
.add n_parameter
.to_java_type
305 redef class Nparameter
306 private fun to_java_type
: JavaType
308 var jtype
= n_type
.to_java_type
311 if dots
!= null then jtype
.is_vararg
= true
318 private fun has_static
: Bool
320 for modifier
in depth
do
321 if modifier
isa NToken and modifier
.text
== "static" then return true
328 redef class Ntype_bound
329 # Get the types composing this bound
330 private fun to_a
: Array[JavaType] is abstract
333 redef class Ntype_bound_head
334 redef fun to_a
do return [n_full_class_name
.to_java_type
]
337 redef class Ntype_bound_tail
340 var a
= n_type_bound
.to_a
341 a
.add n_full_class_name
.to_java_type