Merge: neo_doxygen: Enhance description handling
authorJean Privat <jean@pryen.org>
Thu, 25 Dec 2014 02:42:46 +0000 (21:42 -0500)
committerJean Privat <jean@pryen.org>
Thu, 25 Dec 2014 02:42:46 +0000 (21:42 -0500)
* Document the implicit nodes.
* Prepare `DocListener` for translation of the Doxygen’s markup. #1059 must be fixed before we do anything else.

Signed-off-by: Jean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>

Pull-Request: #1060
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

31 files changed:
contrib/neo_doxygen/README.md
contrib/neo_doxygen/src/doxml/doc.nit [deleted file]
contrib/neo_doxygen/src/doxml/doc_listener.nit [new file with mode: 0644]
contrib/neo_doxygen/src/doxml/entitydef.nit
contrib/neo_doxygen/src/model/descriptions.nit [new file with mode: 0644]
contrib/neo_doxygen/src/model/graph.nit
contrib/neo_doxygen/src/model/module_compound.nit
contrib/neo_doxygen/src/model/namespace_members.nit
contrib/neo_doxygen/src/tests/neo_doxygen_descriptions.nit [new file with mode: 0644]
contrib/neo_doxygen/src/tests/neo_doxygen_doc_module_class.nit [new file with mode: 0644]
contrib/neo_doxygen/src/tests/neo_doxygen_file_compound.nit
contrib/neo_doxygen/src/tests/neo_doxygen_namespace_members.nit
contrib/neo_doxygen/tests/inner-class/Doxyfile
contrib/neo_doxygen/tests/inner-class/xml/class_outer_class.xml
contrib/neo_doxygen/tests/inner-class/xml/class_outer_class_1_1_inner_class.xml
contrib/neo_doxygen/tests/java-project/Doxyfile
contrib/neo_doxygen/tests/java-project/xml/classorg_1_1example_1_1foo_1_1_a.xml
contrib/neo_doxygen/tests/java-project/xml/classorg_1_1example_1_1foo_1_1_b.xml
contrib/neo_doxygen/tests/java-project/xml/classorg_1_1example_1_1foo_1_1_empty_class.xml
contrib/neo_doxygen/tests/java-project/xml/interfaceorg_1_1example_1_1foo_1_1_c.xml
contrib/neo_doxygen/tests/root-namespace/Doxyfile
contrib/neo_doxygen/tests/root-namespace/xml/class_foo.xml
lib/html/html.nit
tests/nitg-g.skip
tests/sav/neo_doxygen_descriptions.res [new file with mode: 0644]
tests/sav/neo_doxygen_doc_module_class.res [new file with mode: 0644]
tests/sav/neo_doxygen_dump_args4.res
tests/sav/neo_doxygen_dump_args5.res
tests/sav/neo_doxygen_dump_args6.res
tests/sav/neo_doxygen_file_compound.res
tests/sav/neo_doxygen_namespace_members.res

index 454cd86..c33e770 100644 (file)
@@ -71,6 +71,17 @@ works on a collection of projects grouped in a directory. For detail about how
 to invoke each script, see the comments in these scripts.
 
 
+## Brief descriptions
+
+To populate the first line of a description (used as brief description in
+Nitdoc), `neo_doxygen` uses the brief description provided by Doxygen. So, you
+may need to change settings like `JAVADOC_AUTOBRIEF`, `QT_AUTOBRIEF` and
+`MULTILINE_CPP_IS_BRIEF` in Doxygen to make `neo_doxygen` properly split the
+brief description from the detailed description. In absence of brief
+description, `neo_doxygen` will use the first block (usually, the first
+paragraph) of the detailed as brief description.
+
+
 ## Python
 
 The built-in filter of Doxygen for Python is very basic. For example, it
