1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
17 import commands
::commands_parser
18 import templates
::templates_term
20 redef class CommandParser
22 fun execute
(query
: String, no_color
: nullable Bool) do
23 var cmd
= self.parse
(query
)
24 var error
= self.error
26 # If not a command, try a comment query
27 if cmd
== null and error
isa CmdParserError then
29 cmd
= new CmdComment(view
, mentity_name
= query
)
30 var opts
= new HashMap[String, String]
31 var status
= cmd
.parser_init
(query
, opts
)
32 if not status
isa CmdSuccess then error
= status
35 if error
isa CmdError or error
isa CmdWarning then
36 error
.print_message
(no_color
)
39 cmd
.as(not null).execute
(no_color
)
43 redef class DocCommand
44 fun execute
(no_color
: nullable Bool) is abstract
47 redef class CmdMessage
48 fun print_message
(no_color
: nullable Bool) do print to_s
52 redef fun print_message
(no_color
) do
53 var res
= "Error: {to_s}"
54 if no_color
== null or not no_color
then res
= res
.bold
.red
59 redef class CmdWarning
60 redef fun print_message
(no_color
) do
61 var res
= "Warning: {to_s}"
62 if no_color
== null or not no_color
then res
= res
.bold
.yellow
69 redef class ErrorMEntityNotFound
70 redef fun print_message
(no_color
) do
71 if no_color
== null or not no_color
then
72 print
"No result found for `{mentity_name.blue}`...".bold
74 print
"No result found for `{mentity_name}`..."
77 if suggestions
.not_empty
then
80 for s
in suggestions
do
81 print s
.cs_list_item
(no_color
)
88 redef class ErrorMEntityConflict
89 redef fun print_message
(no_color
) do
90 if no_color
== null or not no_color
then
91 print
"Multiple results found for `{mentity_name.blue}`...".bold
93 print
"Multiple results found for `{mentity_name}`..."
96 if conflicts
.not_empty
then
100 print s
.cs_list_item
(no_color
)
108 fun print_list
(list_title
: nullable String, list_items
: nullable Array[MEntity], no_color
: nullable Bool) do
109 if list_title
!= null then
110 if no_color
== null or not no_color
then
111 print list_title
.bold
117 if list_items
!= null and list_items
.not_empty
then
118 for mentity
in list_items
do
119 print mentity
.cs_list_item
(no_color
)
128 redef class CmdComment
129 redef fun execute
(no_color
) do
130 var mentity
= self.mentity
131 if mentity
== null then return
133 var full_name
= mentity
.cs_full_name
(no_color
)
134 if no_color
== null or not no_color
then
135 print
"Documentation for `{full_name}`:".bold
137 print
"Documentation for `{full_name}`:"
140 print
" {mentity.cs_icon(no_color)} {mentity.cs_full_name(no_color)}"
141 print
" {mentity.cs_declaration(no_color)}"
142 print
" {mentity.cs_location(no_color)}"
145 if mdoc
== null then return
147 print mdoc
.cs_comment
(no_color
, 3)
149 print
" {mdoc.cs_short_comment(no_color)}\n"
154 redef class CmdAncestors
155 redef fun execute
(no_color
) do
156 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
157 print_list
("Ancestors for `{full_name}`:", results
, no_color
)
161 redef class CmdParents
162 redef fun execute
(no_color
) do
163 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
164 print_list
("Parents for `{full_name}`:", results
, no_color
)
168 redef class CmdChildren
169 redef fun execute
(no_color
) do
170 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
171 print_list
("Children for `{full_name}`:", results
, no_color
)
175 redef class CmdDescendants
176 redef fun execute
(no_color
) do
177 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
178 print_list
("Descendants for `{full_name}`:", results
, no_color
)
182 redef class CmdLinearization
183 redef fun execute
(no_color
) do
184 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
185 print_list
("Linearization for `{full_name}`:", results
, no_color
)
189 redef class CmdSearch
190 redef fun execute
(no_color
) do
191 print_list
("Search results for `{query.as(not null)}`:", results
, no_color
)
195 redef class CmdModelEntities
196 redef fun execute
(no_color
) do
198 if no_color
!= null and not no_color
then kind
= kind
.blue
199 print_list
("MEntities for kind `{kind}`:", results
, no_color
)
203 redef class CmdFeatures
204 redef fun execute
(no_color
) do
205 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
206 print_list
("Features for `{full_name}`:", results
, no_color
)
210 redef class CmdEntityCode
212 redef var format
= "ansi" is optional
214 redef fun execute
(no_color
) do
215 var mentity
= self.mentity
216 if mentity
== null then return
218 var title
= "Code for `{mentity.cs_full_name(no_color)}`:"
219 if no_color
== null or not no_color
then
224 if no_color
== null or not no_color
then
225 var ansi
= render_code
(node
)
228 print ansi
.write_to_string
232 printn mentity
.cs_source_code
238 redef fun execute
(no_color
) do
240 var dot
= self.render
241 if dot
== null then return
242 var f
= new ProcessWriter("dot", "-Txlib")
243 f
.write dot
.write_to_string
252 redef fun execute
(no_color
) do
253 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
254 print_list
("Methods calling `{full_name}`:", results
, no_color
)
259 redef fun execute
(no_color
) do
260 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
261 print_list
("Methods intializing `{full_name}`:", results
, no_color
)
265 redef class CmdReturn
266 redef fun execute
(no_color
) do
267 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
268 print_list
("Methods returning `{full_name}`:", results
, no_color
)
273 redef fun execute
(no_color
) do
274 var full_name
= mentity
.as(not null).cs_full_name
(no_color
)
275 print_list
("Methods accepting `{full_name}` as parameter:", results
, no_color
)
281 redef class CmdCatalogPackages
282 redef fun execute
(no_color
) do
283 print_list
("Packages from catalog:", results
, no_color
)
287 redef class CmdCatalogStats
288 redef fun execute
(no_color
) do
289 if no_color
== null or not no_color
then
290 print
"Catalog statistics:".bold
292 print
"Catalog statistics:"
295 var stats
= self.stats
.as(not null)
296 print
" * {stats.packages} packages"
297 print
" * {stats.modules} modules"
298 print
" * {stats.methods} methods"
299 print
" * {stats.classes} classes"
300 print
" * {stats.loc} lines of code"
301 print
" * {stats.contributors} contributors"
302 print
" * {stats.maintainers} maintainers"
303 print
" * {stats.tags} tags"
307 redef class CmdCatalogTags
308 redef fun execute
(no_color
) do
309 if no_color
== null or not no_color
then
310 print
"Tags from catalog:".bold
312 print
"Tags from catalog:"
316 var counts
= self.packages_count_by_tags
.as(not null)
317 for tag
, count
in counts
do
318 if no_color
== null or not no_color
then
319 print
" * {tag.blue.bold}: {count} packages"
321 print
" * {tag}: {count} packages"
327 redef class CmdCatalogTag
328 redef fun execute
(no_color
) do
329 var tag
= self.tag
.as(not null)
330 if no_color
== null or not no_color
then tag
= tag
.blue
.bold
331 print_list
("Packages tagged with `{tag}`:", results
, no_color
)
335 redef class CmdCatalogMaintaining
336 redef fun execute
(no_color
) do
337 var name
= self.person_name
.as(not null)
338 if no_color
== null or not no_color
then name
= name
.blue
.bold
339 print_list
("Packages maintained by `{name}`:", results
, no_color
)
343 redef class CmdCatalogContributing
344 redef fun execute
(no_color
) do
345 var name
= self.person_name
.as(not null)
346 if no_color
== null or not no_color
then name
= name
.blue
.bold
347 print_list
("Packages contributed by `{name}`:", results
, no_color
)