private fun field_separator: String do return "#====#"
private fun line_separator: String do return "#nnnn#"
- private fun write_doc(mainmodule: MModule, stream: Writer)
+ private fun write_doc(model: Model, mainmodule: MModule, stream: Writer)
do
# 1. Short name for autocompletion
stream.write complete_name
for i in 2.times do stream.write line_separator
stream.write mdoc.content.join(line_separator)
end
- write_extra_doc(mainmodule, stream)
+
+ write_location(mainmodule, stream)
+
+ write_extra_doc(model, mainmodule, stream)
stream.write "\n"
end
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
+ private fun write_extra_doc(model: Model, mainmodule: MModule, stream: Writer) do end
+
+ # Location (file and line when available) of related declarations
+ private fun write_location(mainmodule: MModule, stream: Writer)
+ do
+ for i in 2.times do stream.write line_separator
+ stream.write "## Location"
+ stream.write line_separator
+ stream.write "* {location}"
+ end
end
redef class MMethodDef
stream.write msignature.to_s
end
end
+
+ redef fun write_location(mainmodule, stream)
+ do
+ for i in 2.times do stream.write line_separator
+ stream.write "## Location of introduction and refinements"
+
+ # Group locations in the same file
+ var file_to_location = new MultiHashMap[nullable SourceFile, Location]
+ for c in mproperty.mpropdefs do
+ file_to_location[c.location.file].add c.location
+ end
+
+ # Write one file per location
+ for file, locations in file_to_location do
+ var l = locations.first
+ stream.write line_separator
+ stream.write "* {l}"
+ if locations.length > 1 then stream.write " ({locations.length-1} more)"
+ end
+ end
end
redef class MAttributeDef
end
redef class MClassType
- redef fun write_extra_doc(mainmodule, stream)
+ redef fun write_extra_doc(model, mainmodule, stream)
do
# Super classes
stream.write line_separator*2
stream.write line_separator*2
stream.write "## Properties"
stream.write line_separator
- var props = mclass.collect_accessible_mproperties(protected_visibility).to_a
+ var props = mclass.collect_accessible_mproperties(mainmodule).to_a
alpha_comparator.sort props
for prop in props do
if mclass.name == "Object" or prop.intro.mclassdef.mclass.name != "Object" then
end
redef fun complete_mdoc do return mclass.intro.mdoc
+
+ redef fun write_location(mainmodule, stream)
+ do
+ for i in 2.times do stream.write line_separator
+ stream.write "## Location of introduction and refinements"
+ for c in mclass.mclassdefs do
+ stream.write line_separator
+ stream.write "* {c.location}"
+ end
+ end
end
private class AutocompletePhase
# Got all known modules
var model = mainmodule.model
for mmodule in model.mmodules do
- mmodule.write_doc(mainmodule, modules_stream)
+ mmodule.write_doc(model, mainmodule, modules_stream)
end
# TODO list other modules from the Nit lib
# Can it be instantiated?
if mclass.kind != interface_kind and mclass.kind != abstract_kind then
- for prop in mclass.collect_accessible_mproperties(public_visibility) do
+ for prop in mclass.collect_accessible_mproperties(mainmodule) do
if prop isa MMethod and prop.is_init then
mclass_intro.target_constructor = prop.intro
- mclass_intro.write_doc(mainmodule, constructors_stream)
+ mclass_intro.write_doc(model, mainmodule, constructors_stream)
end
end
mclass_intro.target_constructor = null
end
# Always add to types and classes
- mclass.mclass_type.write_doc(mainmodule, classes_stream)
- mclass.mclass_type.write_doc(mainmodule, types_stream)
+ mclass.mclass_type.write_doc(model, mainmodule, classes_stream)
+ mclass.mclass_type.write_doc(model, mainmodule, types_stream)
end
# Get all known properties
# Is it a virtual type?
if mproperty isa MVirtualTypeProp then
- mproperty.intro.write_doc(mainmodule, types_stream)
+ mproperty.intro.write_doc(model, mainmodule, types_stream)
continue
end
var first_letter = mproperty.name.chars.first
if first_letter == '@' or first_letter == '_' then continue
- mproperty.intro.write_doc(mainmodule, properties_stream)
+ mproperty.intro.write_doc(model, mainmodule, properties_stream)
end
# Close streams
end
redef class MModule
- redef fun write_extra_doc(mainmodule, stream)
+ redef fun write_extra_doc(model, mainmodule, stream)
do
# Introduced classes
- var class_intros = collect_intro_mclasses(protected_visibility).to_a
+ var class_intros = collect_intro_mclasses.to_a
if class_intros.not_empty then
alpha_comparator.sort class_intros
stream.write line_separator*2
# Introduced properties
var prop_intros = new Array[MPropDef]
for c in mclassdefs do
- prop_intros.add_all c.collect_intro_mpropdefs(protected_visibility)
+ prop_intros.add_all c.collect_intro_mpropdefs
end
if prop_intros.not_empty then
if self isa MMethod then
var intro = intro
assert intro isa MMethodDef
- stream.write intro.msignature.to_s
+ var msignature = intro.msignature
+ if msignature != null then
+ stream.write msignature.to_s
+ end
end
var mdoc = intro.mdoc