diff --git a/contrib/neo_doxygen/src/doxml/doc.nit b/contrib/neo_doxygen/src/doxml/doc.nit
deleted file mode 100644 (file)
index da9f09e..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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.
-
-# Documentation reading.
-module doxml::doc
-
-import listener
-
-# Processes documentation.
-class DocListener
-       super TextListener
-
-       # The read documentation.
-       var doc = new JsonArray is writable
-
-       redef fun end_listening do
-               super
-               var line = to_s.trim
-               if not line.is_empty then doc.add(line)
-       end
-end
diff --git a/contrib/neo_doxygen/src/doxml/doc_listener.nit b/contrib/neo_doxygen/src/doxml/doc_listener.nit
new file mode 100644 (file)
index 0000000..05ecd35
--- /dev/null
@@ -0,0 +1,94 @@
+# 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.
+
+# Documentation reading.
+module doxml::doc_listener
+
+import listener
+import html
+
+# Processes documentation.
+class DocListener
+       super TextListener
+
+       # The read documentation.
+       var doc = new Documentation is writable
+
+       # Mapping between the type of a Doxygen element and the corresponding
+       # factory.
+       private var factories = new HashMap[String, HtmlElementFactory]
+
+       private var element_stack = new Array[HTMLTag]
+
+       # Does the next block have to be added to the detailed description?
+       private var in_detailed_description = false
+
+       redef fun listen_until(uri, local_name) do
+               super
+               if local_name == "briefdescription" then
+                       in_detailed_description = false
+               else
+                       in_detailed_description = true
+               end
+       end
+
+       redef fun start_dox_element(local_name, atts) do
+               super
+               var factory = factories.get_or_null(local_name)
+               if factory == null then return
+               element_stack.push(factory.create_element(local_name, atts))
+       end
+
+       redef fun end_dox_element(local_name) do
+               super
+               if not factories.has_key(local_name) then return
+               if element_stack.is_empty then return
+               var current_element = element_stack.pop
+               current_element.append(flush_buffer.trim)
+               if element_stack.is_empty then add_block(current_element.write_to_string)
+       end
+
+       redef fun end_listening do
+               super
+               if not element_stack.is_empty then
+                       var current_element = element_stack.first.write_to_string
+                       add_block(current_element)
+               end
+               add_block(flush_buffer.trim)
+               element_stack.clear
+       end
+
+       private fun add_block(block: String) do
+               if block.is_empty then return
+               if in_detailed_description then
+                       doc.add(block)
+               else
+                       doc.brief_description = block
+                       in_detailed_description = true
+               end
+       end
+end
+
+# Provides a mean to create a certain kind of HTML elements.
+private abstract class HtmlElementFactory
+       # Create a new empty HTML element.
+       #
+       # Parameters:
+       #
+       # * `local_name`: Type of the Doxygen element that will be represented by
+       # the HTML element.
+       # * `attributes`: Attributes of the Doxygen element that will be
+       # represented by the HTML element.
+       fun create_element(local_name: String, attributes: Attributes): HTMLTag is abstract
+end
index 6c11a6c..0f83aa1 100644 (file)
@@ -15,7 +15,7 @@
 # Common SAX listeners for entity definitions.
 module doxml::entitydef
 
-import doc
+import doc_listener
 
 # Processes the content of an entity definition.
 abstract class EntityDefListener
diff --git a/contrib/neo_doxygen/src/model/descriptions.nit b/contrib/neo_doxygen/src/model/descriptions.nit
new file mode 100644 (file)
index 0000000..1f504ef
--- /dev/null
@@ -0,0 +1,117 @@
+# 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.
+
+# Documentation associated to an entity.
+module model::descriptions
+
+import json::static
+
+# Documentation associated to an entity.
+#
+# The documentation is written in Markdown format.
+#
+# ~~~nit
+# var doc = new Documentation
+#
+# doc.brief_description = "Do something."
+# doc.detailed_description = ["Do not lunch a rocket."]
+# assert doc.brief_description == "Do something."
+# assert doc.detailed_description == ["Do not lunch a rocket."]
+# assert doc.to_json == """["Do something.","Do not lunch a rocket."]"""
+#
+# doc.brief_description = ""
+# doc.detailed_description = ["The answer is `42`."]
+# assert doc.brief_description == "The answer is `42`."
+# assert doc.detailed_description == ["The answer is `42`."]
+# assert doc.to_json == """["The answer is `42`."]"""
+#
+# doc.detailed_description = ["The answer is `42`."]
+# doc.brief_description = ""
+# assert doc.brief_description == "The answer is `42`."
+# assert doc.detailed_description == ["The answer is `42`."]
+# assert doc.to_json == """["The answer is `42`."]"""
+#
+# doc.detailed_description = new Array[String]
+# doc.brief_description = ""
+# assert doc.is_empty
+# assert doc.brief_description == ""
+# assert doc.detailed_description == new Array[String]
+# assert doc.to_json == "[]"
+# ~~~
+class Documentation
+       super Jsonable
+
+       private var content = new JsonStringArray
+       private var has_brief_description: Bool = false
+
+       # The brief description.
+       #
+       # If it is empty, the first element of `detailed_description` will be used
+       # as brief description.
+       fun brief_description=(brief_description: String) do
+               if brief_description.is_empty then
+                       if has_brief_description then
+                               content.shift
+                               has_brief_description = false
+                       end
+               else if has_brief_description then
+                       content.first = brief_description
+               else
+                       content.unshift(brief_description)
+                       has_brief_description = true
+               end
+       end
+
+       # The brief description.
+       fun brief_description: String do
+               if not is_empty then return content.first
+               return ""
+       end
+
+       # The detailed description.
+       #
+       # Each element should represent a block.
+       fun detailed_description=(detailed_description: SequenceRead[String]) do
+               if has_brief_description then
+                       while content.length > 1 do content.pop
+               else
+                       content.clear
+               end
+               content.add_all(detailed_description)
+       end
+
+       # The detailed description.
+       #
+       # Each element should represent a block.
+       fun detailed_description: SequenceRead[String] do
+               if not has_brief_description then return content
+               if content.length > 1 then return content.subarray(1, content.length - 1)
+               return new Array[String]
+       end
+
+       # Add a block of detailed description.
+       fun add(block: String) do content.add block
+
+       # Is the documentation empty?
+       fun is_empty: Bool do return content.is_empty
+
+       redef fun to_json do return content.to_json
+       redef fun append_json(b) do content.append_json(b)
+end
+
+# A `Jsonable` array of strings.
+private class JsonStringArray
+       super JsonSequenceRead[String]
+       super Array[String]
+end
index 7c8d2a3..74a81b5 100644 (file)
@@ -18,6 +18,7 @@ module model::graph
 import neo4j
 import more_collections
 import location
