X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/src/doc/vim_autocomplete.nit b/src/doc/vim_autocomplete.nit index 10c6bc0..edbc126 100644 --- a/src/doc/vim_autocomplete.nit +++ b/src/doc/vim_autocomplete.nit @@ -52,7 +52,7 @@ redef class MEntity private fun field_separator: String do return "#====#" private fun line_separator: String do return "#nnnn#" - private fun write_to_stream(stream: Writer) + private fun write_doc(mainmodule: MModule, stream: Writer) do # 1. Short name for autocompletion stream.write complete_name @@ -71,13 +71,14 @@ redef class MEntity # 4. Full doc with extra stream.write field_separator + stream.write "# " + stream.write full_name + write_signature_to_stream(stream) if mdoc != null then - stream.write "# " - stream.write full_name - write_signature_to_stream(stream) for i in 2.times do stream.write line_separator stream.write mdoc.content.join(line_separator) end + write_extra_doc(mainmodule, stream) stream.write "\n" end @@ -89,6 +90,9 @@ redef class MEntity # Doc to use in completion private fun complete_mdoc: nullable MDoc do return mdoc + + # Extra auto documentation to append to the `stream` + private fun write_extra_doc(mainmodule: MModule, stream: Writer) do end end redef class MMethodDef @@ -148,6 +152,84 @@ redef class MClassDef end end +redef class MClassType + redef fun write_extra_doc(mainmodule, stream) + do + # Super classes + stream.write line_separator*2 + stream.write "## Class hierarchy" + + var direct_supers = [for s in mclass.in_hierarchy(mainmodule).direct_greaters do s.name] + if not direct_supers.is_empty then + alpha_comparator.sort direct_supers + stream.write line_separator + stream.write "* Direct super classes: " + stream.write direct_supers.join(", ") + end + + var supers = [for s in mclass.in_hierarchy(mainmodule).greaters do s.name] + supers.remove mclass.name + if not supers.is_empty then + alpha_comparator.sort supers + stream.write line_separator + stream.write "* All super classes: " + stream.write supers.join(", ") + end + + var direct_subs = [for s in mclass.in_hierarchy(mainmodule).direct_smallers do s.name] + if not direct_subs.is_empty then + alpha_comparator.sort direct_subs + stream.write line_separator + stream.write "* Direct sub classes: " + stream.write direct_subs.join(", ") + end + + var subs = [for s in mclass.in_hierarchy(mainmodule).smallers do s.name] + subs.remove mclass.name + if not subs.is_empty then + alpha_comparator.sort subs + stream.write line_separator + stream.write "* All sub classes: " + stream.write subs.join(", ") + end + + # List other properties + stream.write line_separator*2 + stream.write "## Properties" + stream.write line_separator + var props = mclass.all_mproperties(mainmodule, protected_visibility).to_a + alpha_comparator.sort props + for prop in props do + if mclass.name == "Object" or prop.intro.mclassdef.mclass.name != "Object" then + + if prop.visibility == public_visibility then + stream.write "+ " + else stream.write "~ " # protected_visibility + + if prop isa MMethod then + if prop.is_init and prop.name != "init" then stream.write "init " + if prop.is_new and prop.name != "new" then stream.write "new " + end + + stream.write prop.name + + if prop isa MMethod then + stream.write prop.intro.msignature.to_s + end + + var mdoc = prop.intro.mdoc + if mdoc != null then + stream.write " # " + stream.write mdoc.content.first + end + stream.write line_separator + end + end + end + + redef fun complete_mdoc do return mclass.intro.mdoc +end + private class AutocompletePhase super Phase @@ -168,7 +250,7 @@ private class AutocompletePhase # Got all known modules var model = mainmodule.model for mmodule in model.mmodules do - mmodule.write_to_stream modules_stream + mmodule.write_doc(mainmodule, modules_stream) end # TODO list other modules from the Nit lib @@ -184,15 +266,15 @@ private class AutocompletePhase for prop in mclass.all_mproperties(mainmodule, public_visibility) do if prop isa MMethod and prop.is_init then mclass_intro.target_constructor = prop.intro - mclass_intro.write_to_stream constructors_stream + mclass_intro.write_doc(mainmodule, constructors_stream) end end mclass_intro.target_constructor = null end # Always add to types and classes - mclass.mclass_type.write_to_stream classes_stream - mclass.mclass_type.write_to_stream types_stream + mclass.mclass_type.write_doc(mainmodule, classes_stream) + mclass.mclass_type.write_doc(mainmodule, types_stream) end # Get all known properties @@ -202,7 +284,7 @@ private class AutocompletePhase # Is it a virtual type? if mproperty isa MVirtualTypeProp then - mproperty.intro.write_to_stream types_stream + mproperty.intro.write_doc(mainmodule, types_stream) continue end @@ -210,7 +292,7 @@ private class AutocompletePhase var first_letter = mproperty.name.chars.first if first_letter == '@' or first_letter == '_' then continue - mproperty.intro.write_to_stream properties_stream + mproperty.intro.write_doc(mainmodule, properties_stream) end # Close streams