899930d1ebb0ed6ece8de52241e4ae30191b2950
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 # TODO use a more precise bound
179 var jtype
= new JavaType
180 jtype
.identifier
.add_all
(["java", "lang", "object"])
185 redef class Nbase_type_class
186 redef fun to_java_type
do return n_full_class_name
.to_java_type
189 redef class Nbase_type_primitive
190 redef fun to_java_type
192 # All the concrete nodes under this production are tokens
194 if not node
isa NToken then continue
196 var jtype
= new JavaType
197 jtype
.identifier
.add node
.text
205 redef class Nbase_type_void
206 redef fun to_java_type
208 var jtype
= new JavaType
214 redef class Nbase_type_extends
215 redef fun to_java_type
do return n_generic_identifier
.to_java_type
218 redef class Ngeneric_identifier
219 private fun to_java_type
: JavaType is abstract
222 redef class Ngeneric_identifier_class
223 redef fun to_java_type
do return n_full_class_name
.to_java_type
226 redef class Ngeneric_identifier_wildcard
227 redef fun to_java_type
229 var jtype
= new JavaType
230 jtype
.identifier
.add_all
(["java", "lang", "Object"])
235 redef class Nfull_class_name
236 # All the identifiers composing this class name
237 private fun to_a
: Array[String] is abstract
239 # Access `n_class_name` on both alternatives
240 private fun n_class_name_common
: Nclass_name is abstract
242 private fun to_java_type
: JavaType
244 var jtype
= new JavaType
245 jtype
.identifier
= to_a
248 var n_params
= n_class_name_common
.n_generic_parameters
249 if n_params
!= null then jtype
.generic_params
= n_params
.n_parameters
.to_a
255 redef class Nfull_class_name_head
256 redef fun n_class_name_common
do return n_class_name
258 redef fun to_a
do return [n_class_name
.n_identifier
.text
]
261 redef class Nfull_class_name_tail
262 redef fun n_class_name_common
do return n_class_name
266 var a
= n_full_class_name
.to_a
267 a
.add n_class_name
.n_identifier
.text
272 redef class Nparameters
273 # Get the types composing this list of parameters
275 # This is used both on methods signatures and type parameters.
276 private fun to_a
: Array[JavaType] is abstract
279 redef class Nparameters_head
280 redef fun to_a
do return [n_parameter
.to_java_type
]
283 redef class Nparameters_tail
286 var a
= n_parameters
.to_a
287 a
.add n_parameter
.to_java_type
292 redef class Nparameter
293 private fun to_java_type
: JavaType
295 var jtype
= n_type
.to_java_type
298 if dots
!= null then jtype
.is_vararg
= true
305 private fun has_static
: Bool
307 for modifier
in depth
do
308 if modifier
isa NToken and modifier
.text
== "static" then return true