+import descriptions
 
 # A Neo4j graph.
 class NeoGraph
@@ -135,7 +136,7 @@ abstract class Entity
        var full_name: nullable String = null is writable
 
        # Associated documentation.
-       var doc = new JsonArray is writable
+       var doc = new Documentation is writable
 
        init do
                self.labels.add(graph.project_name)
@@ -179,7 +180,7 @@ abstract class Entity
        #
        # Called by the loader when it has finished to read the entity.
        fun put_in_graph do
-               if doc.length > 0 then
+               if not doc.is_empty then
                        set_mdoc
                end
                graph.all_nodes.add(self)
index 95ce6cb..188d4c1 100644 (file)
@@ -139,19 +139,19 @@ private class Module
        # declares it.
        fun update_name do name = file_compound.basename
 
-       redef fun put_in_graph do
-               super
-       end
-
        redef fun put_edges do
                var ns_compound = namespace.seek_in(graph)
                var self_class = ns_compound.self_class
+               var class_count = 0
+               var last_class: nullable ClassCompound = null
 
                graph.add_edge(ns_compound, "DECLARES", self)
 
                for c in file_compound.inner_classes do
                        if graph.class_to_ns[c] != ns_compound then continue
                        var class_compound = graph.by_id[c].as(ClassCompound)
+                       last_class = class_compound
+                       class_count += 1
                        graph.add_edge(self, "INTRODUCES", class_compound)
                        graph.add_edge(self, "DEFINES", class_compound.class_def)
                end
@@ -163,6 +163,13 @@ private class Module
                        graph.add_edge(self, "INTRODUCES", self_class)
                        graph.add_edge(self, "DEFINES", self_class.class_def)
                end
+
+               if doc.is_empty and class_count == 1 then
+                       doc = last_class.as(not null).doc
+               end
+               if doc.is_empty then doc = file_compound.doc
+               if doc.is_empty then doc = ns_compound.doc
+               if not doc.is_empty then set_mdoc
        end
 end
 
index ce73ee3..4c85d5a 100644 (file)
@@ -65,4 +65,9 @@ class SelfClass
                super
                name = "(self)"
        end
+
+       redef fun put_in_graph do
+               if doc.is_empty then doc = namespace.doc
+               super
+       end
 end
