From: Alexandre Terrasa Date: Mon, 4 May 2015 14:28:02 +0000 (-0400) Subject: nitdoc: introduce console rendering service for Model entities X-Git-Tag: v0.7.5~41^2~2 X-Git-Url: http://nitlanguage.org nitdoc: introduce console rendering service for Model entities Signed-off-by: Alexandre Terrasa --- diff --git a/src/doc/console_templates/console_model.nit b/src/doc/console_templates/console_model.nit new file mode 100644 index 0000000..8de793c --- /dev/null +++ b/src/doc/console_templates/console_model.nit @@ -0,0 +1,638 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Console templates for Nit model MEntities. +# +# This module introduces console rendering services in model entities. +module console_model + +import console +import doc_base +import ordered_tree + +redef class MDoc + # Returns the full comment formatted for the console. + fun cs_comment: String do + var res = new FlatBuffer + for line in content do + res.append " {line}\n" + end + return res.write_to_string + end + + # Returns the synopsys formatted for the console. + fun cs_short_comment: String do return content.first +end + +redef class MEntity + + # Returns the mentity name with short signature. + # + # * MProject: `foo` + # * MGroup: `foo` + # * MModule: `foo` + # * MClass: `Foo[E]` + # * MClassDef: `Foo[E]` + # * MProperty: `foo(e)` + # * MPropdef: `foo(e)` + var cs_name: String is lazy do return name + + # Returns the list of keyword used in `self` declaration. + fun cs_modifiers: Array[String] is abstract + + # Returns the complete MEntity declaration (modifiers + name + signature). + # + # * MProject: `project foo` + # * MGroup: `group foo` + # * MModule: `module foo` + # * MClass: `private abstract class Foo[E: Object]` + # * MClassDef: `redef class Foo[E]` + # * MProperty: `private fun foo(e: Object): Int` + # * MPropdef: `redef fun foo(e)` + var cs_declaration: String is lazy do + var tpl = new FlatBuffer + tpl.append cs_modifiers.join(" ") + tpl.append " " + tpl.append cs_name + return tpl.write_to_string + end + + # Returns `self` namespace formatted for console. + # + # * MProject: `mproject` + # * MGroup: `mproject(::group)` + # * MModule: `mgroup::mmodule` + # * MClass: `mproject::mclass` + # * MClassDef: `mmodule::mclassdef` + # * MProperty: `mclass::mprop` + # * MPropdef: `mclassdef:mpropdef` + fun cs_namespace: String is abstract + + # Returns the comment of this MEntity formatted for console. + var cs_comment: nullable String is lazy do + var mdoc = mdoc_or_fallback + if mdoc == null then return null + # FIXME add markdown for console + return mdoc.cs_comment + end + + # Returns the comment of this MEntity formatted for console. + var cs_short_comment: nullable String is lazy do + var mdoc = mdoc_or_fallback + if mdoc == null then return null + return mdoc.cs_short_comment + end + + # Returns 1self` as a list element that can be displayed in console. + fun cs_list_item: String do + var tpl = new FlatBuffer + tpl.append " {cs_visibility_color(cs_icon).bold} {cs_name.blue.bold}" + var comment = cs_short_comment + if comment != null then + tpl.append " # {comment}".green + end + tpl.append "\n " + tpl.append cs_namespace.gray.bold + tpl.append "\n " + tpl.append cs_declaration + tpl.append "\n " + tpl.append cs_location.gray + return tpl.write_to_string + end + + # ASCII icon to be displayed in front of the list item. + fun cs_icon: String do return "*" + + # Source code location of this MEntity formatted for console. + fun cs_location: String is abstract + + # Sets text color depending on visibility. + # + # See module `console`. + fun cs_visibility_color(string: String): String do return string.green +end + +redef class MProject + redef var cs_modifiers = ["project"] + redef fun cs_namespace do return cs_name + redef fun cs_icon do return "P" + redef fun cs_location do return root.mmodules.first.location.to_s +end + +redef class MGroup + redef var cs_modifiers = ["group"] + redef fun cs_icon do return "G" + + # Depends if `self` is root or not. + # + # * If root `mproject`. + # * Else `mproject::self`. + redef fun cs_namespace do + var tpl = new FlatBuffer + tpl.append mproject.cs_namespace + if mproject.root != self then + tpl.append "::" + tpl.append cs_name + end + return tpl.write_to_string + end + + redef fun cs_location do return mmodules.first.location.to_s +end + +redef class MModule + redef var cs_modifiers = ["module"] + redef fun cs_icon do return "M" + + # Depends if `self` belongs to a MGroup. + # + # * If mgroup `mgroup::self`. + # * Else `self`. + redef fun cs_namespace do + var tpl = new FlatBuffer + if mgroup != null then + tpl.append mgroup.cs_namespace + tpl.append "::" + end + tpl.append cs_name + return tpl.write_to_string + end + + redef fun cs_location do return location.to_s +end + +redef class MClass + redef fun mdoc_or_fallback do return intro.mdoc + redef fun cs_icon do return intro.cs_icon + + # Format: `Foo[E]` + redef var cs_name is lazy do + var tpl = new FlatBuffer + tpl.append name + if arity > 0 then + tpl.append "[" + var parameter_names = new Array[String] + for p in mparameters do + parameter_names.add(p.cs_name) + end + tpl.append parameter_names.join(", ") + tpl.append "]" + end + return tpl.write_to_string + end + + redef fun cs_modifiers do return intro.cs_modifiers + redef fun cs_declaration do return intro.cs_declaration + + # Returns `mproject::self`. + redef fun cs_namespace do + var tpl = new FlatBuffer + tpl.append intro_mmodule.mgroup.mproject.cs_namespace + tpl.append "::" + tpl.append cs_name + return tpl.write_to_string + end + + # Returns `intro.cs_short_signature`. + fun cs_short_signature: String do return intro.cs_short_signature + + # Returns `intro.cs_signature`. + fun cs_signature: String do return intro.cs_signature + + redef fun cs_visibility_color(string) do + if visibility == private_visibility then + return string.red + else if visibility == protected_visibility then + return string.yellow + end + return string.green + end + + redef fun cs_location do return intro.location.to_s +end + +redef class MClassDef + redef fun mdoc_or_fallback do return mdoc or else mclass.mdoc_or_fallback + redef fun cs_icon do return "C" + + # Depends if `self` is an intro or not. + # + # * If intro contains the visibility and kind. + # * If redef contains the `redef` keyword and kind. + redef fun cs_modifiers do + var res = new Array[String] + if not is_intro then + res.add "redef" + else + if mclass.visibility != public_visibility then + res.add mclass.visibility.to_s + end + end + res.add mclass.kind.to_s + return res + end + + # Depends if `self` is an intro or not. + # + # For intro: `private abstract class Foo[E: Object]` + # For redef: `redef class Foo[E]` + redef fun cs_declaration do + var tpl = new FlatBuffer + tpl.append cs_modifiers.join(" ") + tpl.append " " + tpl.append cs_name + if is_intro then + tpl.append cs_signature + else + tpl.append cs_short_signature + end + return tpl.write_to_string.write_to_string.write_to_string + end + + # Returns `mmodule::self` + redef fun cs_namespace do + var tpl = new FlatBuffer + tpl.append mmodule.cs_namespace + tpl.append "::" + tpl.append mclass.cs_name + return tpl.write_to_string.write_to_string + end + + # Returns the MClassDef generic signature without static bounds. + fun cs_short_signature: String do + var tpl = new FlatBuffer + var mparameters = mclass.mparameters + if not mparameters.is_empty then + tpl.append "[" + for i in [0..mparameters.length[ do + tpl.append mparameters[i].cs_name + if i < mparameters.length - 1 then tpl.append ", " + end + tpl.append "]" + end + return tpl.write_to_string + end + + # Returns the MClassDef generic signature with static bounds. + fun cs_signature: String do + var tpl = new FlatBuffer + var mparameters = mclass.mparameters + if not mparameters.is_empty then + tpl.append "[" + for i in [0..mparameters.length[ do + tpl.append "{mparameters[i].cs_name}: " + tpl.append bound_mtype.arguments[i].cs_signature + if i < mparameters.length - 1 then tpl.append ", " + end + tpl.append "]" + end + return tpl.write_to_string + end + + redef fun cs_location do return location.to_s +end + +redef class MProperty + redef fun mdoc_or_fallback do return intro.mdoc + redef fun cs_modifiers do return intro.cs_modifiers + redef fun cs_declaration do return intro.cs_declaration + redef fun cs_icon do return intro.cs_icon + + # Returns `mclass::self`. + redef fun cs_namespace do + var tpl = new FlatBuffer + tpl.append intro_mclassdef.mclass.cs_namespace + tpl.append "::" + tpl.append intro.cs_name + return tpl.write_to_string + end + + # Returns `intro.cs_short_signature`. + fun cs_short_signature: String do return intro.cs_short_signature + + # Returns `intro.cs_signature`. + fun cs_signature: String do return intro.cs_signature + + redef fun cs_visibility_color(string) do + if visibility == private_visibility then + return string.red + else if visibility == protected_visibility then + return string.yellow + end + return string.green + end + + # Returns `intro.cs_location`. + redef fun cs_location do return intro.location.to_s +end + +redef class MPropDef + redef fun mdoc_or_fallback do return mdoc or else mproperty.mdoc_or_fallback + + # Depends if `self` is an intro or not. + # + # * If intro contains the visibility and kind. + # * If redef contains the `redef` keyword and kind. + redef fun cs_modifiers do + var res = new Array[String] + if not is_intro then + res.add "redef" + else + if mproperty.visibility != public_visibility then + res.add mproperty.visibility.to_s + end + end + return res + end + + # Depends if `self` is an intro or not. + # + # For intro: `private fun foo(e: Object): Bar is abstract` + # For redef: `redef fun foo(e) is cached` + redef fun cs_declaration do + var tpl = new FlatBuffer + tpl.append cs_modifiers.join(" ") + tpl.append " " + if is_intro then + tpl.append cs_name + tpl.append cs_signature + else + tpl.append mproperty.intro.cs_name + tpl.append cs_short_signature + end + return tpl.write_to_string + end + + # Returns `mclassdef::self` + redef fun cs_namespace do + var tpl = new FlatBuffer + tpl.append mclassdef.cs_namespace + tpl.append "::" + tpl.append cs_name + return tpl.write_to_string + end + + redef fun cs_location do return location.to_s + + # Returns the MPropdDef signature without static types. + fun cs_short_signature: String is abstract + + # Returns the MPropDef signature with static types. + fun cs_signature: String is abstract +end + +redef class MAttributeDef + + redef fun cs_modifiers do + var res = super + res.add "var" + return res + end + + redef fun cs_short_signature do return "" + + redef fun cs_signature do + var tpl = new FlatBuffer + if static_mtype != null then + tpl.append ": " + tpl.append static_mtype.cs_signature + end + return tpl.write_to_string + end + + redef fun cs_icon do return "A" +end + +redef class MMethodDef + + redef fun cs_modifiers do + if mproperty.is_init then + var res = new Array[String] + if mproperty.visibility != public_visibility then + res.add mproperty.visibility.to_s + end + return res + end + var res = super + if is_abstract then + res.add "abstract" + else if is_intern then + res.add "intern" + end + res.add "fun" + return res + end + + redef fun cs_declaration do + if mproperty.is_init then + var tpl = new FlatBuffer + if not cs_modifiers.is_empty then + tpl.append cs_modifiers.join(" ") + tpl.append " " + end + tpl.append cs_name + tpl.append cs_signature + return tpl.write_to_string + end + return super + end + + redef fun cs_short_signature do + if mproperty.is_root_init then + return new_msignature.cs_short_signature + end + return msignature.cs_short_signature + end + + redef fun cs_signature do + if mproperty.is_root_init then + return new_msignature.cs_signature + end + return msignature.cs_signature + end + + redef fun cs_icon do + if mproperty.is_init then + return "I" + end + return "F" + end +end + +redef class MVirtualTypeDef + + redef fun cs_modifiers do + var res = super + res.add "type" + return res + end + + # Short signature for `MVirtualType` is always empty. + redef fun cs_short_signature do return "" + + redef fun cs_signature do + var tpl = new FlatBuffer + if bound == null then return tpl.write_to_string + tpl.append ": " + tpl.append bound.cs_signature + return tpl.write_to_string + end + redef fun cs_icon do return "V" +end + +redef class MType + # Returns the signature of this type whithout bounds. + fun cs_short_signature: String is abstract + + # Returns the signature of this type. + fun cs_signature: String is abstract + + redef fun cs_icon do return "T" +end + +redef class MClassType + redef fun cs_short_signature do return cs_name + redef fun cs_signature do return cs_name +end + +redef class MNullableType + + redef fun cs_short_signature do + var tpl = new FlatBuffer + tpl.append "nullable " + tpl.append mtype.cs_short_signature + return tpl.write_to_string + end + + redef fun cs_signature do + var tpl = new FlatBuffer + tpl.append "nullable " + tpl.append mtype.cs_signature + return tpl.write_to_string + end +end + +redef class MGenericType + redef fun cs_short_signature do + var tpl = new FlatBuffer + tpl.append name + tpl.append "[" + for i in [0..arguments.length[ do + tpl.append arguments[i].cs_short_signature + if i < arguments.length - 1 then tpl.append ", " + end + tpl.append "]" + return tpl.write_to_string + end + + redef fun cs_signature do + var tpl = new FlatBuffer + tpl.append mclass.name + tpl.append "[" + for i in [0..arguments.length[ do + tpl.append arguments[i].cs_signature + if i < arguments.length - 1 then tpl.append ", " + end + tpl.append "]" + return tpl.write_to_string + end +end + +redef class MParameterType + redef fun cs_short_signature do return cs_name + redef fun cs_signature do return cs_name +end + +redef class MVirtualType + redef fun cs_signature do return cs_name +end + +redef class MSignature + + redef fun cs_short_signature do + var tpl = new FlatBuffer + if not mparameters.is_empty then + tpl.append "(" + for i in [0..mparameters.length[ do + tpl.append mparameters[i].cs_short_signature + if i < mparameters.length - 1 then tpl.append ", " + end + tpl.append ")" + end + return tpl.write_to_string + end + + redef fun cs_signature do + var tpl = new FlatBuffer + if not mparameters.is_empty then + tpl.append "(" + for i in [0..mparameters.length[ do + tpl.append mparameters[i].cs_signature + if i < mparameters.length - 1 then tpl.append ", " + end + tpl.append ")" + end + if return_mtype != null then + tpl.append ": " + tpl.append return_mtype.cs_signature + end + return tpl.write_to_string + end +end + +redef class MParameter + + # Returns `self` name and ellipsys if any. + fun cs_short_signature: String do + var tpl = new FlatBuffer + tpl.append name + if is_vararg then tpl.append "..." + return tpl.write_to_string + end + + # Returns `self` name with it's static type and ellipsys if any. + fun cs_signature: String do + var tpl = new FlatBuffer + tpl.append "{name}: " + tpl.append mtype.cs_signature + if is_vararg then tpl.append "..." + return tpl.write_to_string + end +end + +################################################################################ +# Additions to `model_ext`. + +redef class MRawType + redef fun cs_signature do + var tpl = new FlatBuffer + + for part in parts do + if part.target != null then + tpl.append part.target.as(not null).cs_name + else + tpl.append part.text + end + end + return tpl.write_to_string + end +end + +redef class MInnerClass + redef fun cs_signature do return inner.cs_signature +end + +redef class MInnerClassDef + redef fun cs_signature do return inner.cs_signature +end