nitdoc: introduce console rendering service for Model entities
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 4 May 2015 14:28:02 +0000 (10:28 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Wed, 13 May 2015 23:08:52 +0000 (19:08 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/doc/console_templates/console_model.nit [new file with mode: 0644]

diff --git a/src/doc/console_templates/console_model.nit b/src/doc/console_templates/console_model.nit
new file mode 100644 (file)
index 0000000..8de793c
--- /dev/null
@@ -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