diff --git a/contrib/neo_doxygen/src/tests/neo_doxygen_descriptions.nit b/contrib/neo_doxygen/src/tests/neo_doxygen_descriptions.nit
new file mode 100644 (file)
index 0000000..d277be7
--- /dev/null
@@ -0,0 +1,44 @@
+# 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.
+
+import model::descriptions
+
+# Copied from the documentation of `Documentation`.
+
+var doc = new Documentation
+
+doc.brief_description = "Do something."
+doc.detailed_description = ["Do not lunch a rocket."]
+assert doc.brief_description == "Do something."
+assert doc.detailed_description == ["Do not lunch a rocket."]
+assert doc.to_json == """["Do something.","Do not lunch a rocket."]"""
+
+doc.brief_description = ""
+doc.detailed_description = ["The answer is `42`."]
+assert doc.brief_description == "The answer is `42`."
+assert doc.detailed_description == ["The answer is `42`."]
+assert doc.to_json == """["The answer is `42`."]"""
+
+doc.detailed_description = ["The answer is `42`."]
+doc.brief_description = ""
+assert doc.brief_description == "The answer is `42`."
+assert doc.detailed_description == ["The answer is `42`."]
+assert doc.to_json == """["The answer is `42`."]"""
+
+doc.detailed_description = new Array[String]
+doc.brief_description = ""
+assert doc.is_empty
+assert doc.brief_description == ""
+assert doc.detailed_description == new Array[String]
+assert doc.to_json == "[]"
diff --git a/contrib/neo_doxygen/src/tests/neo_doxygen_doc_module_class.nit b/contrib/neo_doxygen/src/tests/neo_doxygen_doc_module_class.nit
new file mode 100644 (file)
index 0000000..48f73d5
--- /dev/null
@@ -0,0 +1,43 @@
+# 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.
+
+import tests
+intrude import model::module_compound
+
+var graph = new ProjectGraph("foo")
+var file = new FileCompound(graph)
+var bar_class = new ClassCompound(graph)
+var a_ns = new Namespace(graph)
+
+file.full_name = "Baz.java"
+file.declare_class("classa_bar", "a::Bar", "public")
+file.declare_namespace("namespacea", "a")
+file.doc.brief_description = "A file."
+file.put_in_graph
+
+a_ns.full_name = "a"
+a_ns.model_id = "namespacea"
+a_ns.declare_class("classa_bar", "a::Bar", "public")
+a_ns.doc.brief_description = "A namespace."
+a_ns.put_in_graph
+
+bar_class.model_id = "classa_bar"
+bar_class.full_name = "a::Bar"
+bar_class.doc.brief_description = "A class."
+bar_class.put_in_graph
+
+graph.add_global_modules
+graph.put_edges
+
+assert file.inner_namespaces[0]["mdoc"] == bar_class.doc
index 73adc61..c66709e 100644 (file)
@@ -36,6 +36,7 @@ file.location = location
 file.declare_class("classa_b_bar", "a::b::Bar", "package")
 file.declare_class("classbaz", "Baz", "")
 file.declare_namespace("", "a::b")
+file.doc.brief_description = "The first file."
 file.put_in_graph
 
 file_2.name = "Bar.java"
index 346723d..4030df9 100644 (file)
@@ -33,6 +33,7 @@ member.put_in_graph
 ns.model_id = "namespacefoo"
 ns.name = "foo"
 ns.declare_member(member)
+ns.doc.brief_description = "A documented namespace."
 ns.put_in_graph
 
 root_ns.declare_namespace("namespacefoo", "")
index bd06324..46601c2 100644 (file)
@@ -187,7 +187,7 @@ SHORT_NAMES            = NO
 # description.)
 # The default value is: NO.
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
index 0e516fa..1bd92a8 100644 (file)
@@ -4,9 +4,9 @@
     <compoundname>OuterClass</compoundname>
     <innerclass refid="class_outer_class_1_1_inner_class" prot="public">OuterClass::InnerClass</innerclass>
     <briefdescription>
-    </briefdescription>
+<para>A class with an inner class. </para>    </briefdescription>
     <detaileddescription>
-<para>A class with an inner class. </para>    </detaileddescription>
+    </detaileddescription>
     <location file="%SOURCE_DIRECTORY%/OuterClass.java" line="19" column="1" bodyfile="%SOURCE_DIRECTORY%/OuterClass.java" bodystart="19" bodyend="24"/>
     <listofallmembers>
     </listofallmembers>
index fdabf85..570babb 100644 (file)
@@ -3,9 +3,9 @@
   <compounddef id="class_outer_class_1_1_inner_class" kind="class" prot="public">
     <compoundname>OuterClass::InnerClass</compoundname>
     <briefdescription>
-    </briefdescription>
+<para>An instance (non-static) inner class. </para>    </briefdescription>
     <detaileddescription>
