* 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>
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
+++ /dev/null
-# 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
--- /dev/null
+# 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
# Common SAX listeners for entity definitions.
module doxml::entitydef
-import doc
+import doc_listener
# Processes the content of an entity definition.
abstract class EntityDefListener
--- /dev/null
+# 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
import neo4j
import more_collections
import location
+import descriptions
# A Neo4j graph.
class NeoGraph
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)
#
# 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)
# 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
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
super
name = "(self)"
end
+
+ redef fun put_in_graph do
+ if doc.is_empty then doc = namespace.doc
+ super
+ end
end
--- /dev/null
+# 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 == "[]"
--- /dev/null
+# 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
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"
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", "")
# 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
<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>
<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>
# 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
<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"/>
<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"/>
<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>
<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>
# 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
<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>
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)
# 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
nitc
nitdoc
nitlight
+neo_doxygen_descriptions
+neo_doxygen_doc_module_class
neo_doxygen_dump
neo_doxygen_file_compound
neo_doxygen_graph_empty_project
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
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):
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
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):
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
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
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):
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):
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):
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):
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):
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
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):
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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
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):
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):
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):
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):
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):
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
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):
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):
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
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):
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
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):
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
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):
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
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):
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):
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
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):
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):
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
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
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):
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
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):
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===---
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
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):
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):
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
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):
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):
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
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):
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):
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
6:MGroup
-=properties=JsonObject(1):
-{"name":"foo"}
+=properties=JsonObject(2):
+{"name":"foo","mdoc":["A documented namespace."]}
Edge
=type=8:DECLARES
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
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
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
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):
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):
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
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):
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
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):
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
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):