d6539691c71ce50014311a5acc7e071829019597
[nit.git] / src / doc / term / term.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
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
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 module term
16
17 import commands::commands_parser
18 import templates::term_model
19
20 redef class CommandParser
21
22 fun execute(query: String, no_color: nullable Bool) do
23 var cmd = self.parse(query)
24 var error = self.error
25
26 # Translate links to doc commands
27 if cmd isa CmdEntityLink then
28 cmd = new CmdComment(model, filter, mentity_name = query)
29 var opts = new HashMap[String, String]
30 var status = cmd.parser_init(query, opts)
31 if not status isa CmdSuccess then error = status
32 end
33
34 if error isa CmdError or error isa CmdWarning then
35 error.print_message(no_color)
36 print ""
37 end
38 if cmd == null then return
39 cmd.execute(no_color)
40 end
41 end
42
43 redef class DocCommand
44 fun execute(no_color: nullable Bool) is abstract
45 end
46
47 redef class CmdMessage
48 fun print_message(no_color: nullable Bool) do print to_s
49 end
50
51 redef class CmdError
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
55 print res
56 end
57 end
58
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
63 print res
64 end
65 end
66
67 # Model queries
68
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
73 else
74 print "No result found for `{mentity_name}`..."
75 end
76 print ""
77 if suggestions.not_empty then
78 print "Did you mean?"
79 print ""
80 for s in suggestions do
81 print s.cs_list_item(no_color)
82 print ""
83 end
84 end
85 end
86 end
87
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
92 else
93 print "Multiple results found for `{mentity_name}`..."
94 end
95 print ""
96 if conflicts.not_empty then
97 print "Did you mean?"
98 print ""
99 for s in conflicts do
100 print s.cs_list_item(no_color)
101 print ""
102 end
103 end
104 end
105 end
106
107 redef class CmdList
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
112 else
113 print list_title
114 end
115 print ""
116 end
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)
120 print ""
121 end
122 else
123 print "None."
124 end
125 end
126 end
127
128 redef class CmdComment
129 redef fun execute(no_color) do
130 var mentity = self.mentity
131 if mentity == null then return
132
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
136 else
137 print "Documentation for `{full_name}`:"
138 end
139 print ""
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)}"
143 print ""
144 var mdoc = self.mdoc
145 if mdoc == null then return
146 if full_doc then
147 print mdoc.cs_comment(no_color, 3)
148 else
149 print " {mdoc.cs_short_comment(no_color)}\n"
150 end
151 end
152 end
153
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)
158 end
159 end
160
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)
165 end
166 end
167
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)
172 end
173 end
174
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)
179 end
180 end
181
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)
186 end
187 end
188
189 redef class CmdSearch
190 redef fun execute(no_color) do
191 print_list("Search results for `{query.as(not null)}`:", results, no_color)
192 end
193 end
194
195 redef class CmdModelEntities
196 redef fun execute(no_color) do
197 var kind = self.kind
198 if no_color != null and not no_color then kind = kind.blue
199 print_list("MEntities for kind `{kind}`:", results, no_color)
200 end
201 end
202
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)
207 end
208 end
209
210 redef class CmdEntityCode
211
212 redef var format = "ansi" is optional
213
214 redef fun execute(no_color) do
215 var mentity = self.mentity
216 if mentity == null then return
217
218 var title = "Code for `{mentity.cs_full_name(no_color)}`:"
219 if no_color == null or not no_color then
220 print title.bold
221 else
222 print title
223 end
224 var node = self.node
225 if (no_color == null or not no_color) and node != null then
226 var ansi = render_code(node)
227 print "~~~"
228 print ansi.write_to_string
229 print "~~~"
230 else
231 printn mentity.cs_source_code
232 end
233 end
234 end
235
236 redef class CmdGraph
237 redef fun execute(no_color) do
238 format = "dot"
239 var dot = self.render
240 if dot == null then return
241 var f = new ProcessWriter("dot", "-Txlib")
242 f.write dot.write_to_string
243 f.close
244 f.wait
245 end
246 end
247
248 # CmdUsage
249
250 redef class CmdCall
251 redef fun execute(no_color) do
252 var full_name = mentity.as(not null).cs_full_name(no_color)
253 print_list("Methods calling `{full_name}`:", results, no_color)
254 end
255 end
256
257 redef class CmdNew
258 redef fun execute(no_color) do
259 var full_name = mentity.as(not null).cs_full_name(no_color)
260 print_list("Methods intializing `{full_name}`:", results, no_color)
261 end
262 end
263
264 redef class CmdReturn
265 redef fun execute(no_color) do
266 var full_name = mentity.as(not null).cs_full_name(no_color)
267 print_list("Methods returning `{full_name}`:", results, no_color)
268 end
269 end
270
271 redef class CmdParam
272 redef fun execute(no_color) do
273 var full_name = mentity.as(not null).cs_full_name(no_color)
274 print_list("Methods accepting `{full_name}` as parameter:", results, no_color)
275 end
276 end
277
278 # CmdCatalog
279
280 redef class CmdCatalogPackages
281 redef fun execute(no_color) do
282 print_list("Packages from catalog:", results, no_color)
283 end
284 end
285
286 redef class CmdCatalogStats
287 redef fun execute(no_color) do
288 if no_color == null or not no_color then
289 print "Catalog statistics:".bold
290 else
291 print "Catalog statistics:"
292 end
293
294 var stats = self.stats.as(not null)
295 print " * {stats.packages} packages"
296 print " * {stats.modules} modules"
297 print " * {stats.methods} methods"
298 print " * {stats.classes} classes"
299 print " * {stats.loc} lines of code"
300 print " * {stats.contributors} contributors"
301 print " * {stats.maintainers} maintainers"
302 print " * {stats.tags} tags"
303 end
304 end
305
306 redef class CmdCatalogTags
307 redef fun execute(no_color) do
308 if no_color == null or not no_color then
309 print "Tags from catalog:".bold
310 else
311 print "Tags from catalog:"
312 end
313
314 print ""
315 var counts = self.packages_count_by_tags.as(not null)
316 for tag, count in counts do
317 if no_color == null or not no_color then
318 print " * {tag.blue.bold}: {count} packages"
319 else
320 print " * {tag}: {count} packages"
321 end
322 end
323 end
324 end
325
326 redef class CmdCatalogTag
327 redef fun execute(no_color) do
328 var tag = self.tag.as(not null)
329 if no_color == null or not no_color then tag = tag.blue.bold
330 print_list("Packages tagged with `{tag}`:", results, no_color)
331 end
332 end
333
334 redef class CmdCatalogMaintaining
335 redef fun execute(no_color) do
336 var name = self.person_name.as(not null)
337 if no_color == null or not no_color then name = name.blue.bold
338 print_list("Packages maintained by `{name}`:", results, no_color)
339 end
340 end
341
342 redef class CmdCatalogContributing
343 redef fun execute(no_color) do
344 var name = self.person_name.as(not null)
345 if no_color == null or not no_color then name = name.blue.bold
346 print_list("Packages contributed by `{name}`:", results, no_color)
347 end
348 end
349
350 # CmdIni
351
352 redef class CmdIni
353 # Print ini data
354 fun print_ini(title: String, data: nullable String, no_color: nullable Bool) do
355 if data == null then return
356 if no_color == null or not no_color then
357 print title.bold
358 else
359 print title
360 end
361 print ""
362 print data
363 end
364 end
365
366 redef class CmdIniDescription
367 redef fun execute(no_color) do
368 var title = "Description from ini file:"
369 print_ini(title, desc, no_color)
370 end
371 end
372
373 redef class CmdIniGitUrl
374 redef fun execute(no_color) do
375 var title = "Git URL from ini file:"
376 print_ini(title, url, no_color)
377 end
378 end
379
380 redef class CmdIniCloneCommand
381 redef fun execute(no_color) do
382 var title = "Git clone command from ini file:"
383 print_ini(title, command, no_color)
384 end
385 end
386
387 redef class CmdIniIssuesUrl
388 redef fun execute(no_color) do
389 var title = "Issues URL from ini file:"
390 print_ini(title, url, no_color)
391 end
392 end
393
394 redef class CmdIniMaintainer
395 redef fun execute(no_color) do
396 var title = "Maintainer from ini file:"
397 print_ini(title, maintainer, no_color)
398 end
399 end
400
401 redef class CmdIniContributors
402 redef fun execute(no_color) do
403 var contributors = self.contributors
404 if contributors == null then return
405 var title = "Contributors list from ini file:"
406 if no_color == null or not no_color then
407 print title.bold
408 else
409 print title
410 end
411 print ""
412 for contributor in contributors do
413 print " * {contributor}"
414 end
415 end
416 end
417
418 redef class CmdIniLicense
419 redef fun execute(no_color) do
420 var title = "License from ini file:"
421 print_ini(title, license, no_color)
422 end
423 end
424
425 redef class CmdEntityFile
426
427 # Print file
428 fun print_file(title: String, no_color: nullable Bool) do
429 var file = self.file
430 if file == null then return
431 title = "{title} `{file}`:"
432 if no_color == null or not no_color then
433 print title.bold
434 else
435 print title
436 end
437 print ""
438 print file.to_path.read_all
439 print ""
440 end
441 end
442
443 redef class CmdLicenseFile
444 redef fun execute(no_color) do
445 print_file("License from", no_color)
446 end
447 end
448
449 redef class CmdContribFile
450 redef fun execute(no_color) do
451 print_file("Contributing rules from", no_color)
452 end
453 end
454
455 # CmdMain
456
457 redef class CmdMains
458 redef fun execute(no_color) do
459 var mentity = self.mentity.as(not null).full_name
460 if no_color == null or not no_color then mentity = mentity.blue.bold
461 print_list("Mains in `{mentity}`:", results, no_color)
462 end
463 end
464
465 redef class CmdMainCompile
466 redef fun execute(no_color) do
467 var mentity = self.mentity.as(not null).full_name
468 if no_color == null or not no_color then mentity = mentity.blue.bold
469 var title = "Compiling `{mentity}`:"
470
471 if no_color == null or not no_color then
472 print title.bold
473 else
474 print title
475 end
476
477 print ""
478 var command = self.command
479 if command != null then print command
480 end
481 end
482
483 redef class CmdTesting
484 redef fun execute(no_color) do
485 var mentity = self.mentity.as(not null).full_name
486 if no_color == null or not no_color then mentity = mentity.blue.bold
487 var title = "Testing `{mentity}`:"
488
489 if no_color == null or not no_color then
490 print title.bold
491 else
492 print title
493 end
494
495 print ""
496 var command = self.command
497 if command != null then print command
498 end
499 end
500
501 redef class CmdManSynopsis
502 redef fun execute(no_color) do
503 var mentity = self.mentity.as(not null).full_name
504 if no_color == null or not no_color then mentity = mentity.blue.bold
505 var title = "Synopsis for `{mentity}`:"
506
507 if no_color == null or not no_color then
508 print title.bold
509 else
510 print title
511 end
512
513 print ""
514 var synopsis = self.synopsis
515 if synopsis != null then print synopsis
516 end
517 end
518
519 redef class CmdManOptions
520 redef fun execute(no_color) do
521 var mentity = self.mentity.as(not null).full_name
522 if no_color == null or not no_color then mentity = mentity.blue.bold
523 var title = "Options for `{mentity}`:"
524
525 if no_color == null or not no_color then
526 print title.bold
527 else
528 print title
529 end
530
531 print ""
532 var options = self.options.as(not null)
533 for opt, desc in options do
534 if no_color == null or not no_color then
535 print " * {opt.blue.bold}: {desc}"
536 else
537 print " * {opt}: {desc}"
538 end
539 end
540 end
541 end