-<para>An instance (non-static) inner class. </para>    </detaileddescription>
+    </detaileddescription>
     <location file="%SOURCE_DIRECTORY%/OuterClass.java" line="23" column="1" bodyfile="%SOURCE_DIRECTORY%/OuterClass.java" bodystart="23" bodyend="23"/>
     <listofallmembers>
     </listofallmembers>
index bd06324..46601c2 100644 (file)
@@ -187,7 +187,7 @@ SHORT_NAMES            = NO
 # description.)
 # The default value is: NO.
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
index 4475075..b380cf7 100644 (file)
@@ -18,9 +18,9 @@
           <declname>y</declname>
         </param>
         <briefdescription>
-        </briefdescription>
+<para>Does something... </para>        </briefdescription>
         <detaileddescription>
-<para>Does something... </para>        </detaileddescription>
+        </detaileddescription>
         <inbodydescription>
         </inbodydescription>
         <location file="%SOURCE_DIRECTORY%/org/example/foo/A.java" line="22" column="1"/>
index eb1fd6c..b01966b 100644 (file)
@@ -49,9 +49,9 @@
         <name>baz</name>
         <reimplements refid="interfaceorg_1_1example_1_1foo_1_1_c_1a28ac7ce349ebb3e4a7747a8dd951582b">baz</reimplements>
         <briefdescription>
-        </briefdescription>
+<para>Some overriden documentation. </para>        </briefdescription>
         <detaileddescription>
-<para>Some overriden documentation. </para>        </detaileddescription>
+        </detaileddescription>
         <inbodydescription>
         </inbodydescription>
         <location file="%SOURCE_DIRECTORY%/org/example/foo/B.java" line="28" column="1" bodyfile="%SOURCE_DIRECTORY%/org/example/foo/B.java" bodystart="28" bodyend="28"/>
index 9aa6aa2..04854de 100644 (file)
@@ -3,9 +3,9 @@
   <compounddef id="classorg_1_1example_1_1foo_1_1_empty_class" kind="class" prot="package">
     <compoundname>org::example::foo::EmptyClass</compoundname>
     <briefdescription>
-    </briefdescription>
+<para>This class is empty and is only visible in this package. </para>    </briefdescription>
     <detaileddescription>
-<para>This class is empty and is only visible in this package. </para>    </detaileddescription>
+    </detaileddescription>
     <location file="%SOURCE_DIRECTORY%/org/example/foo/EmptyClass.java" line="21" column="1" bodyfile="%SOURCE_DIRECTORY%/org/example/foo/EmptyClass.java" bodystart="21" bodyend="21"/>
     <listofallmembers>
     </listofallmembers>
index aec6243..09b577a 100644 (file)
@@ -11,9 +11,9 @@
         <name>THE_ANSWER</name>
         <initializer>= 42L</initializer>
         <briefdescription>
-        </briefdescription>
+<para>“Answer to the Ultimate Question of Life, the Universe, and Everything. </para>        </briefdescription>
         <detaileddescription>
-<para>“Answer to the Ultimate Question of Life, the Universe, and Everything.“ </para>        </detaileddescription>
+<para>“ </para>        </detaileddescription>
         <inbodydescription>
         </inbodydescription>
         <location file="%SOURCE_DIRECTORY%/org/example/foo/C.java" line="25" column="1" bodyfile="%SOURCE_DIRECTORY%/org/example/foo/C.java" bodystart="25" bodyend="-1"/>
         <name>baz</name>
         <reimplementedby refid="classorg_1_1example_1_1foo_1_1_b_1a733f4e076f29c7d0c41ed258199ea1d9">baz</reimplementedby>
         <briefdescription>
-        </briefdescription>
+<para><ref refid="classorg_1_1example_1_1foo_1_1_a" kindref="compound">A</ref> function with implicit modifiers. </para>        </briefdescription>
         <detaileddescription>
-<para><ref refid="classorg_1_1example_1_1foo_1_1_a" kindref="compound">A</ref> function with implicit modifiers. </para>        </detaileddescription>
+        </detaileddescription>
         <inbodydescription>
         </inbodydescription>
         <location file="%SOURCE_DIRECTORY%/org/example/foo/C.java" line="30" column="1"/>
       </memberdef>
       </sectiondef>
     <briefdescription>
-    </briefdescription>
+<para>An interface. </para>    </briefdescription>
     <detaileddescription>
