c3e5f98fb0fe06627ce676dacfe3cb784caad835
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
)
83 var id
= n_identifier
.text
84 var return_jtype
= n_type
.to_java_type
87 var n_parameters
= n_parameters
89 if n_parameters
!= null then
90 params
= n_parameters
.to_a
91 else params
= new Array[JavaType]
93 var method
= new JavaMethod(return_jtype
, params
)
94 v
.java_class
.methods
[id
].add method
98 # Constructor declaration
99 redef class Nproperty_declaration_constructor
100 redef fun accept_visitor
(v
)
103 var n_parameters
= n_parameters
105 if n_parameters
!= null then
106 params
= n_parameters
.to_a
107 else params
= new Array[JavaType]
109 var method
= new JavaConstructor(params
)
110 v
.java_class
.constructors
.add method
114 # Variable property declaration
115 redef class Nproperty_declaration_attribute
116 redef fun accept_visitor
(v
)
118 var id
= n_identifier
.text
119 var jtype
= n_type
.to_java_type
121 # Manually count the array depth as it is after the id
122 var brackets
= n_brackets
123 if brackets
!= null then jtype
.array_dimension
+= brackets
.children
.length
125 v
.java_class
.attributes
[id
] = jtype
129 # Static property declaration
130 redef class Nproperty_declaration_static
131 redef fun accept_visitor
(v
)
141 private fun to_java_type
: JavaType
143 var jtype
= n_base_type
.to_java_type
145 var brackets
= n_brackets
146 if brackets
!= null then jtype
.array_dimension
+= brackets
.children
.length
152 redef class Nbase_type
153 private fun to_java_type
: JavaType
155 # By default, everything is bound by object
156 # TODO use a more precise bound
157 var jtype
= new JavaType
158 jtype
.identifier
.add_all
(["java", "lang", "object"])
163 redef class Nbase_type_class
164 redef fun to_java_type
do return n_full_class_name
.to_java_type
167 redef class Nbase_type_primitive
168 redef fun to_java_type
170 # All the concrete nodes under this production are tokens
172 if not node
isa NToken then continue
174 var jtype
= new JavaType
175 jtype
.identifier
.add node
.text
183 redef class Nbase_type_void
184 redef fun to_java_type
186 var jtype
= new JavaType
192 redef class Nfull_class_name
193 # All the identifiers composing this class name
194 private fun to_a
: Array[String] is abstract
196 # Access `n_class_name` on both alternatives
197 private fun n_class_name_common
: Nclass_name is abstract
199 private fun to_java_type
: JavaType
201 var jtype
= new JavaType
202 jtype
.identifier
= to_a
205 var n_params
= n_class_name_common
.n_generic_parameters
206 if n_params
!= null then jtype
.generic_params
= n_params
.n_parameters
.to_a
212 redef class Nfull_class_name_head
213 redef fun n_class_name_common
do return n_class_name
215 redef fun to_a
do return [n_class_name
.n_identifier
.text
]
218 redef class Nfull_class_name_tail
219 redef fun n_class_name_common
do return n_class_name
223 var a
= n_full_class_name
.to_a
224 a
.add n_class_name
.n_identifier
.text
229 redef class Nparameters
230 # Get the types composing this list of parameters
232 # This is used both on methods signatures and type parameters.
233 private fun to_a
: Array[JavaType] is abstract
236 redef class Nparameters_head
237 redef fun to_a
do return [n_parameter
.to_java_type
]
240 redef class Nparameters_tail
243 var a
= n_parameters
.to_a
244 a
.add n_parameter
.to_java_type
249 redef class Nparameter
250 private fun to_java_type
: JavaType
252 var jtype
= n_type
.to_java_type
255 if dots
!= null then jtype
.is_vararg
= true