X-Git-Url: http://nitlanguage.org diff --git a/src/doc/doc_phases/doc_console.nit b/src/doc/doc_phases/doc_console.nit index 2d9ad8e..b6d08dc 100644 --- a/src/doc/doc_phases/doc_console.nit +++ b/src/doc/doc_phases/doc_console.nit @@ -19,6 +19,8 @@ module doc_console import semantize +import doc_extract +import doc_poset import doc::console_templates # Nitx handles console I/O. @@ -57,16 +59,24 @@ class Nitx # Displays the list of available commands. fun help do - print "\nCommands:" - print "\tname\t\tlookup module, class and property with the corresponding 'name'" + print "\nCommands:\n" + print "\tname\t\t\tlookup module, class and property with the corresponding 'name'" print "\tdoc: \tdisplay the documentation page of 'namespace'" - print "\tparam: \tlookup methods using the corresponding 'Type' as parameter" - print "\treturn: \tlookup methods returning the corresponding 'Type'" - print "\tnew: \tlookup methods creating new instances of 'Type'" - print "\tcall: \tlookup methods calling 'name'" - print "\tcode: \tdisplay the source code associated to the 'name' entity" - print "\t:h\t\tdisplay this help message" - print "\t:q\t\tquit interactive mode" + print "\nType lookup:" + print "\tparam: \t\tlookup methods using the corresponding 'Type' as parameter" + print "\treturn: \t\tlookup methods returning the corresponding 'Type'" + print "\tnew: \t\tlookup methods creating new instances of 'Type'" + print "\tcall: \t\tlookup methods calling 'name'" + print "\nHierarchy lookup:" + print "\tparents: \tlist direct parents of 'Class'" + print "\tancestors: \tlist all ancestors of 'Class'" + print "\tchildren: \tlist direct children of 'Class'" + print "\tdescendants: \tlist all descendants of 'Class'" + print "\nCode lookup:" + print "\tcode: \t\tdisplay the source code associated to the 'name' entity" + print "\n" + print "\t:h\t\t\tdisplay this help message" + print "\t:q\t\t\tquit interactive mode" print "" end @@ -79,19 +89,14 @@ class Nitx # Processes the query string and performs it. fun do_query(str: String) do - var query = parse_query(str) - var res = query.perform(self, doc) - var page = query.make_results(self, res) - print page.write_to_string - end - - # Returns an `NitxQuery` from a raw query string. - fun parse_query(str: String): NitxQuery do var query = new NitxQuery(str) if query isa NitxCommand then query.execute(self) + return end - return query + var res = query.perform(self, doc) + var page = query.make_results(self, res) + print page.write_to_string end end @@ -128,7 +133,14 @@ interface NitxQuery return new CallQuery(query_string) else if query_string.has_prefix("code:") then return new CodeQuery(query_string) - + else if query_string.has_prefix("parents:") then + return new ParentsQuery(query_string) + else if query_string.has_prefix("ancestors:") then + return new AncestorsQuery(query_string) + else if query_string.has_prefix("children:") then + return new ChildrenQuery(query_string) + else if query_string.has_prefix("descendants:") then + return new DescendantsQuery(query_string) end return new CommentQuery("comment: {query_string}") end @@ -138,8 +150,8 @@ interface NitxQuery # Pretty prints the results for the console. fun make_results(nitx: Nitx, results: Array[NitxMatch]): DocPage do - var page = new DocPage("Results") - page.root.add_child(new QueryResultArticle(self, results)) + var page = new DocPage("results", "Results") + page.root.add_child(new QueryResultArticle("results.article", "Results", self, results)) return page end @@ -214,8 +226,8 @@ class CommentQuery if len == 1 then var res = results.first.as(MEntityMatch) var mentity = res.mentity - var page = new DocPage("Results") - var article = new DefinitionArticle(mentity) + var page = new DocPage("results", "Results") + var article = new DefinitionArticle("results.article", "Results", mentity) article.cs_title = mentity.name article.cs_subtitle = mentity.cs_declaration page.root.add_child article @@ -317,7 +329,7 @@ class DocQuery redef fun perform(nitx, doc) do var res = new Array[NitxMatch] var name = args.first - for page in doc.pages do + for page in doc.pages.values do if name == "*" then # FIXME dev only res.add new PageMatch(self, page) else if page.title == name then @@ -360,6 +372,76 @@ class PageMatch end end +# Search in class or module hierarchy of a `MEntity`. +# +# It actually searches for pages about the mentity and extracts the +# pre-calculated hierarchies by the `doc_post` phase. +abstract class HierarchiesQuery + super DocQuery + + redef fun make_results(nitx, results) do + var page = new DocPage("hierarchy", "Hierarchy") + for result in results do + if not result isa PageMatch then continue + var rpage = result.page + if not rpage isa MClassPage then continue + page.root.add_child build_article(rpage) + end + return page + end + + # Build an article containing the hierarchy list depending on subclasses. + private fun build_article(page: MClassPage): DocArticle is abstract +end + +# List all parents of a `MClass`. +class AncestorsQuery + super HierarchiesQuery + + redef fun build_article(page) do + return new MEntitiesListArticle( + "ancerstors", + "Ancestors for {page.mentity.name}", + page.ancestors.to_a) + end +end + +# List direct parents of a `MClass`. +class ParentsQuery + super HierarchiesQuery + + redef fun build_article(page) do + return new MEntitiesListArticle( + "parents", + "Parents for {page.mentity.name}", + page.parents.to_a) + end +end + +# List direct children of a `MClass`. +class ChildrenQuery + super HierarchiesQuery + + redef fun build_article(page) do + return new MEntitiesListArticle( + "children", + "Children for {page.mentity.name}", + page.children.to_a) + end +end + +# List all descendants of a `MClass`. +class DescendantsQuery + super HierarchiesQuery + + redef fun build_article(page) do + return new MEntitiesListArticle( + "descendants", + "Descendants for {page.mentity.name}", + page.children.to_a) + end +end + # A query to search source code from a file name. class CodeQuery super MetaQuery @@ -386,9 +468,9 @@ class CodeQuery end redef fun make_results(nitx, results) do - var page = new DocPage("Code Results") + var page = new DocPage("results", "Code Results") for res in results do - page.add new CodeQueryArticle(self, res.as(CodeMatch)) + page.add new CodeQueryArticle("results.article", "Results", self, res.as(CodeMatch)) end return page end