-<para>An interface </para>    </detaileddescription>
+    </detaileddescription>
     <inheritancegraph>
       <node id="10">
         <label>org.example.foo.B</label>
index bd06324..46601c2 100644 (file)
@@ -187,7 +187,7 @@ SHORT_NAMES            = NO
 # description.)
 # The default value is: NO.
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
index 3ee1155..86405c8 100644 (file)
@@ -3,9 +3,9 @@
   <compounddef id="class_foo" kind="class" prot="package">
     <compoundname>Foo</compoundname>
     <briefdescription>
-    </briefdescription>
+<para>A class in the root namespace. </para>    </briefdescription>
     <detaileddescription>
-<para>A class in the root namespace </para>    </detaileddescription>
+    </detaileddescription>
     <location file="%SOURCE_DIRECTORY%/Foo.java" line="19" column="1" bodyfile="%SOURCE_DIRECTORY%/Foo.java" bodystart="19" bodyend="19"/>
     <listofallmembers>
     </listofallmembers>
index 83ff255..8d2de2b 100644 (file)
@@ -84,10 +84,13 @@ class HTMLPage
        end
 end
 
+# An HTML element.
 class HTMLTag
        super Streamable
 
-       # HTML tagname: 'div' for <div></div>
+       # HTML element type.
+       #
+       # `"div"` for `<div></div>`.
        var tag: String
        init do
                self.is_void = (once ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]).has(tag)
@@ -99,6 +102,7 @@ class HTMLTag
        #     assert (new HTMLTag("p")).is_void      == false
        var is_void: Bool is noinit
 
+       # Create a HTML elements with the specifed type and attributes.
        init with_attrs(tag: String, attrs: Map[String, String]) do
                self.tag = tag
                self.attrs = attrs
index d25129d..0d0961d 100644 (file)
@@ -1,6 +1,8 @@
 nitc
 nitdoc
 nitlight
+neo_doxygen_descriptions
+neo_doxygen_doc_module_class
 neo_doxygen_dump
 neo_doxygen_file_compound
 neo_doxygen_graph_empty_project
diff --git a/tests/sav/neo_doxygen_descriptions.res b/tests/sav/neo_doxygen_descriptions.res
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/sav/neo_doxygen_doc_module_class.res b/tests/sav/neo_doxygen_doc_module_class.res
new file mode 100644 (file)
index 0000000..e69de29
index 3a3c933..0d6a211 100644 (file)
@@ -242,8 +242,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -256,8 +256,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
@@ -265,7 +265,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -278,8 +278,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -287,7 +287,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -308,8 +308,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -322,8 +322,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
@@ -344,8 +344,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -1457,7 +1457,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1481,7 +1481,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1576,7 +1576,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1608,7 +1608,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -1622,7 +1622,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1645,7 +1645,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
@@ -1653,7 +1653,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -1667,7 +1667,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1699,7 +1699,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -1713,7 +1713,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#71:interfaceorg_1_1example_1_1foo_1_1_c_1a4e97061eb40b045e820de05b33c43d21
 =labels=Array(4):
@@ -1722,7 +1722,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 
 
 Edge
@@ -1736,7 +1736,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1768,7 +1768,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -1782,7 +1782,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#71:interfaceorg_1_1example_1_1foo_1_1_c_1a28ac7ce349ebb3e4a7747a8dd951582b
 =labels=Array(4):
index 95633f3..70cda4d 100644 (file)
@@ -242,8 +242,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -256,8 +256,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
@@ -265,7 +265,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -278,8 +278,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -287,7 +287,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -308,8 +308,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -322,8 +322,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
@@ -344,8 +344,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -1457,7 +1457,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1481,7 +1481,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1576,7 +1576,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1608,7 +1608,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -1622,7 +1622,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1645,7 +1645,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
@@ -1653,7 +1653,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface."]}
 
 
 Edge
@@ -1667,7 +1667,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1699,7 +1699,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -1713,7 +1713,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#71:interfaceorg_1_1example_1_1foo_1_1_c_1a4e97061eb40b045e820de05b33c43d21
 =labels=Array(4):
@@ -1722,7 +1722,7 @@ Edge
 8:MPropDef
 13:MAttributeDef
 =properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.\u000e2\u00080\u0009c"],"is_intro":true}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:25,1---1,1","visibility":"public","name":"THE_ANSWER","mdoc":["\u000e2\u00080\u0009cAnswer to the Ultimate Question of Life, the Universe, and Everything.","\u000e2\u00080\u0009c"],"is_intro":true}
 
 
 Edge
@@ -1736,7 +1736,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1768,7 +1768,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 
 
 Edge
@@ -1782,7 +1782,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface."]}
 ----
 =to=Entity#71:interfaceorg_1_1example_1_1foo_1_1_c_1a28ac7ce349ebb3e4a7747a8dd951582b
 =labels=Array(4):
index 5436c24..c59297e 100644 (file)
@@ -59,7 +59,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -91,7 +91,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace."]}
 
 
 Edge
@@ -105,7 +105,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace"]}
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -128,7 +128,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace"]}
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace."]}
 ----
 =to=Entity#9:class_foo
 =labels=Array(3):
@@ -136,7 +136,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace."]}
 
 
 Edge
@@ -157,8 +157,8 @@ Edge
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","mdoc":["A class in the root namespace."]}
 
 
 Edge
@@ -171,8 +171,8 @@ Edge
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","mdoc":["A class in the root namespace."]}
 ----
 =to=Entity#9:class_foo
 =labels=Array(3):
@@ -180,7 +180,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(5):
-{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+{"kind":"class","visibility":"package","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace."]}
 
 
 Edge
@@ -193,8 +193,8 @@ Edge
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","mdoc":["A class in the root namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -202,7 +202,7 @@ Edge
 7:MEntity
 9:MClassDef
 =properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace"]}
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace."]}
 
 
 ---===DONE===---
index 9b16eb8..740393b 100644 (file)
@@ -186,8 +186,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 
 Edge
 =type=10:INTRODUCES
@@ -199,8 +199,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -220,8 +220,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -762,8 +762,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 
 Edge
 =type=10:INTRODUCES
@@ -775,8 +775,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -796,8 +796,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -1167,8 +1167,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 
 Edge
 =type=10:INTRODUCES
@@ -1180,8 +1180,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -1201,8 +1201,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar","mdoc":["The first file."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
index c785591..753a400 100644 (file)
@@ -51,8 +51,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(1):
-{"name":"foo"}
+=properties=JsonObject(2):
+{"name":"foo","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
@@ -80,8 +80,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(1):
-{"name":"foo"}
+=properties=JsonObject(2):
+{"name":"foo","mdoc":["A documented namespace."]}
 
 Edge
 =type=8:DECLARES
@@ -93,16 +93,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(1):
-{"name":"foo"}
+=properties=JsonObject(2):
+{"name":"foo","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+=properties=JsonObject(3):
+{"location":"\/dev\/null:1,1--1,1","name":"foo","mdoc":["A documented namespace."]}
 
 Edge
 =type=10:INTRODUCES
@@ -114,16 +114,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+=properties=JsonObject(3):
+{"location":"\/dev\/null:1,1--1,1","name":"foo","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(4):
-{"kind":"class","visibility":"public","name":"(self)","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"(self)","mdoc":["A documented namespace."],"location":"\/dev\/null:1,1--1,1"}
 
 Edge
 =type=7:DEFINES
@@ -135,16 +135,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(2):
-{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+=properties=JsonObject(3):
+{"location":"\/dev\/null:1,1--1,1","name":"foo","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 
 Edge
 =type=7:DEFINES
@@ -179,8 +179,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(1):
-{"name":"foo"}
+=properties=JsonObject(2):
+{"name":"foo","mdoc":["A documented namespace."]}
 ----
 =to=Node
 =labels=Array(3):
@@ -200,8 +200,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(4):
-{"kind":"class","visibility":"public","name":"(self)","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"(self)","mdoc":["A documented namespace."],"location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -231,8 +231,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(4):
-{"kind":"class","visibility":"public","name":"(self)","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"(self)","mdoc":["A documented namespace."],"location":"\/dev\/null:1,1--1,1"}
 
 Edge
 =type=9:BOUNDTYPE
@@ -244,8 +244,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -266,16 +266,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(4):
-{"kind":"class","visibility":"public","name":"(self)","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"(self)","mdoc":["A documented namespace."],"location":"\/dev\/null:1,1--1,1"}
 
 Edge
 =type=10:INTRODUCES
@@ -287,8 +287,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -318,8 +318,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 
 Edge
 =type=8:DECLARES
@@ -331,8 +331,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)"}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"(self)","mdoc":["A documented namespace."]}
 ----
 =to=Entity#0:
 =labels=Array(4):