Merge: GitHub api
authorJean Privat <jean@pryen.org>
Thu, 18 Dec 2014 14:28:31 +0000 (09:28 -0500)
committerJean Privat <jean@pryen.org>
Thu, 18 Dec 2014 14:28:31 +0000 (09:28 -0500)
Première PR d'une pas si longue série.

Juste histoire de montrer un aperçu du fonctionnement.

Please review only the last two commits.

Pull-Request: #1016
Reviewed-by: Jean Privat <jean@pryen.org>

107 files changed:
contrib/brainfuck/brainfuck.nit
contrib/neo_doxygen/Makefile
contrib/neo_doxygen/src/doxml/compounddef.nit
contrib/neo_doxygen/src/doxml/doxyname.nit [new file with mode: 0644]
contrib/neo_doxygen/src/graph_store.nit
contrib/neo_doxygen/src/model/class_compound.nit
contrib/neo_doxygen/src/model/graph.nit
contrib/neo_doxygen/src/model/inner_class.nit
contrib/neo_doxygen/src/model/member.nit
contrib/neo_doxygen/src/model/model.nit
contrib/neo_doxygen/src/model/module_compound.nit
contrib/neo_doxygen/src/model/namespace_members.nit [new file with mode: 0644]
contrib/neo_doxygen/src/neo_doxygen.nit
contrib/neo_doxygen/src/tests/neo_doxygen_file_compound.nit
contrib/neo_doxygen/src/tests/neo_doxygen_namespace_members.nit [new file with mode: 0644]
contrib/neo_doxygen/tests/.gitignore [new file with mode: 0644]
contrib/neo_doxygen/tests/README.md
contrib/neo_doxygen/tests/python-def/Doxyfile [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/README.md [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/src/foo.py [moved from contrib/neo_doxygen/src/flush_stdout.nit with 76% similarity]
contrib/neo_doxygen/tests/python-def/xml/combine.xslt [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/compound.xsd [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/dir_68267d1309a1af8e8297ef4c3efbcdba.xml [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/foo_8py.xml [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/index.xml [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/index.xsd [new file with mode: 0644]
contrib/neo_doxygen/tests/python-def/xml/namespacefoo.xml [new file with mode: 0644]
contrib/nitester/src/nitester.nit
contrib/opportunity/src/templates/boilerplate.nit
contrib/rss_downloader/Makefile [new file with mode: 0644]
contrib/rss_downloader/README.md [new file with mode: 0644]
contrib/rss_downloader/src/rss_downloader.nit [new file with mode: 0644]
contrib/rss_downloader/src/sample_config.nit [new file with mode: 0644]
contrib/sort_downloads/Makefile
lib/markdown/markdown.nit
lib/markdown/test_markdown.nit
lib/opts.nit
lib/standard/collection/abstract_collection.nit
lib/standard/collection/array.nit
lib/standard/collection/list.nit
lib/standard/collection/range.nit
lib/standard/file.nit
lib/standard/kernel.nit
lib/standard/math.nit
lib/standard/queue.nit
lib/standard/ropes.nit
lib/standard/stream.nit
lib/standard/string.nit
misc/jenkins/nitester-wrapper.sh
share/man/nitlight.md
share/nitdoc/css/nitdoc.css
src/compiler/abstract_compiler.nit
src/doc/doc_down.nit [new file with mode: 0644]
src/doc/doc_model.nit
src/highlight.nit
src/metrics/detect_variance_constraints.nit
src/model/mmodule.nit
src/model/model.nit
src/model/model_base.nit
src/model/mproject.nit
src/modelize/modelize_property.nit
src/neo.nit
src/nitlight.nit
src/testing/testing_doc.nit
src/vm.nit
tests/base_attr_lazy2.nit [new file with mode: 0644]
tests/base_attr_lazy3.nit [new file with mode: 0644]
tests/error_defs_init.nit [new file with mode: 0644]
tests/neo_doxygen_dump.args
tests/nitg-g.skip
tests/niti.skip
tests/sav/base_attr_lazy2.res [new file with mode: 0644]
tests/sav/base_attr_lazy3.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt1_alt1.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt1_alt2.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt2_alt1.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt2_alt2.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt3_alt3.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt3_alt4.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt4_alt3.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt4_alt4.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt5_alt5.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt5_alt6.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt5_alt7.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt6_alt5.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt6_alt6.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt6_alt7.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt7_alt5.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt7_alt6.res [new file with mode: 0644]
tests/sav/error_defs_init_1alt7_alt7.res [new file with mode: 0644]
tests/sav/neo_doxygen_dump_args1.res
tests/sav/neo_doxygen_dump_args2.res
tests/sav/neo_doxygen_dump_args3.res
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_dump_args7.res
tests/sav/neo_doxygen_dump_args8.res [new file with mode: 0644]
tests/sav/neo_doxygen_file_compound.res
tests/sav/neo_doxygen_graph_empty_project.res
tests/sav/neo_doxygen_namespace_members.res [new file with mode: 0644]
tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res
tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res
tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res
tests/sav/test_file_read2.res [new file with mode: 0644]
tests/sav/test_new_native_alt1.res
tests/test_file_read2.nit [new file with mode: 0644]

index b614776..c35b08a 100644 (file)
@@ -16,7 +16,7 @@
 module brainfuck
 
 # Interpreter for Brainfuck source code.
-class BFInterpret
+class BFInterpreter
        # Data cells
        var dr = new Array[Char]
        # Data pointer
@@ -28,16 +28,19 @@ class BFInterpret
        var program: String
 
        # Contains the set of valid instructions, used in next
-       var valid_instr: Set[Char]
+       var valid_instr: Set[Char] is noinit
 
-       # Starts interpretation of file `filename`
-       init(filename: String) do
-               var ifs = new IFStream.open(filename.simplify_path)
+       # Create an interpreter for `program`.
+       init do
                valid_instr = new HashSet[Char]
                valid_instr.add_all "><[].,+-".chars
                dr.add 0.ascii
-               program = ifs.read_all
-               start
+       end
+
+       # Create an interpreter for the file located at `path`.
+       init from_file(path: String) do
+               var ifs = new IFStream.open(path)
+               init(ifs.read_all)
        end
 
        # Starts the interpretation of the loaded program
@@ -131,4 +134,4 @@ class BFInterpret
        end
 end
 
-var i = new BFInterpret(args[0])
+new BFInterpreter.from_file(args[0]).start
index 332b4ce..c78f7e6 100644 (file)
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-NITG=../../bin/nitc
-NITG_FLAGS=--dir bin
+NITC=../../bin/nitc
+NITC_FLAGS=--dir bin
 NEO4J_DIR=/var/lib/neo4j
 OLD_PWD=${PWD}
 
@@ -22,7 +22,7 @@ OLD_PWD=${PWD}
 # Compile the tool.
 bin:
        mkdir -p bin
-       $(NITG) $(NITG_FLAGS) src/neo_doxygen.nit
+       $(NITC) $(NITC_FLAGS) src/neo_doxygen.nit
 
 # Reset the local graph.
 reset-neo:
index de29397..b1f7eaa 100644 (file)
@@ -16,6 +16,7 @@
 module doxml::compounddef
 
 import memberdef
+import doxyname
 import more_collections
 
 # Processes the content of a `compounddef` element.
@@ -52,43 +53,64 @@ class CompoundDefListener
                member_defaults = defaults
                section_kinds = new DefaultMap[String, MemberDefaults](defaults)
 
+               # public
                section_kinds["public-type"] = defaults
                section_kinds["public-func"] = defaults
                section_kinds["public-attrib"] = defaults
                section_kinds["public-slot"] = defaults
+               # public static
                defaults = new MemberDefaults("public", true, false)
                section_kinds["public-static-func"] = defaults
                section_kinds["public-static-attrib"] = defaults
-
+               # Not scoped => public static
+               section_kinds["signal"] = defaults
+               section_kinds["dcop-func"] = defaults
+               section_kinds["property"] = defaults
+               section_kinds["event"] = defaults
+               section_kinds["define"] = defaults
+               section_kinds["typedef"] = defaults
+               section_kinds["enum"] = defaults
+               section_kinds["func"] = defaults
+               section_kinds["var"] = defaults
+
+               # protected
                defaults = new MemberDefaults("protected", false, false)
                section_kinds["protected-type"] = defaults
                section_kinds["protected-func"] = defaults
                section_kinds["protected-attrib"] = defaults
                section_kinds["protected-slot"] = defaults
+               # protected static
                defaults = new MemberDefaults("protected", true, false)
                section_kinds["protected-static-func"] = defaults
                section_kinds["protected-static-attrib"] = defaults
 
+               # package
                defaults = new MemberDefaults("package", false, false)
                section_kinds["package-type"] = defaults
                section_kinds["package-func"] = defaults
                section_kinds["package-attrib"] = defaults
+               # package static
                defaults = new MemberDefaults("package", true, false)
                section_kinds["package-static-func"] = defaults
                section_kinds["package-static-attrib"] = defaults
 
+               # private
                defaults = new MemberDefaults("private", false, false)
                section_kinds["private-type"] = defaults
                section_kinds["private-func"] = defaults
                section_kinds["private-attrib"] = defaults
                section_kinds["private-slot"] = defaults
+               # private static
                defaults = new MemberDefaults("private", true, false)
                section_kinds["private-static-func"] = defaults
                section_kinds["private-static-attrib"] = defaults
 
+               # Special sections.
+               # TODO Do something these sections.
                defaults = new MemberDefaults("public", true, true)
                section_kinds["related"] = defaults
                section_kinds["user-defined"] = defaults
+               # TODO Determine what `friend` and `prototype` mean.
        end
 
        redef fun entity: Entity do return compound
@@ -121,9 +143,9 @@ class CompoundDefListener
 
        redef fun end_dox_element(local_name: String) do
                if "compoundname" == local_name then
-                       compound.full_name = text.to_s
+                       compound.doxyname = text.to_s
                else if "innerclass" == local_name then
-                       compound.declare_class(refid, text.to_s, prot)
+                       compound.doxygen_declare_class(refid, text.to_s, prot)
                else if "innernamespace" == local_name then
                        compound.declare_namespace(refid, text.to_s)
                else if "memberdef" == local_name then
diff --git a/contrib/neo_doxygen/src/doxml/doxyname.nit b/contrib/neo_doxygen/src/doxml/doxyname.nit
new file mode 100644 (file)
index 0000000..65637df
--- /dev/null
@@ -0,0 +1,79 @@
+# 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.
+
+# Adds a methods to convert Doxygen’s names into short names.
+module doxml::doxyname
+
+import model
+
+redef class Compound
+
+       # Separator used by Doxygen to separate name’s components.
+       protected fun doxyname_separator: String do return "::"
+
+       # Set the `name` using the specified name generated by Doxygen.
+       fun doxyname=(doxyname: String) do
+               name = doxyname.to_short_name(doxyname_separator)
+       end
+
+       # Declare an inner class.
+       #
+       # Note: Althought Doxygen indicates that both arguments are optional,
+       # declarations with an empty ID are not supported yet.
+       #
+       # Parameters:
+       #
+       # * `id`: `model_id` of the inner class.
+       # * `doxyname`: qualified name of the inner class, as generated by Doxygen.
+       # * `prot`: visibility (proctection).
+       #
+       # TODO: Handle cases where only the `doxyname` is available.
+       fun doxygen_declare_class(id: String, doxyname: String, prot: String) do
+               declare_class(id, doxyname.to_short_name(doxyname_separator), prot)
+       end
+end
+
+redef class Namespace
+       # Set the `name` and the `full_name` using the specified name generated by Doxygen.
+       #
+       # Warning: This method assumes that `model_id` is already set.
+       redef fun doxyname=(doxyname: String) do
+               full_name = doxyname
+               super
+               if doxyname == name and model_id != "" then
+                       # Doxygen does not represent the root namespace.
+                       # So, we have to link the root namespace with its children manually.
+                       graph.by_id[""].as(Namespace).declare_namespace(model_id, doxyname)
+               end
+       end
+end
+
+redef class FileCompound
+       redef fun doxyname_separator do return "/"
+end
+
+redef class Text
+       # Return the substring that come after the last occurrence of `separator`.
+       #
+       # Return the whole string if `sperator` is not present.
+       private fun to_short_name(separator: String): SELFTYPE do
+               var m = search_last(separator)
+
+               if m == null then
+                       return self
+               else
+                       return substring_from(m.after)
+               end
+       end
+end
index b15ae4f..dece71e 100644 (file)
@@ -17,7 +17,6 @@ module graph_store
 
 import neo4j
 import console
-import flush_stdout
 
 # A storage medium for a graph.
 #
@@ -40,17 +39,13 @@ abstract class GraphStore
        #
        # This method must be called before the first call to `show_progress` or
        # `show_done`.
-       protected fun prepare_display do
-               printn "{term_save_cursor} "
-               flush_stdout
-       end
+       protected fun prepare_display do printn "{term_save_cursor} "
 
        # Show the progress, in percentage.
        #
        # For use in the implementation of `save_all` only.
        protected fun show_progress(progress: Int) do
                printn "{term_rewind} {progress}% "
-               flush_stdout
        end
 
        # Show a message to indicate that the task finished with success.
@@ -58,7 +53,6 @@ abstract class GraphStore
        # For use in the implementation of `save_all` only.
        protected fun show_done do
                print "{term_rewind} Done."
-               flush_stdout
        end
 end
 
index 6727cb3..aca58cb 100644 (file)
@@ -50,18 +50,6 @@ class ClassCompound
                class_def.name = name
        end
 
-       redef fun full_name=(full_name: String) do
-               super
-               class_type.full_name = full_name
-               class_def.full_name = full_name
-       end
-
-       redef fun parent_name=(parent_name: String) do
-               super
-               class_type.parent_name = parent_name
-               class_def.parent_name = parent_name
-       end
-
        redef fun location=(location: nullable Location) do
                super
                class_def.location = location
@@ -119,10 +107,12 @@ class ClassDef
        #
        # Includes inner classes.
        #
-       # To ensure that the `full_name` of each member is correctly set,
-       # `declare_member` or `declare_class` should be used to add each member.
+       # Filled by `declare_member` and `declare_class`.
        #
        # Note: `declare_class` is defined by the `inner_class` module.
+       #
+       # SEE: `declare_member`
+       # SEE: `declare_class`
        var members: SimpleCollection[MemberOrInner] = new Array[MemberOrInner]
 
        init do
@@ -149,28 +139,9 @@ class ClassDef
 
        # Append the specified member.
        fun declare_member(member: Member) do
-               var full_name = self["full_name"]
-
-               if full_name != null then
-                       member.parent_name = full_name.to_s
-               end
                members.add(member)
        end
 
-       redef fun full_name=(full_name: String) do
-               super
-               for m in members do
-                       m.parent_name = full_name
-               end
-       end
-
-       redef fun parent_name=(parent_name: String) do
-               super
-               for m in members do
-                       m.parent_name = full_name
-               end
-       end
-
        redef fun put_edges do
                super
                graph.add_edge(self, "BOUNDTYPE", class_compound.class_type)
index 150983a..7c8d2a3 100644 (file)
@@ -128,6 +128,12 @@ abstract class Entity
        # Is empty for entities without an ID.
        var model_id: String = "" is writable
 
+       # The full (qualified) name, as presented by the original model.
+       #
+       # Fully independant of `name`. By default, equals to `""` for the root
+       # namespace.
+       var full_name: nullable String = null is writable
+
        # Associated documentation.
        var doc = new JsonArray is writable
 
@@ -137,8 +143,6 @@ abstract class Entity
        end
 
        # The short (unqualified) name.
-       #
-       # May be also set by `full_name=`.
        fun name=(name: String) do
                self["name"] = name
        end
@@ -156,46 +160,21 @@ abstract class Entity
        end
 
        # The namespace separator of Nit/C++.
-       fun ns_separator: String do return "::"
-
-       # The name separator used when calling `full_name=`.
-       fun name_separator: String do return ns_separator
-
-       # The full (qualified) name.
        #
-       # Also set `name` using `name_separator`.
-       fun full_name=(full_name: String) do
-               var m = full_name.search_last(name_separator)
-
-               self["full_name"] = full_name
-               if m == null then
-                       name = full_name
-               else
-                       name = full_name.substring_from(m.after)
-               end
-       end
-
-       # The full (qualified) name.
-       fun full_name: String do
-               var full_name = self["full_name"]
-               assert full_name isa String
-               return full_name
-       end
-
-       # Set the full name using the current name and the specified parent name.
-       fun parent_name=(parent_name: String) do
-               if parent_name.is_empty then
-                       self["full_name"] = name
-               else
-                       self["full_name"] = parent_name + name_separator + name
-               end
-       end
+       # Used to join two or more names when we need to work around some
+       # limitations of the Nit model.
+       fun ns_separator: String do return "::"
 
        # Set the location of the entity in the source code.
        fun location=(location: nullable Location) do
                self["location"] = location
        end
 
+       # Get the location of the entity in the source code.
+       fun location: nullable Location do
+               return self["location"].as(nullable Location)
+       end
+
        # Put the entity in the graph.
        #
        # Called by the loader when it has finished to read the entity.
@@ -272,11 +251,9 @@ abstract class Compound
        # Parameters:
        #
        # * `id`: `model_id` of the inner class.
-       # * `full_name`: qualified name of the inner class. Ignored in practice.
+       # * `name`: short name of the inner class.
        # * `prot`: visibility (proctection).
-       #
-       # TODO: Handle cases where only the `full_name` is available.
-       fun declare_class(id: String, full_name: String, prot: String) do end
+       fun declare_class(id: String, name: String, prot: String) do end
 
        # Declare a base compound (usually, a base class).
        #
@@ -307,8 +284,6 @@ class Namespace
        super Compound
 
        # The inner namespaces.
-       #
-       # Left empty for the root namespace.
        var inner_namespaces: SimpleCollection[NamespaceRef] = new Array[NamespaceRef]
 
        init do
@@ -320,25 +295,22 @@ class Namespace
                inner_namespaces.add new NamespaceRef(id, full_name)
        end
 
-       redef fun declare_class(id: String, full_name: String, prot: String) do
+       redef fun declare_class(id, name, prot) do
+               assert not id.is_empty else
+                       sys.stderr.write "Inner class declarations without ID are not yet supported.\n"
+               end
                graph.class_to_ns[id] = self
        end
 
        redef fun put_in_graph do
                super
-               var full_name = self["full_name"]
+               var full_name = self.full_name
                if full_name isa String then graph.namespaces[full_name] = self
        end
 
        redef fun put_edges do
                super
                graph.add_edge(self, "PROJECT", graph.project)
-               if self["name"] == self["full_name"] and self["full_name"] != "" then
-                       # The root namespace does not know its children.
-                       var root = graph.by_id[""]
-                       graph.add_edge(self, "PARENT", root)
-                       graph.add_edge(root, "NESTS", self)
-               end
                for ns in inner_namespaces do
                        var node = ns.seek_in(graph)
                        graph.add_edge(node, "PARENT", self)
@@ -385,9 +357,7 @@ class RootNamespace
 
        init do
                super
-               self["full_name"] = ""
-               self["name"] = graph.project["name"]
+               full_name = ""
+               name = graph.project_name
        end
-
-       redef fun declare_namespace(id: String, name: String) do end
 end
index 91ee697..9476739 100644 (file)
@@ -80,8 +80,8 @@ end
 
 # Implements `declare_class`.
 redef class ClassCompound
-       redef fun declare_class(id, full_name, prot) do
-               class_def.declare_class(id, full_name, prot)
+       redef fun declare_class(id, name, prot) do
+               class_def.declare_class(id, name, prot)
        end
 end
 
@@ -93,9 +93,8 @@ redef class ClassDef
        # All `InnerClass` entities registred here are automatically added to the
        # graph with the `ClassDef`.
        #
-       # To ensure that the `full_name` of each `InnerClass` entity is correctly
-       # set and that each inner class will be correctly linked, `declare_class`
-       # should be used to add each inner class.
+       # To ensure that each inner class will be correctly linked,
+       # `declare_class` should be used to add each inner class.
        var inner_classes: SimpleCollection[InnerClass] = new Array[InnerClass]
 
        # Declare an inner class.
@@ -103,11 +102,11 @@ redef class ClassDef
        # Parameters:
        #
        # * `id`: `model_id` of the inner class definition.
-       # * `full_name`: qualified name of the inner class definition.
+       # * `name`: name of the inner class definition.
        # * `prot`: visibility (proctection).
-       fun declare_class(id: String, full_name: String, prot: String) do
+       fun declare_class(id: String, name: String, prot: String) do
                var member = new InnerClass(graph, self, id)
-               member.full_name = full_name
+               member.name = name
                member.visibility = prot
                members.add member
                inner_classes.add member
index f6d9317..05b82cb 100644 (file)
@@ -44,13 +44,10 @@ abstract class MemberOrInner
                self["is_intro"] = is_intro
                if is_intro then
                        var visibility = self["visibility"]
-                       var full_name = self["full_name"]
                        var name = self["name"]
 
                        introducer = create_introducer
-                       if full_name isa String then
-                               introducer.full_name = full_name
-                       else if name isa String then
+                       if name isa String then
                                introducer.name = name
                        end
                        if visibility isa String then
@@ -92,20 +89,6 @@ abstract class MemberOrInner
                end
        end
 
-       redef fun full_name=(full_name: String) do
-               super
-               if introducer != null then
-                       introducer.as(not null).full_name = full_name
-               end
-       end
-
-       redef fun parent_name=(parent_name: String) do
-               super
-               if introducer != null then
-                       introducer.as(not null).parent_name = parent_name
-               end
-       end
-
        # Create an instance of `MemberIntroducer` that will be linked to `self`.
        protected fun create_introducer: INTRODUCER_TYPE is abstract
 
index a89c8f3..8ad7e5e 100644 (file)
@@ -22,3 +22,4 @@ import class_compound
 import module_compound
 import member
 import inner_class
+import namespace_members
index 404bcac..95ce6cb 100644 (file)
@@ -17,6 +17,7 @@ module model::module_compound
 
 import graph
 import class_compound
+import namespace_members
 
 # A source file.
 #
@@ -45,13 +46,8 @@ class FileCompound
                super
        end
 
-       redef fun name_separator: String do return "/"
-
        redef fun location=(location: nullable Location) do
                super
-               if location != null and location.path != null then
-                       full_name = location.path.as(not null)
-               end
                for m in inner_namespaces do m.location = location
        end
 
@@ -76,11 +72,11 @@ class FileCompound
                        sys.stderr.write "Inner mamespace declarations without name are not yet supported (except for the root namespace).\n"
                end
                m = new Module(graph, self, new NamespaceRef(id, full_name))
-               m.location = self["location"].as(nullable Location)
+               m.location = location
                inner_namespaces.add m
        end
 
-       redef fun declare_class(id, full_name, prot) do
+       redef fun declare_class(id, name, prot) do
                assert not id.is_empty else
                        sys.stderr.write "Inner class declarations without ID are not yet supported.\n"
                end
@@ -137,17 +133,20 @@ private class Module
                update_name
        end
 
-       # Update the `full_name` and the `name`.
+       # Update the `name`.
        #
        # Update the short name of the module to the `basename` of the file that
        # declares it.
-       fun update_name do
-               name = file_compound.basename
-               parent_name = namespace.full_name
+       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
+
                graph.add_edge(ns_compound, "DECLARES", self)
 
                for c in file_compound.inner_classes do
@@ -156,6 +155,14 @@ private class Module
                        graph.add_edge(self, "INTRODUCES", class_compound)
                        graph.add_edge(self, "DEFINES", class_compound.class_def)
                end
+
+               if self_class isa SelfClass then
+                       # We assume that only one file is linked to the namespace.
+                       # TODO When Doxygen will provide a way to know which file defines which member, use it.
+                       self_class.location = file_compound.location
+                       graph.add_edge(self, "INTRODUCES", self_class)
+                       graph.add_edge(self, "DEFINES", self_class.class_def)
+               end
        end
 end
 
diff --git a/contrib/neo_doxygen/src/model/namespace_members.nit b/contrib/neo_doxygen/src/model/namespace_members.nit
new file mode 100644 (file)
index 0000000..ce73ee3
--- /dev/null
@@ -0,0 +1,68 @@
+# 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.
+
+# Add support for namespace’s members.
+module model::namespace_members
+
+import class_compound
+import member
+
+redef class Namespace
+       # The class that contains the namespace’s direct members.
+       #
+       # Left `null` for the root namespace and for any namespace with no direct
+       # member. Automatically put in the graph with the namespace.
+       #
+       # Note: In the graph, the `self_class` not linked directly to the namespace.
+       # This is the role of the modules implicitly created by `FileCompound`s to
+       # link a namespace to its `self_class`.
+       #
+       # SEE: `declare_member`
+       var self_class: nullable SelfClass = null
+
+       # Add the specified member as a direct children of the namespace.
+       redef fun declare_member(member) do
+               if self_class == null then self_class = new SelfClass(graph, self)
+               self_class.as(not null).declare_member(member)
+       end
+
+       redef fun put_in_graph do
+               super
+               var self_class = self.self_class
+               if self_class isa SelfClass then self_class.put_in_graph
+       end
+end
+
+redef class RootNamespace
+       redef fun declare_member(member) do
+               assert false else
+                       # TODO Check how Doxygen modelize member of the root namespace.
+                       # Note: Doxygen does not modelize the root namespace.
+                       sys.stderr.write "The addition of a member to the root namespace is not supported yet."
+               end
+       end
+end
+
+# A class that contains a namespace’s direct members.
+class SelfClass
+       super ClassCompound
+
+       # The namespace of the members
+       var namespace: Namespace
+
+       init do
+               super
+               name = "(self)"
+       end
+end
index 48bb5ad..46c6be2 100644 (file)
@@ -22,7 +22,6 @@ import model
 import doxml
 import graph_store
 import console
-import flush_stdout
 import opts
 
 # An importation task.
@@ -60,7 +59,6 @@ class NeoDoxygenJob
                else
                        printn "Reading {dir}... "
                end
-               flush_stdout
                loop
                        for f in list_files(dir) do
                                var path = dir/f
@@ -81,7 +79,6 @@ class NeoDoxygenJob
                else
                        print "{file_count} files read."
                end
-               flush_stdout
        end
 
        # List files in a directory.
@@ -107,7 +104,6 @@ class NeoDoxygenJob
        # Save the graph.
        fun save do
                sys.stdout.write "Linking nodes...{term_save_cursor} "
-               flush_stdout
                model.put_edges
                print "{term_rewind} Done."
                var nodes = model.all_nodes
index 15a7531..73adc61 100644 (file)
@@ -25,41 +25,67 @@ var b_ns = new Namespace(graph)
 var c_ns = new Namespace(graph)
 var d_ns = new Namespace(graph)
 var buffer = new RopeBuffer
+var root_ns = graph.by_id[""].as(Namespace)
+var location: Location
 
-file.full_name = "Bar.java"
+file.name = "Bar.java"
 file.model_id = "_Bar_8java"
+location = new Location
+location.path = "a/b/Bar.java"
+file.location = location
 file.declare_class("classa_b_bar", "a::b::Bar", "package")
 file.declare_class("classbaz", "Baz", "")
 file.declare_namespace("", "a::b")
 file.put_in_graph
 
-file_2.full_name = "Bar.java"
+file_2.name = "Bar.java"
 file_2.model_id = "_Bar_8java_2"
+location = new Location
+location.path = "Bar.java"
+file_2.location = location
 file_2.declare_namespace("namespacec", "c")
 file_2.declare_namespace("", "d")
 file_2.put_in_graph
 
 bar_class.model_id = "classa_b_bar"
-bar_class.full_name = "a::b::Bar"
+bar_class.name = "Bar"
+location = new Location
+location.path = "a/b/Bar.class"
+location.line_start = 5
+location.column_start = 1
+location.line_end = 100
+location.column_end = 10
+bar_class.location = location
 bar_class.put_in_graph
 
 baz_class.model_id = "classbaz"
-baz_class.full_name = "Baz"
+baz_class.name = "Baz"
+location = new Location
+location.path = "Baz.jar"
+baz_class.location = location
 baz_class.put_in_graph
 
+root_ns.declare_namespace("", "a")
+root_ns.declare_namespace("namespacec", "c")
+root_ns.declare_namespace("", "d")
+
+a_ns.name = "a"
 a_ns.full_name = "a"
 a_ns.declare_namespace("", "a::b")
 a_ns.put_in_graph
 
+b_ns.name = "b"
 b_ns.full_name = "a::b"
 b_ns.declare_class("classa_b_bar", "", "")
 b_ns.put_in_graph
 
 c_ns.model_id = "namespacec"
+c_ns.name = "c"
 c_ns.full_name = "c"
 c_ns.put_in_graph
 
 d_ns.model_id = "namespaced"
+d_ns.name = "d"
 d_ns.full_name = "d"
 d_ns.put_in_graph
 
diff --git a/contrib/neo_doxygen/src/tests/neo_doxygen_namespace_members.nit b/contrib/neo_doxygen/src/tests/neo_doxygen_namespace_members.nit
new file mode 100644 (file)
index 0000000..346723d
--- /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
+import model
+
+var graph = new ProjectGraph("foo")
+var file = new FileCompound(graph)
+var root_ns = graph.by_id[""].as(Namespace)
+var ns = new Namespace(graph)
+var member = new Attribute(graph)
+var buffer = new RopeBuffer
+
+file.name = "foo.py"
+file.model_id = "_foo_8py"
+file.declare_namespace("namespacefoo", "foo")
+file.put_in_graph
+
+member.name = "bar"
+member.put_in_graph
+
+ns.model_id = "namespacefoo"
+ns.name = "foo"
+ns.declare_member(member)
+ns.put_in_graph
+
+root_ns.declare_namespace("namespacefoo", "")
+
+graph.add_global_modules
+graph.put_edges
+graph.debug buffer
+print buffer
diff --git a/contrib/neo_doxygen/tests/.gitignore b/contrib/neo_doxygen/tests/.gitignore
new file mode 100644 (file)
index 0000000..ad8b991
--- /dev/null
@@ -0,0 +1,2 @@
+/*/Makefile
+/*/.nx_config
index 6201ecd..5c2c616 100644 (file)
@@ -2,3 +2,7 @@ Data files for tests.
 
 For test scripts, see `../src/tests`. To regenerate the XML documents, run
 `make`.
+
+## Required to Generate the XML documents
+
+* [Doxygen](http://www.doxygen.org/)
diff --git a/contrib/neo_doxygen/tests/python-def/Doxyfile b/contrib/neo_doxygen/tests/python-def/Doxyfile
new file mode 100644 (file)
index 0000000..bd06324
--- /dev/null
@@ -0,0 +1,2381 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Test Project"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# 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
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = YES
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = src
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf \
+                         *.as \
+                         *.js
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH      =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/contrib/neo_doxygen/tests/python-def/README.md b/contrib/neo_doxygen/tests/python-def/README.md
new file mode 100644 (file)
index 0000000..aa110bd
--- /dev/null
@@ -0,0 +1,5 @@
+This directory contains a dummy Python project for testing purposes.
+
+To regenerate the XML output located in `xml`, run `make`. If the `Makefile`
+does not exists, you can regenerate it by running `make bootstrap` in the parent
+directory.
similarity index 76%
rename from contrib/neo_doxygen/src/flush_stdout.nit
rename to contrib/neo_doxygen/tests/python-def/src/foo.py
index 30be3fc..ddb3cf3 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Add the ability to flush the standard output.
-module flush_stdout
-
-in "C Header" `{
-       #include <stdio.h>
-`}
-
-# Flush the standard output.
-fun flush_stdout in "C" `{
-       fflush(stdout);
-`}
+## A `bar` function in the `foo` namespace.
+def bar:
+       """By default, Doxygen recognizes anything in the docstrings as verbatim
+       detailed description."""
+       pass
diff --git a/contrib/neo_doxygen/tests/python-def/xml/combine.xslt b/contrib/neo_doxygen/tests/python-def/xml/combine.xslt
new file mode 100644 (file)
index 0000000..c148ee4
--- /dev/null
@@ -0,0 +1,15 @@
+<!-- XSLT script to combine the generated output into a single file. 
+     If you have xsltproc you could use:
+     xsltproc combine.xslt index.xml >all.xml
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output method="xml" version="1.0" indent="no" standalone="yes" />
+  <xsl:template match="/">
+    <doxygen version="{doxygenindex/@version}">
+      <!-- Load all doxgen generated xml files -->
+      <xsl:for-each select="doxygenindex/compound">
+        <xsl:copy-of select="document( concat( @refid, '.xml' ) )/doxygen/*" />
+      </xsl:for-each>
+    </doxygen>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/contrib/neo_doxygen/tests/python-def/xml/compound.xsd b/contrib/neo_doxygen/tests/python-def/xml/compound.xsd
new file mode 100644 (file)
index 0000000..86740f4
--- /dev/null
@@ -0,0 +1,1092 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doxygen" type="DoxygenType"/>
+
+  <!-- Complex types -->
+
+  <xsd:complexType name="DoxygenType">
+    <xsd:sequence maxOccurs="unbounded">
+      <xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="version" type="DoxVersionNumber" use="required" />
+  </xsd:complexType>
+
+  <xsd:complexType name="compounddefType">
+    <xsd:sequence>
+      <xsd:element name="compoundname" type="xsd:string"/>
+      <xsd:element name="title" type="xsd:string" minOccurs="0" />
+      <xsd:element name="basecompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="derivedcompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="includes" type="incType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="includedby" type="incType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="incdepgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="invincdepgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="innerdir" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerfile" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerclass" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innernamespace" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerpage" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+      <xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="inheritancegraph" type="graphType" minOccurs="0" />
+      <xsd:element name="collaborationgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="programlisting" type="listingType" minOccurs="0" />
+      <xsd:element name="location" type="locationType" minOccurs="0" />
+      <xsd:element name="listofallmembers" type="listofallmembersType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="kind" type="DoxCompoundKind" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="final" type="DoxBool" use="optional"/>
+    <xsd:attribute name="sealed" type="DoxBool" use="optional"/>
+    <xsd:attribute name="abstract" type="DoxBool" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="listofallmembersType">
+    <xsd:sequence>
+      <xsd:element name="member" type="memberRefType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="memberRefType">
+    <xsd:sequence>
+      <xsd:element name="scope" />
+      <xsd:element name="name" />
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="virt" type="DoxVirtualKind" />
+    <xsd:attribute name="ambiguityscope" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="compoundRefType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" use="optional" />
+        <xsd:attribute name="prot" type="DoxProtectionKind" />
+        <xsd:attribute name="virt" type="DoxVirtualKind" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="reimplementType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="incType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+        <xsd:attribute name="local" type="DoxBool" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="refType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+        <xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="refTextType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+       <xsd:attribute name="refid" type="xsd:string" />
+       <xsd:attribute name="kindref" type="DoxRefKind" />
+       <xsd:attribute name="external" type="xsd:string" use="optional"/>
+       <xsd:attribute name="tooltip" type="xsd:string" use="optional"/>
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="sectiondefType">
+    <xsd:sequence>
+      <xsd:element name="header" type="xsd:string" minOccurs="0" />
+      <xsd:element name="description" type="descriptionType" minOccurs="0" />
+      <xsd:element name="memberdef" type="memberdefType" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxSectionKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="memberdefType">
+    <xsd:sequence>
+      <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+      <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="definition" minOccurs="0" />
+      <xsd:element name="argsstring" minOccurs="0" />
+      <xsd:element name="name" />
+      <xsd:element name="read" minOccurs="0" />
+      <xsd:element name="write" minOccurs="0" />
+      <xsd:element name="bitfield" minOccurs="0" />
+      <xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="enumvalue" type="enumvalueType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="exceptions" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="inbodydescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="location" type="locationType" />
+      <xsd:element name="references" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="referencedby" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxMemberKind" />
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="static" type="DoxBool" />
+    <xsd:attribute name="const" type="DoxBool" use="optional"/>
+    <xsd:attribute name="explicit" type="DoxBool" use="optional"/>
+    <xsd:attribute name="inline" type="DoxBool" use="optional"/>
+    <xsd:attribute name="virt" type="DoxVirtualKind" use="optional"/>
+    <xsd:attribute name="volatile" type="DoxBool" use="optional"/>
+    <xsd:attribute name="mutable" type="DoxBool" use="optional"/>
+    <!-- Qt property -->
+    <xsd:attribute name="readable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="writable" type="DoxBool" use="optional"/>
+    <!-- C++/CLI variable -->
+    <xsd:attribute name="initonly" type="DoxBool" use="optional"/>
+    <!-- C++/CLI and C# property -->
+    <xsd:attribute name="settable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="gettable" type="DoxBool" use="optional"/>
+    <!-- C++/CLI function -->
+    <xsd:attribute name="final" type="DoxBool" use="optional"/>
+    <xsd:attribute name="sealed" type="DoxBool" use="optional"/>
+    <xsd:attribute name="new" type="DoxBool" use="optional"/>
+    <!-- C++/CLI event -->
+    <xsd:attribute name="add" type="DoxBool" use="optional"/>
+    <xsd:attribute name="remove" type="DoxBool" use="optional"/>
+    <xsd:attribute name="raise" type="DoxBool" use="optional"/>
+    <!-- Objective-C 2.0 protocol method -->
+    <xsd:attribute name="optional" type="DoxBool" use="optional"/>
+    <xsd:attribute name="required" type="DoxBool" use="optional"/>
+    <!-- Objective-C 2.0 property accessor -->
+    <xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
+    <!-- UNO IDL -->
+    <xsd:attribute name="attribute" type="DoxBool" use="optional"/>
+    <xsd:attribute name="property" type="DoxBool" use="optional"/>
+    <xsd:attribute name="readonly" type="DoxBool" use="optional"/>
+    <xsd:attribute name="bound" type="DoxBool" use="optional"/>
+    <xsd:attribute name="removable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="contrained" type="DoxBool" use="optional"/>
+    <xsd:attribute name="transient" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybevoid" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybedefault" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybeambiguous" type="DoxBool" use="optional"/>
+
+  </xsd:complexType>
+
+  <xsd:complexType name="descriptionType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" minOccurs="0"/>          
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="enumvalueType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="name" />
+      <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="templateparamlistType">
+    <xsd:sequence>
+      <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="paramType">
+    <xsd:sequence>
+      <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="declname" minOccurs="0" />
+      <xsd:element name="defname" minOccurs="0" />
+      <xsd:element name="array" minOccurs="0" />
+      <xsd:element name="defval" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="linkedTextType" mixed="true">
+    <xsd:sequence>
+    <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="graphType">
+    <xsd:sequence>
+      <xsd:element name="node" type="nodeType" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="nodeType">
+    <xsd:sequence>
+      <xsd:element name="label" />
+      <xsd:element name="link" type="linkType" minOccurs="0" />
+      <xsd:element name="childnode" type="childnodeType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="childnodeType">
+    <xsd:sequence>
+      <xsd:element name="edgelabel" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="relation" type="DoxGraphRelation" />
+  </xsd:complexType>
+
+  <xsd:complexType name="linkType">
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="external" type="xsd:string" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="listingType">
+    <xsd:sequence>
+      <xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="codelineType">
+    <xsd:sequence>
+      <xsd:element name="highlight" type="highlightType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="lineno" type="xsd:integer" />
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="refkind" type="DoxRefKind" />
+    <xsd:attribute name="external" type="DoxBool" />
+  </xsd:complexType>
+
+  <xsd:complexType name="highlightType" mixed="true">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="sp" />
+      <xsd:element name="ref" type="refTextType" />
+    </xsd:choice>
+    <xsd:attribute name="class" type="DoxHighlightClass" />
+  </xsd:complexType>
+
+  <xsd:complexType name="referenceType" mixed="true">
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="compoundref" type="xsd:string" use="optional" />
+    <xsd:attribute name="startline" type="xsd:integer" />
+    <xsd:attribute name="endline" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="locationType">
+    <xsd:attribute name="file" type="xsd:string" />
+    <xsd:attribute name="line" type="xsd:integer" />
+    <xsd:attribute name="column" type="xsd:integer" use="optional"/>
+    <xsd:attribute name="bodyfile" type="xsd:string" />
+    <xsd:attribute name="bodystart" type="xsd:integer" />
+    <xsd:attribute name="bodyend" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect1Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />       
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS1Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect2Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />       
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS2Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect3Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />       
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect4" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS3Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect4Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />       
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS4Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS1Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS2Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS3Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS4Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+  <xsd:group name="docTitleCmdGroup">
+    <xsd:choice>
+      <xsd:element name="ulink" type="docURLLink" />
+      <xsd:element name="bold" type="docMarkupType" />
+      <xsd:element name="emphasis" type="docMarkupType" />
+      <xsd:element name="computeroutput" type="docMarkupType" />
+      <xsd:element name="subscript" type="docMarkupType" />
+      <xsd:element name="superscript" type="docMarkupType" />
+      <xsd:element name="center" type="docMarkupType" />
+      <xsd:element name="small" type="docMarkupType" />
+      <xsd:element name="htmlonly" type="xsd:string" />
+      <xsd:element name="manonly" type="xsd:string" />
+      <xsd:element name="xmlonly" type="xsd:string" />
+      <xsd:element name="rtfonly" type="xsd:string" />
+      <xsd:element name="latexonly" type="xsd:string" />
+      <xsd:element name="dot" type="xsd:string" />
+      <xsd:element name="plantuml" type="xsd:string" />
+      <xsd:element name="anchor" type="docAnchorType" />
+      <xsd:element name="formula" type="docFormulaType" />
+      <xsd:element name="ref" type="docRefTextType" />
+      <xsd:element name="nonbreakablespace" type="docEmptyType" />
+      <xsd:element name="iexcl" type="docEmptyType" />
+      <xsd:element name="cent" type="docEmptyType" />
+      <xsd:element name="pound" type="docEmptyType" />
+      <xsd:element name="curren" type="docEmptyType" />
+      <xsd:element name="yen" type="docEmptyType" />
+      <xsd:element name="brvbar" type="docEmptyType" />
+      <xsd:element name="sect" type="docEmptyType" />
+      <xsd:element name="umlaut" type="docEmptyType" />
+      <xsd:element name="copy" type="docEmptyType" />
+      <xsd:element name="ordf" type="docEmptyType" />
+      <xsd:element name="laquo" type="docEmptyType" />
+      <xsd:element name="not" type="docEmptyType" />
+      <xsd:element name="shy" type="docEmptyType" />
+      <xsd:element name="registered" type="docEmptyType" />
+      <xsd:element name="macr" type="docEmptyType" />
+      <xsd:element name="deg" type="docEmptyType" />
+      <xsd:element name="plusmn" type="docEmptyType" />
+      <xsd:element name="sup2" type="docEmptyType" />
+      <xsd:element name="sup3" type="docEmptyType" />
+      <xsd:element name="acute" type="docEmptyType" />
+      <xsd:element name="micro" type="docEmptyType" />
+      <xsd:element name="para" type="docEmptyType" />
+      <xsd:element name="middot" type="docEmptyType" />
+      <xsd:element name="cedil" type="docEmptyType" />
+      <xsd:element name="sup1" type="docEmptyType" />
+      <xsd:element name="ordm" type="docEmptyType" />
+      <xsd:element name="raquo" type="docEmptyType" />
+      <xsd:element name="frac14" type="docEmptyType" />
+      <xsd:element name="frac12" type="docEmptyType" />
+      <xsd:element name="frac34" type="docEmptyType" />
+      <xsd:element name="iquest" type="docEmptyType" />
+      <xsd:element name="Agrave" type="docEmptyType" />
+      <xsd:element name="Aacute" type="docEmptyType" />
+      <xsd:element name="Acirc" type="docEmptyType" />
+      <xsd:element name="Atilde" type="docEmptyType" />
+      <xsd:element name="Aumlaut" type="docEmptyType" />
+      <xsd:element name="Aring" type="docEmptyType" />
+      <xsd:element name="AElig" type="docEmptyType" />
+      <xsd:element name="Ccedil" type="docEmptyType" />
+      <xsd:element name="Egrave" type="docEmptyType" />
+      <xsd:element name="Eacute" type="docEmptyType" />
+      <xsd:element name="Ecirc" type="docEmptyType" />
+      <xsd:element name="Eumlaut" type="docEmptyType" />
+      <xsd:element name="Igrave" type="docEmptyType" />
+      <xsd:element name="Iacute" type="docEmptyType" />
+      <xsd:element name="Icirc" type="docEmptyType" />
+      <xsd:element name="Iumlaut" type="docEmptyType" />
+      <xsd:element name="ETH" type="docEmptyType" />
+      <xsd:element name="Ntilde" type="docEmptyType" />
+      <xsd:element name="Ograve" type="docEmptyType" />
+      <xsd:element name="Oacute" type="docEmptyType" />
+      <xsd:element name="Ocirc" type="docEmptyType" />
+      <xsd:element name="Otilde" type="docEmptyType" />
+      <xsd:element name="Oumlaut" type="docEmptyType" />
+      <xsd:element name="times" type="docEmptyType" />
+      <xsd:element name="Oslash" type="docEmptyType" />
+      <xsd:element name="Ugrave" type="docEmptyType" />
+      <xsd:element name="Uacute" type="docEmptyType" />
+      <xsd:element name="Ucirc" type="docEmptyType" />
+      <xsd:element name="Uumlaut" type="docEmptyType" />
+      <xsd:element name="Yacute" type="docEmptyType" />
+      <xsd:element name="THORN" type="docEmptyType" />
+      <xsd:element name="szlig" type="docEmptyType" />
+      <xsd:element name="agrave" type="docEmptyType" />
+      <xsd:element name="aacute" type="docEmptyType" />
+      <xsd:element name="acirc" type="docEmptyType" />
+      <xsd:element name="atilde" type="docEmptyType" />
+      <xsd:element name="aumlaut" type="docEmptyType" />
+      <xsd:element name="aring" type="docEmptyType" />
+      <xsd:element name="aelig" type="docEmptyType" />
+      <xsd:element name="ccedil" type="docEmptyType" />
+      <xsd:element name="egrave" type="docEmptyType" />
+      <xsd:element name="eacute" type="docEmptyType" />
+      <xsd:element name="ecirc" type="docEmptyType" />
+      <xsd:element name="eumlaut" type="docEmptyType" />
+      <xsd:element name="igrave" type="docEmptyType" />
+      <xsd:element name="iacute" type="docEmptyType" />
+      <xsd:element name="icirc" type="docEmptyType" />
+      <xsd:element name="iumlaut" type="docEmptyType" />
+      <xsd:element name="eth" type="docEmptyType" />
+      <xsd:element name="ntilde" type="docEmptyType" />
+      <xsd:element name="ograve" type="docEmptyType" />
+      <xsd:element name="oacute" type="docEmptyType" />
+      <xsd:element name="ocirc" type="docEmptyType" />
+      <xsd:element name="otilde" type="docEmptyType" />
+      <xsd:element name="oumlaut" type="docEmptyType" />
+      <xsd:element name="divide" type="docEmptyType" />
+      <xsd:element name="oslash" type="docEmptyType" />
+      <xsd:element name="ugrave" type="docEmptyType" />
+      <xsd:element name="uacute" type="docEmptyType" />
+      <xsd:element name="ucirc" type="docEmptyType" />
+      <xsd:element name="uumlaut" type="docEmptyType" />
+      <xsd:element name="yacute" type="docEmptyType" />
+      <xsd:element name="thorn" type="docEmptyType" />
+      <xsd:element name="yumlaut" type="docEmptyType" />
+      <xsd:element name="fnof" type="docEmptyType" />
+      <xsd:element name="Alpha" type="docEmptyType" />
+      <xsd:element name="Beta" type="docEmptyType" />
+      <xsd:element name="Gamma" type="docEmptyType" />
+      <xsd:element name="Delta" type="docEmptyType" />
+      <xsd:element name="Epsilon" type="docEmptyType" />
+      <xsd:element name="Zeta" type="docEmptyType" />
+      <xsd:element name="Eta" type="docEmptyType" />
+      <xsd:element name="Theta" type="docEmptyType" />
+      <xsd:element name="Iota" type="docEmptyType" />
+      <xsd:element name="Kappa" type="docEmptyType" />
+      <xsd:element name="Lambda" type="docEmptyType" />
+      <xsd:element name="Mu" type="docEmptyType" />
+      <xsd:element name="Nu" type="docEmptyType" />
+      <xsd:element name="Xi" type="docEmptyType" />
+      <xsd:element name="Omicron" type="docEmptyType" />
+      <xsd:element name="Pi" type="docEmptyType" />
+      <xsd:element name="Rho" type="docEmptyType" />
+      <xsd:element name="Sigma" type="docEmptyType" />
+      <xsd:element name="Tau" type="docEmptyType" />
+      <xsd:element name="Upsilon" type="docEmptyType" />
+      <xsd:element name="Phi" type="docEmptyType" />
+      <xsd:element name="Chi" type="docEmptyType" />
+      <xsd:element name="Psi" type="docEmptyType" />
+      <xsd:element name="Omega" type="docEmptyType" />
+      <xsd:element name="alpha" type="docEmptyType" />
+      <xsd:element name="beta" type="docEmptyType" />
+      <xsd:element name="gamma" type="docEmptyType" />
+      <xsd:element name="delta" type="docEmptyType" />
+      <xsd:element name="epsilon" type="docEmptyType" />
+      <xsd:element name="zeta" type="docEmptyType" />
+      <xsd:element name="eta" type="docEmptyType" />
+      <xsd:element name="theta" type="docEmptyType" />
+      <xsd:element name="iota" type="docEmptyType" />
+      <xsd:element name="kappa" type="docEmptyType" />
+      <xsd:element name="lambda" type="docEmptyType" />
+      <xsd:element name="mu" type="docEmptyType" />
+      <xsd:element name="nu" type="docEmptyType" />
+      <xsd:element name="xi" type="docEmptyType" />
+      <xsd:element name="omicron" type="docEmptyType" />
+      <xsd:element name="pi" type="docEmptyType" />
+      <xsd:element name="rho" type="docEmptyType" />
+      <xsd:element name="sigmaf" type="docEmptyType" />
+      <xsd:element name="sigma" type="docEmptyType" />
+      <xsd:element name="tau" type="docEmptyType" />
+      <xsd:element name="upsilon" type="docEmptyType" />
+      <xsd:element name="phi" type="docEmptyType" />
+      <xsd:element name="chi" type="docEmptyType" />
+      <xsd:element name="psi" type="docEmptyType" />
+      <xsd:element name="omega" type="docEmptyType" />
+      <xsd:element name="thetasym" type="docEmptyType" />
+      <xsd:element name="upsih" type="docEmptyType" />
+      <xsd:element name="piv" type="docEmptyType" />
+      <xsd:element name="bull" type="docEmptyType" />
+      <xsd:element name="hellip" type="docEmptyType" />
+      <xsd:element name="prime" type="docEmptyType" />
+      <xsd:element name="Prime" type="docEmptyType" />
+      <xsd:element name="oline" type="docEmptyType" />
+      <xsd:element name="frasl" type="docEmptyType" />
+      <xsd:element name="weierp" type="docEmptyType" />
+      <xsd:element name="image" type="docEmptyType" />
+      <xsd:element name="real" type="docEmptyType" />
+      <xsd:element name="trademark" type="docEmptyType" />
+      <xsd:element name="alefsym" type="docEmptyType" />
+      <xsd:element name="larr" type="docEmptyType" />
+      <xsd:element name="uarr" type="docEmptyType" />
+      <xsd:element name="rarr" type="docEmptyType" />
+      <xsd:element name="darr" type="docEmptyType" />
+      <xsd:element name="harr" type="docEmptyType" />
+      <xsd:element name="crarr" type="docEmptyType" />
+      <xsd:element name="lArr" type="docEmptyType" />
+      <xsd:element name="uArr" type="docEmptyType" />
+      <xsd:element name="rArr" type="docEmptyType" />
+      <xsd:element name="dArr" type="docEmptyType" />
+      <xsd:element name="hArr" type="docEmptyType" />
+      <xsd:element name="forall" type="docEmptyType" />
+      <xsd:element name="part" type="docEmptyType" />
+      <xsd:element name="exist" type="docEmptyType" />
+      <xsd:element name="empty" type="docEmptyType" />
+      <xsd:element name="nabla" type="docEmptyType" />
+      <xsd:element name="isin" type="docEmptyType" />
+      <xsd:element name="notin" type="docEmptyType" />
+      <xsd:element name="ni" type="docEmptyType" />
+      <xsd:element name="prod" type="docEmptyType" />
+      <xsd:element name="sum" type="docEmptyType" />
+      <xsd:element name="minus" type="docEmptyType" />
+      <xsd:element name="lowast" type="docEmptyType" />
+      <xsd:element name="radic" type="docEmptyType" />
+      <xsd:element name="prop" type="docEmptyType" />
+      <xsd:element name="infin" type="docEmptyType" />
+      <xsd:element name="ang" type="docEmptyType" />
+      <xsd:element name="and" type="docEmptyType" />
+      <xsd:element name="or" type="docEmptyType" />
+      <xsd:element name="cap" type="docEmptyType" />
+      <xsd:element name="cup" type="docEmptyType" />
+      <xsd:element name="int" type="docEmptyType" />
+      <xsd:element name="there4" type="docEmptyType" />
+      <xsd:element name="sim" type="docEmptyType" />
+      <xsd:element name="cong" type="docEmptyType" />
+      <xsd:element name="asymp" type="docEmptyType" />
+      <xsd:element name="ne" type="docEmptyType" />
+      <xsd:element name="equiv" type="docEmptyType" />
+      <xsd:element name="le" type="docEmptyType" />
+      <xsd:element name="ge" type="docEmptyType" />
+      <xsd:element name="sub" type="docEmptyType" />
+      <xsd:element name="sup" type="docEmptyType" />
+      <xsd:element name="nsub" type="docEmptyType" />
+      <xsd:element name="sube" type="docEmptyType" />
+      <xsd:element name="supe" type="docEmptyType" />
+      <xsd:element name="oplus" type="docEmptyType" />
+      <xsd:element name="otimes" type="docEmptyType" />
+      <xsd:element name="perp" type="docEmptyType" />
+      <xsd:element name="sdot" type="docEmptyType" />
+      <xsd:element name="lceil" type="docEmptyType" />
+      <xsd:element name="rceil" type="docEmptyType" />
+      <xsd:element name="lfloor" type="docEmptyType" />
+      <xsd:element name="rfloor" type="docEmptyType" />
+      <xsd:element name="lang" type="docEmptyType" />
+      <xsd:element name="rang" type="docEmptyType" />
+      <xsd:element name="loz" type="docEmptyType" />
+      <xsd:element name="spades" type="docEmptyType" />
+      <xsd:element name="clubs" type="docEmptyType" />
+      <xsd:element name="hearts" type="docEmptyType" />
+      <xsd:element name="diams" type="docEmptyType" />
+      <xsd:element name="OElig" type="docEmptyType" />
+      <xsd:element name="oelig" type="docEmptyType" />
+      <xsd:element name="Scaron" type="docEmptyType" />
+      <xsd:element name="scaron" type="docEmptyType" />
+      <xsd:element name="Yumlaut" type="docEmptyType" />
+      <xsd:element name="circ" type="docEmptyType" />
+      <xsd:element name="tilde" type="docEmptyType" />
+      <xsd:element name="ensp" type="docEmptyType" />
+      <xsd:element name="emsp" type="docEmptyType" />
+      <xsd:element name="thinsp" type="docEmptyType" />
+      <xsd:element name="zwnj" type="docEmptyType" />
+      <xsd:element name="zwj" type="docEmptyType" />
+      <xsd:element name="lrm" type="docEmptyType" />
+      <xsd:element name="rlm" type="docEmptyType" />
+      <xsd:element name="ndash" type="docEmptyType" />
+      <xsd:element name="mdash" type="docEmptyType" />
+      <xsd:element name="lsquo" type="docEmptyType" />
+      <xsd:element name="rsquo" type="docEmptyType" />
+      <xsd:element name="sbquo" type="docEmptyType" />
+      <xsd:element name="ldquo" type="docEmptyType" />
+      <xsd:element name="rdquo" type="docEmptyType" />
+      <xsd:element name="bdquo" type="docEmptyType" />
+      <xsd:element name="dagger" type="docEmptyType" />
+      <xsd:element name="Dagger" type="docEmptyType" />
+      <xsd:element name="permil" type="docEmptyType" />
+      <xsd:element name="lsaquo" type="docEmptyType" />
+      <xsd:element name="rsaquo" type="docEmptyType" />
+      <xsd:element name="euro" type="docEmptyType" />
+      <xsd:element name="trademark" type="docEmptyType" />
+    </xsd:choice>
+  </xsd:group>
+
+  <xsd:complexType name="docTitleType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:group name="docCmdGroup">
+    <xsd:choice>
+      <xsd:group ref="docTitleCmdGroup"/>
+      <xsd:element name="linebreak" type="docEmptyType" />
+      <xsd:element name="hruler" type="docEmptyType" />
+      <xsd:element name="preformatted" type="docMarkupType" />
+      <xsd:element name="programlisting" type="listingType" />
+      <xsd:element name="verbatim" type="xsd:string" />
+      <xsd:element name="indexentry" type="docIndexEntryType" />
+      <xsd:element name="orderedlist" type="docListType" />
+      <xsd:element name="itemizedlist" type="docListType" />
+      <xsd:element name="simplesect" type="docSimpleSectType" />
+      <xsd:element name="title" type="docTitleType" />
+      <xsd:element name="variablelist" type="docVariableListType" />
+      <xsd:element name="table" type="docTableType" />
+      <xsd:element name="heading" type="docHeadingType" />
+      <xsd:element name="image" type="docImageType" />
+      <xsd:element name="dotfile" type="docFileType" />
+      <xsd:element name="mscfile" type="docFileType" />
+      <xsd:element name="diafile" type="docFileType" />
+      <xsd:element name="toclist" type="docTocListType" />
+      <xsd:element name="language" type="docLanguageType" />
+      <xsd:element name="parameterlist" type="docParamListType" />
+      <xsd:element name="xrefsect" type="docXRefSectType" />
+      <xsd:element name="copydoc" type="docCopyType" />
+      <xsd:element name="blockquote" type="docBlockQuoteType" />
+      <xsd:element name="parblock" type="docParBlockType" />
+    </xsd:choice>
+  </xsd:group>
+
+  <xsd:complexType name="docParaType" mixed="true">
+    <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docMarkupType" mixed="true">
+    <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docURLLink" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="url" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docAnchorType" mixed="true">
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docFormulaType" mixed="true">
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docIndexEntryType">
+    <xsd:sequence>
+      <xsd:element name="primaryie" type="xsd:string" />
+      <xsd:element name="secondaryie" type="xsd:string" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docListType">
+    <xsd:sequence>
+      <xsd:element name="listitem" type="docListItemType" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docListItemType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docSimpleSectType">
+    <xsd:sequence>
+      <xsd:element name="title" type="docTitleType" minOccurs="0" />
+      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+        <xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
+      </xsd:sequence>
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxSimpleSectKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docVarListEntryType">
+    <xsd:sequence>
+      <xsd:element name="term" type="docTitleType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:group name="docVariableListGroup">
+    <xsd:sequence>
+      <xsd:element name="varlistentry" type="docVarListEntryType" />
+      <xsd:element name="listitem" type="docListItemType" />
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:complexType name="docVariableListType">
+    <xsd:sequence>
+      <xsd:group ref="docVariableListGroup" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docRefTextType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="kindref" type="DoxRefKind" />
+    <xsd:attribute name="external" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docTableType">
+    <xsd:sequence>
+      <xsd:element name="row" type="docRowType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="caption" type="docCaptionType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="rows" type="xsd:integer" />
+    <xsd:attribute name="cols" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docRowType">
+    <xsd:sequence>
+      <xsd:element name="entry" type="docEntryType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docEntryType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="thead" type="DoxBool" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docCaptionType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docHeadingType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="level" type="xsd:integer" /> <!-- todo: range 1-6 -->
+  </xsd:complexType>
+
+  <xsd:complexType name="docImageType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="type" type="DoxImageKind" /> 
+    <xsd:attribute name="name" type="xsd:string" /> 
+    <xsd:attribute name="width" type="xsd:string" /> 
+    <xsd:attribute name="height" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docFileType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="name" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docTocItemType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="id" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docTocListType">
+    <xsd:sequence>
+      <xsd:element name="tocitem" type="docTocItemType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docLanguageType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="langid" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamListType">
+    <xsd:sequence>
+      <xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxParamListKind" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamListItem">
+    <xsd:sequence>
+      <xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="parameterdescription" type="descriptionType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamNameList">
+    <xsd:sequence>
+      <xsd:element name="parametertype" type="docParamType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamName" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+    <xsd:attribute name="direction" type="DoxParamDir" use="optional" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docXRefSectType">
+    <xsd:sequence>
+      <xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="xrefdescription" type="descriptionType" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docCopyType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="link" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docBlockQuoteType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParBlockType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docEmptyType"/>
+
+  <!-- Simple types -->
+
+  <xsd:simpleType name="DoxBool">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="yes" />
+      <xsd:enumeration value="no" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxGraphRelation">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="include" />
+      <xsd:enumeration value="usage" />
+      <xsd:enumeration value="template-instance" />
+      <xsd:enumeration value="public-inheritance" />
+      <xsd:enumeration value="protected-inheritance" />
+      <xsd:enumeration value="private-inheritance" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxRefKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="compound" />
+      <xsd:enumeration value="member" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxMemberKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="define" />
+      <xsd:enumeration value="property" />
+      <xsd:enumeration value="event" />
+      <xsd:enumeration value="variable" />
+      <xsd:enumeration value="typedef" />
+      <xsd:enumeration value="enum" />
+      <xsd:enumeration value="function" />
+      <xsd:enumeration value="signal" />
+      <xsd:enumeration value="prototype" />
+      <xsd:enumeration value="friend" />
+      <xsd:enumeration value="dcop" />
+      <xsd:enumeration value="slot" />
+      <xsd:enumeration value="interface" />
+      <xsd:enumeration value="service" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxProtectionKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="public" />
+      <xsd:enumeration value="protected" />
+      <xsd:enumeration value="private" />
+      <xsd:enumeration value="package" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxVirtualKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="non-virtual" />
+      <xsd:enumeration value="virtual" />
+      <xsd:enumeration value="pure-virtual" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxCompoundKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="class" />
+      <xsd:enumeration value="struct" />
+      <xsd:enumeration value="union" />
+      <xsd:enumeration value="interface" />
+      <xsd:enumeration value="protocol" />
+      <xsd:enumeration value="category" />
+      <xsd:enumeration value="exception" />
+      <xsd:enumeration value="service" />
+      <xsd:enumeration value="singleton" />
+      <xsd:enumeration value="module" />
+      <xsd:enumeration value="type" />
+      <xsd:enumeration value="file" />
+      <xsd:enumeration value="namespace" />
+      <xsd:enumeration value="group" />
+      <xsd:enumeration value="page" />
+      <xsd:enumeration value="example" />
+      <xsd:enumeration value="dir" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxSectionKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="user-defined" />
+      <xsd:enumeration value="public-type" />
+      <xsd:enumeration value="public-func" />
+      <xsd:enumeration value="public-attrib" />
+      <xsd:enumeration value="public-slot" />
+      <xsd:enumeration value="signal" />
+      <xsd:enumeration value="dcop-func" />
+      <xsd:enumeration value="property" />
+      <xsd:enumeration value="event" />
+      <xsd:enumeration value="public-static-func" />
+      <xsd:enumeration value="public-static-attrib" />
+      <xsd:enumeration value="protected-type" />
+      <xsd:enumeration value="protected-func" />
+      <xsd:enumeration value="protected-attrib" />
+      <xsd:enumeration value="protected-slot" />
+      <xsd:enumeration value="protected-static-func" />
+      <xsd:enumeration value="protected-static-attrib" />
+      <xsd:enumeration value="package-type" />
+      <xsd:enumeration value="package-func" />
+      <xsd:enumeration value="package-attrib" />
+      <xsd:enumeration value="package-static-func" />
+      <xsd:enumeration value="package-static-attrib" />
+      <xsd:enumeration value="private-type" />
+      <xsd:enumeration value="private-func" />
+      <xsd:enumeration value="private-attrib" />
+      <xsd:enumeration value="private-slot" />
+      <xsd:enumeration value="private-static-func" />
+      <xsd:enumeration value="private-static-attrib" />
+      <xsd:enumeration value="friend" />
+      <xsd:enumeration value="related" />
+      <xsd:enumeration value="define" />
+      <xsd:enumeration value="prototype" />
+      <xsd:enumeration value="typedef" />
+      <xsd:enumeration value="enum" />
+      <xsd:enumeration value="func" />
+      <xsd:enumeration value="var" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxHighlightClass">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="comment" />
+      <xsd:enumeration value="normal" />
+      <xsd:enumeration value="preprocessor" />
+      <xsd:enumeration value="keyword" />
+      <xsd:enumeration value="keywordtype" />
+      <xsd:enumeration value="keywordflow" />
+      <xsd:enumeration value="stringliteral" />
+      <xsd:enumeration value="charliteral" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxSimpleSectKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="see" />
+      <xsd:enumeration value="return" />
+      <xsd:enumeration value="author" />
+      <xsd:enumeration value="authors" />
+      <xsd:enumeration value="version" />
+      <xsd:enumeration value="since" />
+      <xsd:enumeration value="date" />
+      <xsd:enumeration value="note" />
+      <xsd:enumeration value="warning" />
+      <xsd:enumeration value="pre" />
+      <xsd:enumeration value="post" />
+      <xsd:enumeration value="copyright" />
+      <xsd:enumeration value="invariant" />
+      <xsd:enumeration value="remark" />
+      <xsd:enumeration value="attention" />
+      <xsd:enumeration value="par" />
+      <xsd:enumeration value="rcs" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxVersionNumber">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="\d+\.\d+.*" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxImageKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="html" />
+      <xsd:enumeration value="latex" />
+      <xsd:enumeration value="rtf" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxParamListKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="param" />
+      <xsd:enumeration value="retval" />
+      <xsd:enumeration value="exception" />
+      <xsd:enumeration value="templateparam" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxCharRange">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="[aeiouncAEIOUNC]" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxParamDir">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="in"/>
+      <xsd:enumeration value="out"/>
+      <xsd:enumeration value="inout"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxAccessor">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="retain"/>
+      <xsd:enumeration value="copy"/>
+      <xsd:enumeration value="assign"/>
+      <xsd:enumeration value="weak"/>
+      <xsd:enumeration value="strong"/>
+      <xsd:enumeration value="unretained"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/contrib/neo_doxygen/tests/python-def/xml/dir_68267d1309a1af8e8297ef4c3efbcdba.xml b/contrib/neo_doxygen/tests/python-def/xml/dir_68267d1309a1af8e8297ef4c3efbcdba.xml
new file mode 100644 (file)
index 0000000..538a5bc
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.8">
+  <compounddef id="dir_68267d1309a1af8e8297ef4c3efbcdba" kind="dir">
+    <compoundname>src</compoundname>
+    <innerfile refid="foo_8py">foo.py</innerfile>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="%SOURCE_DIRECTORY%/"/>
+  </compounddef>
+</doxygen>
diff --git a/contrib/neo_doxygen/tests/python-def/xml/foo_8py.xml b/contrib/neo_doxygen/tests/python-def/xml/foo_8py.xml
new file mode 100644 (file)
index 0000000..e01105b
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.8">
+  <compounddef id="foo_8py" kind="file">
+    <compoundname>foo.py</compoundname>
+    <innernamespace refid="namespacefoo">foo</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="%SOURCE_DIRECTORY%/foo.py"/>
+  </compounddef>
+</doxygen>
diff --git a/contrib/neo_doxygen/tests/python-def/xml/index.xml b/contrib/neo_doxygen/tests/python-def/xml/index.xml
new file mode 100644 (file)
index 0000000..be27789
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygenindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd" version="1.8.8">
+  <compound refid="namespacefoo" kind="namespace"><name>foo</name>
+    <member refid="namespacefoo_1aab1e88a2212b202c20f3c9bd799a1ad4" kind="function"><name>bar</name></member>
+  </compound>
+  <compound refid="foo_8py" kind="file"><name>foo.py</name>
+  </compound>
+  <compound refid="dir_68267d1309a1af8e8297ef4c3efbcdba" kind="dir"><name>src</name>
+  </compound>
+</doxygenindex>
diff --git a/contrib/neo_doxygen/tests/python-def/xml/index.xsd b/contrib/neo_doxygen/tests/python-def/xml/index.xsd
new file mode 100644 (file)
index 0000000..d7ab2a9
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doxygenindex" type="DoxygenType"/>
+
+  <xsd:complexType name="DoxygenType">
+    <xsd:sequence>
+      <xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="version" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="CompoundType">
+    <xsd:sequence>
+      <xsd:element name="name" type="xsd:string"/>
+      <xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" use="required"/>
+    <xsd:attribute name="kind" type="CompoundKind" use="required"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="MemberType">
+    <xsd:sequence>
+      <xsd:element name="name" type="xsd:string"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" use="required"/>
+    <xsd:attribute name="kind" type="MemberKind" use="required"/>
+  </xsd:complexType>
+  
+  <xsd:simpleType name="CompoundKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="class"/>
+      <xsd:enumeration value="struct"/>
+      <xsd:enumeration value="union"/>
+      <xsd:enumeration value="interface"/>
+      <xsd:enumeration value="protocol"/>
+      <xsd:enumeration value="category"/>
+      <xsd:enumeration value="exception"/>
+      <xsd:enumeration value="file"/>
+      <xsd:enumeration value="namespace"/>
+      <xsd:enumeration value="group"/>
+      <xsd:enumeration value="page"/>
+      <xsd:enumeration value="example"/>
+      <xsd:enumeration value="dir"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="MemberKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="define"/>
+      <xsd:enumeration value="property"/>
+      <xsd:enumeration value="event"/>
+      <xsd:enumeration value="variable"/>
+      <xsd:enumeration value="typedef"/>
+      <xsd:enumeration value="enum"/>
+      <xsd:enumeration value="enumvalue"/>
+      <xsd:enumeration value="function"/>
+      <xsd:enumeration value="signal"/>
+      <xsd:enumeration value="prototype"/>
+      <xsd:enumeration value="friend"/>
+      <xsd:enumeration value="dcop"/>
+      <xsd:enumeration value="slot"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/contrib/neo_doxygen/tests/python-def/xml/namespacefoo.xml b/contrib/neo_doxygen/tests/python-def/xml/namespacefoo.xml
new file mode 100644 (file)
index 0000000..68c0b1d
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.8">
+  <compounddef id="namespacefoo" kind="namespace">
+    <compoundname>foo</compoundname>
+      <sectiondef kind="func">
+      <memberdef kind="function" id="namespacefoo_1aab1e88a2212b202c20f3c9bd799a1ad4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>def</type>
+        <definition>def foo.bar</definition>
+        <argsstring></argsstring>
+        <name>bar</name>
+        <briefdescription>
+<para>A <computeroutput>bar</computeroutput> function in the <computeroutput>foo</computeroutput> namespace. </para>        </briefdescription>
+        <detaileddescription>
+<para><verbatim>By default, Doxygen recognizes anything in the docstrings as verbatim
+detailed description.</verbatim> </para>        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="%SOURCE_DIRECTORY%/foo.py" line="16" column="1" bodyfile="%SOURCE_DIRECTORY%/foo.py" bodystart="16" bodyend="20"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="%SOURCE_DIRECTORY%/foo.py" line="1" column="1"/>
+  </compounddef>
+</doxygen>
index 3431a86..eed0d4b 100644 (file)
@@ -187,8 +187,7 @@ abstract class Processor
                        skip = new Array[String]
                end
 
-               for prog in test_programs do for engine in engines do
-
+               for engine in engines do for prog in test_programs do
                        # Is is blacklisted?
                        for s in skip do if not s.is_empty and prog.has(s) then
                                if verbose > 0 and rank == 0 then print "Skipping test '{prog}' because of '{s}' in turing.skip"
@@ -303,7 +302,7 @@ class Controller
                                mpi.recv_empty(status.source, status.tag, comm_world)
                                at_work.remove(status.source)
 
-                               if verbose > 1 then print "worker {status.source} is done ({at_work.length} still at work)"
+                               if verbose > 0 then print "Worker {status.source} is done ({at_work.length} still at work)"
                        else
                                print "Unexpected tag {status.tag}"
                                shutdown
@@ -405,9 +404,8 @@ class Worker
                exec_and_check "git config remote.origin.fetch +refs/remotes/origin/pr/*:refs/remotes/origin/pr/*"
                exec_and_check "git fetch origin --quiet"
                exec_and_check "git checkout {branch_hash}"
-               exec_and_check "cp {remote_nit}/bin/nitg bin/"
+               exec_and_check "cp {remote_nit}/bin/*  bin/"
                exec_and_check "src/git-gen-version.sh"
-               exec_and_check "bin/nitg --dir bin/ src/nit.nit src/nitvm.nit"
        end
 
        private fun exec_and_check(cmd: String)
@@ -520,6 +518,8 @@ class Worker
                                                end
                                        end
 
+                                       if verbose > 1 then print "Done testing: {task}"
+
                                        self.results_count = c
                                end
 
@@ -549,7 +549,7 @@ class Worker
        fun send_results
        do
                if results_count > 0 then
-                       if verbose > 1 then print "sending {results_count} results"
+                       if verbose > 2 then print "Sending {results_count} results"
                        mpi.send_from(buffer, 0, results_count*4, controller_rank, result_tag, comm_world)
                        results_count = 0
                end
index ee64f21..609f56c 100644 (file)
@@ -86,7 +86,6 @@ class OpportunityFooter
        redef fun rendering do
                add """
 </div>
-</body>
 <div class="footer">
        <div class="well well-sm">
                <p class="text-muted text-center">
@@ -97,6 +96,7 @@ class OpportunityFooter
                </p>
        </div>
 </div>
+</body>
 </html>
 """
        end
@@ -107,10 +107,13 @@ end
 class OpportunityPage
        super Template
 
+       # The HTML code of the header and of the banner.
        var header = new OpportunityHeader
 
+       # The HTML code of the body.
        var body: Streamable = "" is writable
 
+       # The HTML code of the footer.
        var footer = new OpportunityFooter
 
        redef fun rendering do
diff --git a/contrib/rss_downloader/Makefile b/contrib/rss_downloader/Makefile
new file mode 100644 (file)
index 0000000..3c71d2e
--- /dev/null
@@ -0,0 +1,3 @@
+all:
+       mkdir -p bin/
+       ../../bin/nitc --dir bin/ src/*.nit
diff --git a/contrib/rss_downloader/README.md b/contrib/rss_downloader/README.md
new file mode 100644 (file)
index 0000000..eddc63b
--- /dev/null
@@ -0,0 +1,15 @@
+This tool downloads files pointed by RSS feeds.
+
+It fetches the content of the RSS feed, then filters it according to custom patterns and to existing folders on disk. Selected elements will be downloaded to the given folder.
+
+This tool must be compiled with its configuration in order to work. See the `sample_config.nit` in `src/`.
+
+# Features and TODO
+
+- [x] Download & parse RSS file
+- [x] Generate regular expressions from local folders
+- [x] Auto download files matching regular expressions
+- [x] Memory to prevent double downloads
+- [ ] Blacklist
+- [ ] Use a cleaner RSS parser
+- [ ] Tolerate more feed formats
diff --git a/contrib/rss_downloader/src/rss_downloader.nit b/contrib/rss_downloader/src/rss_downloader.nit
new file mode 100644 (file)
index 0000000..eacaf79
--- /dev/null
@@ -0,0 +1,297 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# 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.
+
+# Downloads files from RSS feeds
+module rss_downloader
+
+import curl
+
+redef class Sys
+       # Lazy man's verbose option
+       var verbose: Bool = args.has("-v") or args.has("--verbose") is lazy
+end
+
+# Program configuration
+class Config
+
+       # Folders used to infer regex (may be empty)
+       var regex_source_folders: Array[Path]
+
+       # Custom patterns (may be empty)
+       var custom_patterns: Array[Pattern]
+
+       # Download destination
+       var download_destination_folder: Path
+
+       # RSS feeds (needs at least one)
+       var rss_source_urls: Array[Text]
+
+       # Path to the log file
+       var log_path: Path
+
+       # Unique path of files names to prevent double download (may be empty)
+       var unique_pattern: Array[Pattern]
+
+       # Exception where we ignore uniqueness and can be downloaded again (may be empty)
+       var unique_exceptions: Array[Pattern]
+end
+
+# An element from an RSS feed
+class Element
+       # Tile
+       var title: String
+
+       # Link to the file to download
+       var link: String
+
+       redef fun to_s do return "{title} @ {link}"
+
+       # Download this element to `path`
+       fun download_to(path: Text)
+       do
+               var curl = new Curl
+
+               var request = new CurlHTTPRequest(link, curl)
+               var response = request.download_to_file(path.to_s)
+
+               if response isa CurlFileResponseSuccess then
+                       curl.destroy
+               else if response isa CurlResponseFailed then
+                       sys.stderr.write "Failed downloading URL '{link}' with: {response.error_msg} ({response.error_code})\n"
+               else abort
+       end
+
+       # Get an unique identifier for this element, uses `Config::unique_pattern`
+       fun unique_id(config: Config): String
+       do
+               for re in config.unique_pattern do
+                       var match = title.search(re)
+                       if match != null then
+                               return title.substring(0, match.after).to_lower
+                       end
+               end
+
+               return title
+       end
+
+       # Is this element except from uniqueness?
+       fun is_unique_exception(config: Config): Bool
+       do
+               for re in config.unique_exceptions do
+                       if title.has(re) then
+                               return true
+                       end
+               end
+               return false
+       end
+end
+
+# Main program structure
+class Downloader
+       # Configuration
+       var config: Config
+
+       # Local history (read from, them written to file)
+       var history = new HashSet[Text]
+
+       # Execute tool
+       fun run
+       do
+               # Read old log from file
+               if config.log_path.exists then
+                       var stream = config.log_path.open_ro
+                       history.add_all stream.read_all.split("\n")
+                       stream.close
+               end
+
+               # Get the pattern to search for
+               var patterns = self.patterns
+
+               # Get all the elements from the RSS feeds
+               var elements = new HashSet[Element]
+               for rss_url in config.rss_source_urls do
+                       var rss = rss_url.fetch_rss_content
+                       elements.add_all rss.to_rss_elements
+               end
+
+               # Select the elements matching our pattern
+               var matches = new HashSet[Element]
+               for pattern in patterns do for element in elements do
+                       if element.title.has(pattern) then
+                               matches.add element
+                       end
+               end
+
+               if sys.verbose then
+                       print "\n# {matches.length} matching elements:"
+                       print matches.join("\n")
+                       print "\n# Downloading..."
+               end
+
+               for element in matches do
+                       var local_path = config.download_destination_folder.to_s / element.title
+                       var unique_id = element.unique_id(config)
+
+                       if local_path.to_path.exists then
+                               # Do not redownload a file (we assume that the file name is unique by itself)
+                               if sys.verbose then print "File exists, skipping {element}"
+                               continue
+                       else if history.has(unique_id) then
+                               # Do not download a file that is not unique according to `unique_id`
+                               if not element.is_unique_exception(config) then
+                                       # We make some exceptions
+                                       if sys.verbose then print "File in log, skipping {element}"
+                                       continue
+                               end
+                       end
+
+                       # Download element
+                       if sys.verbose then print "Fetching {element} as {local_path}"
+                       element.download_to(local_path)
+
+                       # Add `unique_id` to log
+                       history.add unique_id
+               end
+
+               # Save new log to file
+               var stream = config.log_path.open_wo
+               for line in history do
+                       stream.write line
+                       stream.write "\n"
+               end
+               stream.close
+       end
+
+       # Gather all patterns from `Config::custom_patterns` and `Config::source_folder_path`
+       fun patterns: Array[Pattern]
+       do
+               var patterns = new Array[Pattern]
+
+               # Begin with custom pattern
+               for pattern_source in config.custom_patterns do
+                       patterns.add pattern_source
+               end
+
+               # Get regex source from folder names
+               var folder_names = new HashSet[Text]
+               for source_folder_path in config.regex_source_folders do
+                       var source_folder = source_folder_path
+
+                       if not source_folder.exists then
+                               sys.stderr.write "Regex source folder '{source_folder_path}' does not exists.\n"
+                               continue
+                       end
+
+                       for dir in source_folder.files do if dir.stat.is_dir then
+                               folder_names.add dir.to_s
+                       end
+               end
+
+               # Compile our infered patterns
+               for folder_name in folder_names do
+                       # Transform from "Some folder name" to "^Some.folder.name"
+                       var regex_source = folder_name.
+                               replace(' ', ".").replace('[', "\\[").replace('(', "\\(").
+                               replace('+', "\\+").replace('*', "\\*")
+                       regex_source = "^" + regex_source
+
+                       var regex = regex_source.to_re
+                       regex.ignore_case = true
+
+                       patterns.add regex
+               end
+
+               if patterns.is_empty then
+                       sys.stderr.write "Do not have any pattern to work with.\n"
+                       exit 1
+               end
+
+               if sys.verbose then
+                       print "# Generated {patterns.length} patterns"
+                       print patterns.join("\n")
+               end
+
+               return patterns
+       end
+end
+
+redef class Text
+       # Get the content of the RSS feed at `self`
+       fun fetch_rss_content: Text
+       do
+               var curl = new Curl
+
+               if sys.verbose then print "\n# Downloading RSS file from '{self}'"
+
+               var request = new CurlHTTPRequest(to_s, curl)
+               var response = request.execute
+
+               if response isa CurlResponseSuccess then
+                       var body = response.body_str
+                       curl.destroy
+                       if sys.verbose then print "Download successful"
+                       return body
+               else if response isa CurlResponseFailed then
+                       sys.stderr.write "Failed downloading URL '{self}' with: {response.error_msg} ({response.error_code})\n"
+                       exit 1
+               end
+
+               abort
+       end
+
+       # Get this RSS feed content as an `Array[Element]`
+       fun to_rss_elements: Array[Element]
+       do
+               var title_re = "<title><![^/]*</title>".to_re
+               var link_re = "<link>[^<]*download[^<]*</link>".to_re
+
+               var title_prefix_len = "<title><![CDATA[".length
+               var title_suffix_len = "]]</title>".length+1
+
+               var titles = search_all(title_re)
+               var links = search_all(link_re)
+
+               if sys.verbose then print "\n# Found {titles.length} titles and {links.length} links"
+               assert titles.length == links.length
+
+               var elements = new Array[Element]
+               for i in titles.length.times do
+                       var title = titles[i].to_s.substring(title_prefix_len, titles[i].length - title_prefix_len - title_suffix_len)
+                       var link = links[i].to_s.substring(6, links[i].length - 6 - 7)
+                       elements.add new Element(title, link)
+               end
+
+               if sys.verbose then
+                       print "# Found elements:"
+                       print elements.join("\n")
+               end
+
+               return elements
+       end
+end
+
+# Implement this method in your module to configure this tool
+fun tool_config: nullable Config do return null
+
+var c = tool_config
+if c == null then
+       print "This tool is not configured, take a look at the example `sample_config.nit`"
+       exit 1
+       abort # For the flow only
+end
+
+var tool = new Downloader(c)
+tool.run
diff --git a/contrib/rss_downloader/src/sample_config.nit b/contrib/rss_downloader/src/sample_config.nit
new file mode 100644 (file)
index 0000000..c9f362e
--- /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 rss_downloader
+
+# Current user's home directory
+fun home: String do return "HOME".environ
+
+redef fun tool_config do return new Config(
+       # Source folders
+       ["{home}/Downloads/".to_path],
+
+       # Custom patterns
+       ["S01E01",
+        "1x01",
+        "pilot"], # We use Strings here, but we could also use a `Regex`
+
+       # Destination folder
+       "{home}/Downloads/".to_path,
+
+       # RSS feeds
+       ["http://example.org/feed.rss"],
+
+       # Log file
+       "{home}/rss_downloader.log".to_path,
+
+       # Uniqueness patterns
+       ["S[0-9]+E[0-9]+".to_re, # S01E01
+        "[0-9]+x[0-9]+".to_re,  # 1x01
+        "[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]".to_re], # 1970.01.01
+
+       # Uniqueness exceptions
+       ["repack"])
index 83db947..4c04e8e 100644 (file)
@@ -1,6 +1,6 @@
 build:
        mkdir -p bin/
-       ../../bin/nitc -o bin/sort_downloads src/sort_downloads.nit
+       ../../bin/nitc --dir bin/ src/*.nit
 
 install:
        install bin/sort_downloads /usr/local/bin/
index 3d0a0a1..3c19b0b 100644 (file)
@@ -31,7 +31,7 @@ import template
 class MarkdownProcessor
 
        # `MarkdownEmitter` used for ouput.
-       var emitter: MarkdownEmitter is noinit
+       var emitter: MarkdownEmitter is noinit, protected writable
 
        # Work in extended mode (default).
        #
@@ -2266,6 +2266,7 @@ redef class Text
        # Safe mode can be activated to limit reading to valid xml.
        private fun read_xml(out: FlatBuffer, start: Int, safe_mode: Bool): Int do
                var pos = 0
+               var is_valid = true
                var is_close_tag = false
                if start + 1 >= length then return -1
                if self[start + 1] == '/' then
@@ -2283,7 +2284,11 @@ redef class Text
                        pos = read_xml_until(tmp, pos, ' ', '/', '>')
                        if pos == -1 then return -1
                        var tag = tmp.write_to_string.trim.to_lower
-                       if tag.is_html_unsafe then
+                       if not tag.is_valid_html_tag then
+                               out.append "&lt;"
+                               pos = -1
+                       else if tag.is_html_unsafe then
+                               is_valid = false
                                out.append "&lt;"
                                if is_close_tag then out.add '/'
                                out.append tmp
@@ -2306,7 +2311,11 @@ redef class Text
                        if pos == -1 then return -1
                end
                if self[pos] == '>' then
-                       out.add '>'
+                       if is_valid then
+                               out.add '>'
+                       else
+                               out.append "&gt;"
+                       end
                        return pos
                end
                return -1
@@ -2378,6 +2387,14 @@ redef class Text
                return tpl.write_to_string.to_lower
        end
 
+       private fun is_valid_html_tag: Bool do
+               if is_empty then return false
+               for c in self do
+                       if not c.is_alpha then return false
+               end
+               return true
+       end
+
        # Read and escape the markdown contained in `self`.
        private fun escape(out: FlatBuffer, c: Char, pos: Int): Int do
                if c == '\\' or c == '[' or c == ']' or c == '(' or c == ')' or c == '{' or
@@ -2395,7 +2412,6 @@ redef class Text
        private fun meta_from_fence: nullable Text do
                for i in [0..chars.length[ do
                        var c = chars[i]
-                       print c
                        if c != ' ' and c != '`' and c != '~' then
                                return substring_from(i).trim
                        end
index 8894d47..e552883 100644 (file)
@@ -1013,6 +1013,12 @@ break</a> with a line-ending space.</p>
                assert exp == res
        end
 
+       fun test_escape_bad_html do
+                       var test = "-1 if < , +1 if > and 0 otherwise"
+                       var exp = "<p>-1 if &lt; , +1 if > and 0 otherwise</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert exp == res
+       end
 
        fun test_daring_encoding do
                var test = """
index 5a226b9..8c8f9ea 100644 (file)
@@ -143,7 +143,7 @@ abstract class OptionParameter
        redef fun read_param(it)
        do
                super
-               if it.is_ok and it.item.chars.first != '-' then
+               if it.is_ok and (it.item.is_empty or it.item.chars.first != '-') then
                        value = convert(it.item)
                        it.next
                else
index 3b7f908..d5621a9 100644 (file)
@@ -39,8 +39,8 @@ import kernel
 # var x: Collection[U]
 # # ...
 # for u in x do
-#     # u is a U
-#     # ...
+#      # u is a U
+#      # ...
 # end
 # ~~~
 #
@@ -50,7 +50,7 @@ import kernel
 # var x: Collection[U]
 # # ...
 # var i = x.iterator
-#     while i.is_ok do
+# while i.is_ok do
 #     var u = i.item # u is a U
 #     # ...
 #     i.next
@@ -110,7 +110,7 @@ interface Collection[E]
        # How many occurrences of `item` are in the collection?
        # Comparisons are done with ==
        #
-       #    assert [10,20,10].count(10)         == 2
+       #     assert [10,20,10].count(10)         == 2
        fun count(item: E): Int
        do
                var nb = 0
@@ -120,7 +120,7 @@ interface Collection[E]
 
        # Return the first item of the collection
        #
-       #    assert [1,2,3].first                == 1
+       #     assert [1,2,3].first                == 1
        fun first: E
        do
                assert length > 0
@@ -129,13 +129,13 @@ interface Collection[E]
 
        # Does the collection contain at least each element of `other`?
        #
-       #    assert [1,3,4,2].has_all([1..2])    == true
-       #    assert [1,3,4,2].has_all([1..5])    == false
+       #     assert [1,3,4,2].has_all([1..2])    == true
+       #     assert [1,3,4,2].has_all([1..5])    == false
        #
        # Repeated elements in the collections are not considered.
        #
-       #    assert [1,1,1].has_all([1])         == true
-       #    assert [1..5].has_all([1,1,1])      == true
+       #     assert [1,1,1].has_all([1])         == true
+       #     assert [1..5].has_all([1,1,1])      == true
        #
        # Note that the default implementation is general and correct for any lawful Collections.
        # It is memory-efficient but relies on `has` so may be CPU-inefficient for some kind of collections.
@@ -150,16 +150,16 @@ interface Collection[E]
        # The same elements must be present in both `self` and `other`,
        # but the order of the elements in the collections are not considered.
        #
-       #    assert [1..3].has_exactly([3,1,2]) == true  # the same elements
-       #    assert [1..3].has_exactly([3,1])   == false # 2 is not in the array
-       #    assert [1..2].has_exactly([3,1,2]) == false # 3 is not in the range
+       #     assert [1..3].has_exactly([3,1,2]) == true  # the same elements
+       #     assert [1..3].has_exactly([3,1])   == false # 2 is not in the array
+       #     assert [1..2].has_exactly([3,1,2]) == false # 3 is not in the range
        #
        # Repeated elements must be present in both collections in the same amount.
        # So basically it is a multi-set comparison.
        #
-       #    assert [1,2,3,2].has_exactly([1,2,2,3]) == true  # the same elements
-       #    assert [1,2,3,2].has_exactly([1,2,3])   == false # more 2 in the first array
-       #    assert [1,2,3].has_exactly([1,2,2,3])   == false # more 2 in the second array
+       #     assert [1,2,3,2].has_exactly([1,2,2,3]) == true  # the same elements
+       #     assert [1,2,3,2].has_exactly([1,2,3])   == false # more 2 in the first array
+       #     assert [1,2,3].has_exactly([1,2,2,3])   == false # more 2 in the second array
        #
        # Note that the default implementation is general and correct for any lawful Collections.
        # It is memory-efficient but relies on `count` so may be CPU-inefficient for some kind of collections.
index add6077..4b73471 100644 (file)
@@ -242,6 +242,7 @@ end
 # Resizable one dimension array of objects.
 #
 # Arrays have a literal representation.
+#
 #     var a = [12, 32, 8]
 #     # is equivalent with:
 #     var b = new Array[Int]
@@ -398,11 +399,11 @@ class Array[E]
        #
        # returns a new array built by concatenating `self` `repeat` times.
        #
-       #    var a = [1,2,3]
-       #    assert (a * 0).is_empty
-       #    assert a * 1  ==  [1,2,3]
-       #    assert a * 2  ==  [1,2,3,1,2,3]
-       #    assert (a * 10).length  ==  30
+       #     var a = [1,2,3]
+       #     assert (a * 0).is_empty
+       #     assert a * 1  ==  [1,2,3]
+       #     assert a * 2  ==  [1,2,3,1,2,3]
+       #     assert (a * 10).length  ==  30
        fun *(repeat: Int): Array[E]
        do
                assert repeat >= 0
index ae1b675..66ef4af 100644 (file)
@@ -139,7 +139,7 @@ class List[E]
        end
 
        # Append `l` to `self` but clear `l`.
-       ##
+       #
        # O(1)
        fun link(l: List[E])
        do
index 61b5194..da68294 100644 (file)
@@ -139,12 +139,12 @@ end
 redef class Int
        # Returns the range from 0 to `self-1`, is used to do:
        #
-       #    var s = new Array[String]
-       #    for i in 3.times do s.add "cool"
-       #    assert s.join(" ") == "cool cool cool"
+       #     var s = new Array[String]
+       #     for i in 3.times do s.add "cool"
+       #     assert s.join(" ") == "cool cool cool"
        #
-       #    s.clear
-       #    for i in 10.times do s.add(i.to_s)
-       #    assert s.to_s == "0123456789"
+       #     s.clear
+       #     for i in 10.times do s.add(i.to_s)
+       #     assert s.to_s == "0123456789"
        fun times: Range[Int] do return [0 .. self[
 end
index cbb5d56..52bfbd7 100644 (file)
@@ -89,10 +89,11 @@ class IFStream
 
        redef fun close
        do
-               if _file.address_is_null then return
+               if _file == null or _file.address_is_null then return
                var i = _file.io_close
                _buffer.clear
                end_reached = true
+               _file = null
        end
 
        redef fun fill_buffer
@@ -154,6 +155,7 @@ class OFStream
 
        redef fun close
        do
+               if _file == null then return
                if _file.address_is_null then
                        if last_error != null then return
                        last_error = new IOError("Cannot close unopened write stream")
@@ -165,6 +167,7 @@ class OFStream
                        last_error = new IOError("Close failed due to error {sys.errno.strerror}")
                end
                _is_writable = false
+               _file = null
        end
        redef var is_writable = false
 
@@ -366,6 +369,65 @@ class Path
                return new OFStream.open(path)
        end
 
+       # Read all the content of the file
+       #
+       # ~~~
+       # var content = "/etc/issue".to_path.read_all
+       # print content
+       # ~~~
+       #
+       # See `IStream::read_all` for details.
+       fun read_all: String
+       do
+               var s = open_ro
+               var res = s.read_all
+               s.close
+               return res
+       end
+
+       # Read all the lines of the file
+       #
+       # ~~~
+       # var lines = "/etc/passwd".to_path.read_lines
+       #
+       # print "{lines.length} users"
+       #
+       # for l in lines do
+       #     var fields = l.split(":")
+       #     print "name={fields[0]} uid={fields[2]}"
+       # end
+       # ~~~
+       #
+       # See `IStream::read_lines` for details.
+       fun read_lines: Array[String]
+       do
+               var s = open_ro
+               var res = s.read_lines
+               s.close
+               return res
+       end
+
+       # Return an iterator on each line of the file
+       #
+       # ~~~
+       # for l in "/etc/passwd".to_path.each_line do
+       #     var fields = l.split(":")
+       #     print "name={fields[0]} uid={fields[2]}"
+       # end
+       # ~~~
+       #
+       # Note: the stream is automatically closed at the end of the file (see `LineIterator::close_on_finish`)
+       #
+       # See `IStream::each_line` for details.
+       fun each_line: LineIterator
+       do
+               var s = open_ro
+               var res = s.each_line
+               res.close_on_finish = true
+               return res
+       end
+
+
        # Lists the name of the files contained within the directory at `path`
        #
        # Require: `exists and is_dir`
@@ -618,15 +680,18 @@ redef class String
        # trainling "/" is removed
        #
        # Note that the method only wonrk on the string:
+       #
        #  * no I/O access is performed
        #  * the validity of the path is not checked
        #
-       #     assert "some/./complex/../../path/from/../to/a////file//".simplify_path        ==  "path/to/a/file"
-       #     assert "../dir/file".simplify_path       ==  "../dir/file"
-       #     assert "dir/../../".simplify_path        ==  ".."
-       #     assert "dir/..".simplify_path            ==  "."
-       #     assert "//absolute//path/".simplify_path ==  "/absolute/path"
-       #     assert "//absolute//../".simplify_path   ==  "/"
+       # ~~~
+       # assert "some/./complex/../../path/from/../to/a////file//".simplify_path            ==  "path/to/a/file"
+       # assert "../dir/file".simplify_path       ==  "../dir/file"
+       # assert "dir/../../".simplify_path        ==  ".."
+       # assert "dir/..".simplify_path            ==  "."
+       # assert "//absolute//path/".simplify_path ==  "/absolute/path"
+       # assert "//absolute//../".simplify_path   ==  "/"
+       # ~~~
        fun simplify_path: String
        do
                var a = self.split_with("/")
index fd7cd9d..5cc0547 100644 (file)
@@ -66,13 +66,13 @@ interface Object
        fun is_same_instance(other: nullable Object): Bool is intern
 
        # Have `self` and `other` the same value?
-       ##
+       #
        # The exact meaning of "same value" is let to the subclasses.
        # Implicitly, the default implementation, is `is_same_instance`
        fun ==(other: nullable Object): Bool do return self.is_same_instance(other)
 
        # Have `self` and `other` different values?
-       ##
+       #
        # != is equivalent with "not ==".
        fun !=(other: nullable Object): Bool do return not (self == other)
 
@@ -93,7 +93,7 @@ interface Object
 
        # The hash code of the object.
        # Assuming that a == b -> a.hash == b.hash
-       ##
+       #
        # Without redefinition, it is based on the `object_id` of the instance.
        fun hash: Int do return object_id / 8
 end
@@ -283,8 +283,10 @@ end
 
 # Native Booleans.
 # `true` and `false` are the only instances.
+#
 # Boolean are manipulated trough three special operators:
-#       `and`, `or`, `not`.
+# `and`, `or`, `not`.
+#
 # Booleans are mainly used by conditional statement and loops.
 universal Bool
        redef fun object_id is intern
@@ -489,8 +491,8 @@ universal Int
 
        # The character whose ASCII value is `self`.
        #
-       #      assert 65.ascii   == 'A'
-       #      assert 10.ascii   == '\n'
+       #     assert 65.ascii   == 'A'
+       #     assert 10.ascii   == '\n'
        fun ascii: Char is intern
 
        # Number of digits of an integer in base `b` (plus one if negative)
index 1d1437b..4b6ed35 100644 (file)
@@ -26,27 +26,27 @@ redef class Int
 
        # Returns the result of a binary AND operation on `self` and `i`
        #
-       #    assert 0x10.bin_and(0x01) == 0
+       #     assert 0x10.bin_and(0x01) == 0
        fun bin_and(i: Int): Int is extern "kernel_Int_Int_binand_0"
 
        # Returns the result of a binary OR operation on `self` and `i`
        #
-       #    assert 0x10.bin_or(0x01) == 0x11
+       #     assert 0x10.bin_or(0x01) == 0x11
        fun bin_or(i: Int): Int is extern "kernel_Int_Int_binor_0"
 
        # Returns the result of a binary XOR operation on `self` and `i`
        #
-       #    assert 0x101.bin_xor(0x110) == 0x11
+       #     assert 0x101.bin_xor(0x110) == 0x11
        fun bin_xor(i: Int): Int is extern "kernel_Int_Int_binxor_0"
 
        # Returns the 1's complement of `self`
        #
-       #    assert 0x2F.bin_not == -48
+       #     assert 0x2F.bin_not == -48
        fun bin_not: Int is extern "kernel_Int_Int_binnot_0"
 
        # Returns the square root of `self`
        #
-       #    assert 16.sqrt == 4
+       #     assert 16.sqrt == 4
        fun sqrt: Int `{ return sqrt(recv); `}
 
        # Returns the greatest common divisor of `self` and `o`
@@ -76,17 +76,17 @@ redef class Int
 
        # Is `self` even ?
        #
-       #    assert 12.is_even
+       #     assert 12.is_even
        fun is_even: Bool do return self % 2 == 0
 
        # Is `self` odd ?
        #
-       #    assert not 13.is_even
+       #     assert not 13.is_even
        fun is_odd: Bool do return not is_even
 
        # Returns the `self` raised to the power of `e`.
        #
-       #    assert 2 ** 3 == 8
+       #     assert 2 ** 3 == 8
        fun **(e: Int): Int
        do
                return self.to_f.pow(e.to_f).to_i
@@ -96,10 +96,10 @@ redef class Int
        #
        # Returns `1 * 2 * 3 * ... * self-1 * self`
        #
-       #    assert 0.factorial == 1  # by convention for an empty product
-       #    assert 1.factorial == 1
-       #    assert 4.factorial == 24
-       #    assert 9.factorial == 362880
+       #     assert 0.factorial == 1  # by convention for an empty product
+       #     assert 1.factorial == 1
+       #     assert 4.factorial == 24
+       #     assert 9.factorial == 362880
        fun factorial: Int
        do
                assert self >= 0
@@ -173,7 +173,7 @@ redef class Float
        #     #assert 1.0.log == 0.0
        fun log: Float is extern "kernel_Float_Float_log_0"
 
-       # Returns **e** raised to `self`.
+       # Returns *e* raised to `self`.
        fun exp: Float is extern "kernel_Float_Float_exp_0"
 
        #     assert 1.1.ceil == 2.0
index ff2ee0d..5b4353e 100644 (file)
@@ -74,10 +74,13 @@ interface Queue[E]
        # `first` is made an alias of `peek` to avoid bad surprises
        redef fun first do return peek
 
-       # Take and return all elements until the queue is empty
-       # ensure `is_empty`
-       # ensure `result.length == old(length)`
-       # ensure `not old(is_empty) implies result.first == old(peek)`
+       # Take and return all elements until the queue is empty.
+       #
+       # Ensure:
+       # * `is_empty`
+       # * `result.length == old(length)`
+       # * `not old(is_empty) implies result.first == old(peek)`
+       #
        # ~~~
        # var a = (new Array[Int]).as_lifo
        # a.add 1
index d7bc8e8..8186ec9 100644 (file)
 #
 # Ropes are a data structure introduced in a 1995 paper from
 # Hans J. Boehm, Russ Atkinson and Michael Plass.
-# See : `Ropes : an Alternative to Strings`, `Software - Practice and Experience,
-# Vol. 25(12), 1315-1330 (December 1995)`.
+#
+# See:
+#
+# > Ropes: an Alternative to Strings,
+# > *Software - Practice and Experience*,
+# > Vol. 25(12), 1315-1330 (December 1995).
 #
 # The implementation developed here provides an automatic change
 # of data structure depending on the length of the leaves.
 #
 # Example :
 #
-# `            Concat                   `
-# `          /        \                 `
-# `    Concat          Concat           `
-# `   /      \        /      \          `
-# `"My"     " Name"  " is"   " Simon."  `
+#                  Concat
+#                /        \
+#          Concat          Concat
+#         /      \        /      \
+#      "My"     " Name"  " is"   " Simon."
 #
 # Note that the above example is not representative of the actual implementation
 # of `Ropes`, since short leaves are merged to keep the rope at an acceptable
index 0b7bd0a..46ad73c 100644 (file)
@@ -119,6 +119,36 @@ abstract class IStream
                return res
        end
 
+       # Return an iterator that read each line.
+       #
+       # The line terminator '\n' and `\r\n` is removed in each line,
+       # The line are read with `read_line`. See this method for details.
+       #
+       # ~~~
+       # var txt = "Hello\n\nWorld\n"
+       # var i = new StringIStream(txt)
+       # assert i.each_line.to_a == ["Hello", "", "World"]
+       # ~~~
+       #
+       # Unlike `read_lines` that read all lines at the call, `each_line` is lazy.
+       # Therefore, the stream should no be closed until the end of the stream.
+       #
+       # ~~~
+       # i = new StringIStream(txt)
+       # var el = i.each_line
+       #
+       # assert el.item == "Hello"
+       # el.next
+       # assert el.item == ""
+       # el.next
+       #
+       # i.close
+       #
+       # assert not el.is_ok
+       # # closed before "world" is read
+       # ~~~
+       fun each_line: LineIterator do return new LineIterator(self)
+
        # Read all the stream until the eof.
        #
        # The content of the file is returned verbatim.
@@ -192,6 +222,53 @@ abstract class IStream
        fun eof: Bool is abstract
 end
 
+# Iterator returned by `IStream::each_line`.
+# See the aforementioned method for details.
+class LineIterator
+       super Iterator[String]
+
+       # The original stream
+       var stream: IStream
+
+       redef fun is_ok
+       do
+               var res = not stream.eof
+               if not res and close_on_finish then stream.close
+               return res
+       end
+
+       redef fun item
+       do
+               var line = self.line
+               if line == null then
+                       line = stream.read_line
+               end
+               self.line = line
+               return line
+       end
+
+       # The last line read (cache)
+       private var line: nullable String = null
+
+       redef fun next
+       do
+               # force the read
+               if line == null then item
+               # drop the line
+               line = null
+       end
+
+       # Close the stream when the stream is at the EOF.
+       #
+       # Default is false.
+       var close_on_finish = false is writable
+
+       redef fun finish
+       do
+               if close_on_finish then stream.close
+       end
+end
+
 # IStream capable of declaring if readable without blocking
 abstract class PollableIStream
        super IStream
index bda2b25..e443433 100644 (file)
@@ -426,6 +426,8 @@ abstract class Text
        # * 1.0 for right-justified (all spaces at the left)
        # * 0.5 for centered (half the spaces at the left)
        #
+       # Examples
+       #
        #     assert "hello".justify(10, 0.0)  == "hello     "
        #     assert "hello".justify(10, 1.0)  == "     hello"
        #     assert "hello".justify(10, 0.5)  == "  hello   "
@@ -434,9 +436,9 @@ abstract class Text
        #
        #     assert "hello".justify(2, 0.0)   == "hello"
        #
-       # REQUIRE: left >= 0.0 and left <= 1.0
+       # REQUIRE: `left >= 0.0 and left <= 1.0`
        # ENSURE: `self.length <= length implies result.length == length`
-       # ENSURE: `self.length >= length implies result == self
+       # ENSURE: `self.length >= length implies result == self`
        fun justify(length: Int, left: Float): SELFTYPE
        do
                var diff = length - self.length
@@ -968,9 +970,9 @@ abstract class String
        #
        # SEE : `Char::is_letter` for the definition of letter.
        #
-       #    assert "jAVASCRIPT".capitalized == "Javascript"
-       #    assert "i am root".capitalized == "I Am Root"
-       #    assert "ab_c -ab0c ab\nc".capitalized == "Ab_C -Ab0C Ab\nC"
+       #     assert "jAVASCRIPT".capitalized == "Javascript"
+       #     assert "i am root".capitalized == "I Am Root"
+       #     assert "ab_c -ab0c ab\nc".capitalized == "Ab_C -Ab0C Ab\nC"
        fun capitalized: SELFTYPE do
                if length == 0 then return self
 
@@ -1445,15 +1447,15 @@ abstract class Buffer
        #
        # SEE: `Char::is_letter` for the definition of a letter.
        #
-       #    var b = new FlatBuffer.from("jAVAsCriPt")
-       #    b.capitalize
-       #    assert b == "Javascript"
-       #    b = new FlatBuffer.from("i am root")
-       #    b.capitalize
-       #    assert b == "I Am Root"
-       #    b = new FlatBuffer.from("ab_c -ab0c ab\nc")
-       #    b.capitalize
-       #    assert b == "Ab_C -Ab0C Ab\nC"
+       #     var b = new FlatBuffer.from("jAVAsCriPt")
+       #     b.capitalize
+       #     assert b == "Javascript"
+       #     b = new FlatBuffer.from("i am root")
+       #     b.capitalize
+       #     assert b == "I Am Root"
+       #     b = new FlatBuffer.from("ab_c -ab0c ab\nc")
+       #     b.capitalize
+       #     assert b == "Ab_C -Ab0C Ab\nC"
        fun capitalize do
                if length == 0 then return
                var c = self[0].to_upper
@@ -1810,7 +1812,7 @@ redef class Object
 
        # The class name of the object.
        #
-       #    assert 5.class_name == "Int"
+       #     assert 5.class_name == "Int"
        fun class_name: String do return native_class_name.to_s
 
        # Developer readable representation of `self`.
@@ -2005,10 +2007,10 @@ redef class Char
 
        # Returns true if the char is a numerical digit
        #
-       #      assert '0'.is_numeric
-       #      assert '9'.is_numeric
-       #      assert not 'a'.is_numeric
-       #      assert not '?'.is_numeric
+       #     assert '0'.is_numeric
+       #     assert '9'.is_numeric
+       #     assert not 'a'.is_numeric
+       #     assert not '?'.is_numeric
        fun is_numeric: Bool
        do
                return self >= '0' and self <= '9'
@@ -2016,10 +2018,10 @@ redef class Char
 
        # Returns true if the char is an alpha digit
        #
-       #      assert 'a'.is_alpha
-       #      assert 'Z'.is_alpha
-       #      assert not '0'.is_alpha
-       #      assert not '?'.is_alpha
+       #     assert 'a'.is_alpha
+       #     assert 'Z'.is_alpha
+       #     assert not '0'.is_alpha
+       #     assert not '?'.is_alpha
        fun is_alpha: Bool
        do
                return (self >= 'a' and self <= 'z') or (self >= 'A' and self <= 'Z')
@@ -2027,11 +2029,11 @@ redef class Char
 
        # Returns true if the char is an alpha or a numeric digit
        #
-       #      assert 'a'.is_alphanumeric
-       #      assert 'Z'.is_alphanumeric
-       #      assert '0'.is_alphanumeric
-       #      assert '9'.is_alphanumeric
-       #      assert not '?'.is_alphanumeric
+       #     assert 'a'.is_alphanumeric
+       #     assert 'Z'.is_alphanumeric
+       #     assert '0'.is_alphanumeric
+       #     assert '9'.is_alphanumeric
+       #     assert not '?'.is_alphanumeric
        fun is_alphanumeric: Bool
        do
                return self.is_numeric or self.is_alpha
index c82f883..bb68a60 100755 (executable)
@@ -34,11 +34,12 @@ if ! git checkout $hash; then
        exit 1
 fi
 
-# Make nitg (quickly)
+# Make basic bootstrap
 $tools_dir/unitrun.sh "run-make-csrc" make -C c_src
 $tools_dir/unitrun.sh "run-make-version" src/git-gen-version.sh
-$tools_dir/unitrun.sh "run-make-nitg_0" c_src/nitg -o bin/nitg_0 src/nitg.nit
-$tools_dir/unitrun.sh "run-make-nitg" bin/nitg_0 -o bin/nitg src/nitg.nit
+$tools_dir/unitrun.sh "run-make-nitg_0" c_src/nitg -o bin/nitc_0 src/nitc.nit
+$tools_dir/unitrun.sh "run-make-nitg" bin/nitc_0 --dir bin/ src/nitc.nit
+$tools_dir/unitrun.sh "run-make-nit-and-nitvm" bin/nitc --dir bin/ src/nit.nit src/nitvm.nit
 
 # Make nitester
 $tools_dir/unitrun.sh "run-make-nitester" make -C contrib/nitester/
index 517527f..4529bcb 100644 (file)
@@ -24,6 +24,18 @@ Here, only the specific one are indicated.
     If `-f` is given, only the inside of the body part is generated such that it could be integrated
     into a HTML document.
 
+`--line-id-prefix`
+:   Prefix of the id of each line `<span>` element.
+
+    By default, each line is enclosed in its own `<span>` element with an `id` attribute made of the line number prefixed by `L` (e.g. `L1` for the first line).
+
+    This option changes the prefix used.
+    If an empty string is used, then the `<span>` are generated without `id` attributes.
+
+    This option is especially usuful with `--fragment` when more than one highlighted code is
+    included in the same HTML document.
+    Each fragment can thus be generated with its own distinct prefix, or the id can be disabled alltogether.
+
 `--first-line`
 :   Start the source file at this line (default: 1).
 
index a6084f7..41a10b4 100644 (file)
@@ -24,6 +24,10 @@ code {
        border: 1px solid #ddd;
 }
 
+pre code {
+       border: none;
+}
+
 .navbar-default .navbar-toggle {
        margin-top: 2px;
        padding: 5px 10px;
index ca3269e..d1441d2 100644 (file)
@@ -1279,11 +1279,11 @@ abstract class AbstractCompilerVisitor
        fun escapemark_name(e: nullable EscapeMark): String
        do
                assert e != null
-               if escapemark_names.has_key(e) then return escapemark_names[e]
+               if frame.escapemark_names.has_key(e) then return frame.escapemark_names[e]
                var name = e.name
                if name == null then name = "label"
                name = get_name(name)
-               escapemark_names[e] = name
+               frame.escapemark_names[e] = name
                return name
        end
 
@@ -1295,8 +1295,6 @@ abstract class AbstractCompilerVisitor
                add("BREAK_{escapemark_name(e)}: (void)0;")
        end
 
-       private var escapemark_names = new HashMap[EscapeMark, String]
-
        # Return a "const char*" variable associated to the classname of the dynamic type of an object
        # NOTE: we do not return a `RuntimeVariable` "NativeString" as the class may not exist in the module/program
        fun class_name_string(value: RuntimeVariable): String is abstract
@@ -1681,6 +1679,10 @@ class Frame
 
        # The label at the end of the property
        var returnlabel: nullable String = null is writable
+
+       # Labels associated to a each escapemarks.
+       # Because of inlinings, escape-marks must be associated to their context (the frame)
+       private var escapemark_names = new HashMap[EscapeMark, String]
 end
 
 redef class MType
@@ -1692,21 +1694,9 @@ redef class MType
 
        # Short name of the `ctype` to use in unions
        fun ctypename: String do return "val"
-
-       # Return the name of the C structure associated to a Nit live type
-       fun c_name: String is abstract
-       protected var c_name_cache: nullable String is protected writable
 end
 
 redef class MClassType
-       redef fun c_name
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{mclass.intro_mmodule.c_name}__{mclass.name.to_cmangle}"
-               self.c_name_cache = res
-               return res
-       end
 
        redef fun ctype: String
        do
@@ -1757,90 +1747,8 @@ redef class MClassType
        end
 end
 
-redef class MGenericType
-       redef fun c_name
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = super
-               for t in self.arguments do
-                       res = res + t.c_name
-               end
-               self.c_name_cache = res
-               return res
-       end
-end
-
-redef class MParameterType
-       redef fun c_name
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{self.mclass.c_name}_FT{self.rank}"
-               self.c_name_cache = res
-               return res
-       end
-end
-
-redef class MVirtualType
-       redef fun c_name
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{self.mproperty.intro.mclassdef.mclass.c_name}_VT{self.mproperty.name}"
-               self.c_name_cache = res
-               return res
-       end
-end
-
-redef class MNullableType
-       redef fun c_name
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "nullable_{self.mtype.c_name}"
-               self.c_name_cache = res
-               return res
-       end
-end
-
-redef class MClass
-       # Return the name of the C structure associated to a Nit class
-       fun c_name: String do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{intro_mmodule.c_name}__{name.to_cmangle}"
-               self.c_name_cache = res
-               return res
-       end
-       private var c_name_cache: nullable String
-end
-
-redef class MProperty
-       fun c_name: String do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{self.intro.c_name}"
-               self.c_name_cache = res
-               return res
-       end
-       private var c_name_cache: nullable String
-end
-
 redef class MPropDef
        type VISITOR: AbstractCompilerVisitor
-
-       private var c_name_cache: nullable String
-
-       # The mangled name associated to the property
-       fun c_name: String
-       do
-               var res = self.c_name_cache
-               if res != null then return res
-               res = "{self.mclassdef.mmodule.c_name}__{self.mclassdef.mclass.name.to_cmangle}__{self.mproperty.name.to_cmangle}"
-               self.c_name_cache = res
-               return res
-       end
 end
 
 redef class MMethodDef
@@ -2291,6 +2199,8 @@ redef class AMethPropdef
 end
 
 redef class AAttrPropdef
+       redef fun can_inline: Bool do return not is_lazy
+
        redef fun compile_to_c(v, mpropdef, arguments)
        do
                if mpropdef == mreadpropdef then
@@ -2349,7 +2259,7 @@ redef class AAttrPropdef
                var oldnode = v.current_node
                v.current_node = self
                var old_frame = v.frame
-               var frame = new Frame(v, self.mpropdef.as(not null), recv.mcasttype.as(MClassType), [recv])
+               var frame = new Frame(v, self.mpropdef.as(not null), recv.mcasttype.as_notnullable.as(MClassType), [recv])
                v.frame = frame
 
                var value
@@ -3020,19 +2930,6 @@ redef class Array[E]
 end
 
 redef class MModule
-       # Return the name of the global C identifier associated to `self`.
-       # This name is used to prefix files and other C identifiers associated with `self`.
-       var c_name: String is lazy do
-               var g = mgroup
-               var res
-               if g != null and g.mproject.name != name then
-                       res = g.mproject.name.to_cmangle + "__" + name.to_cmangle
-               else
-                       res = name.to_cmangle
-               end
-               return res
-       end
-
        # All `MProperty` associated to all `MClassDef` of `mclass`
        fun properties(mclass: MClass): Set[MProperty] do
                if not self.properties_cache.has_key(mclass) then
diff --git a/src/doc/doc_down.nit b/src/doc/doc_down.nit
new file mode 100644 (file)
index 0000000..1c77939
--- /dev/null
@@ -0,0 +1,184 @@
+# 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.
+
+# Handle markdown formatting in Nit comments.
+module doc_down
+
+import markdown
+import highlight
+private import parser_util
+
+redef class MDoc
+       # Comment synopsys HTML escaped
+       var short_comment: String is lazy do return content.first.html_escape
+
+       # Full comment HTML escaped
+       var full_comment: String is lazy do return content.join("\n").html_escape
+
+       # Synopsys in a template
+       var tpl_short_comment: Streamable is lazy do
+               var res = new Template
+               var syn = nitdoc_inline_processor.process(content.first)
+               res.add "<span class=\"synopsys nitdoc\">{syn}</span>"
+               return res
+
+       end
+
+       # Full comment in a template
+       var tpl_comment: Streamable is lazy do
+               var res = new Template
+               var lines = content.to_a
+               res.add "<div class=\"nitdoc\">"
+               # do not use DocUnit as synopsys
+               if not content.first.has_prefix("    ") and
+                  not content.first.has_prefix("\t") then
+                       # parse synopsys
+                       var syn = nitdoc_inline_processor.process(lines.shift)
+                       res.add "<p class=\"synopsys\">{syn}</p>"
+               end
+               # check for annotations
+               for i in [0 .. lines.length[ do
+                       var line = lines[i]
+                       if line.to_upper.has_prefix("ENSURE") or line.to_upper.has_prefix("REQUIRE") then
+                               var html = nitdoc_inline_processor.process(line)
+                               lines[i] = "<p class=\"contract\">{html}</p>"
+                       else if line.to_upper.has_prefix("TODO") or line.to_upper.has_prefix("FIXME") then
+                               var html = nitdoc_inline_processor.process(line)
+                               lines[i] = "<p class=\"todo\">{html}</p>"
+                       end
+               end
+               # add other lines
+               res.add nitdoc_md_processor.process(lines.join("\n"))
+               res.add "</div>"
+               return res
+       end
+end
+
+private class NitdocDecorator
+       super HTMLDecorator
+
+       var toolcontext = new ToolContext
+
+       redef fun add_code(v, block) do
+               var meta = "nit"
+               if block isa BlockFence and block.meta != null then
+                       meta = block.meta.to_s
+               end
+               # Do not try to highlight non-nit code.
+               if meta != "nit" and meta != "nitish" then
+                       v.add "<pre class=\"{meta}\"><code>"
+                       v.emit_in block
+                       v.add "</code></pre>\n"
+                       return
+               end
+               # Try to parse code
+               var code = code_from_block(block)
+               var ast = toolcontext.parse_something(code)
+               if ast isa AError then
+                       v.add "<pre class=\"{meta}\"><code>"
+                       v.emit_in block
+                       v.add "</code></pre>\n"
+                       return
+               end
+               v.add "<pre class=\"nitcode\"><code>"
+               var hl = new HighlightVisitor
+               hl.line_id_prefix = ""
+               hl.enter_visit(ast)
+               v.add(hl.html)
+               v.add "</code></pre>\n"
+       end
+
+       redef fun add_span_code(v, text, from, to) do
+               # Try to parse it
+               var code = code_from_text(text, from, to)
+               var ast = toolcontext.parse_something(code)
+
+               if ast isa AError then
+                       v.add "<code class=\"rawcode\">"
+                       append_code(v, text, from, to)
+               else
+                       v.add "<code class=\"nitcode\">"
+                       var hl = new HighlightVisitor
+                       hl.line_id_prefix = ""
+                       hl.enter_visit(ast)
+                       v.add(hl.html)
+               end
+               v.add "</code>"
+       end
+
+       fun code_from_text(buffer: Text, from, to: Int): String do
+               var out = new FlatBuffer
+               for i in [from..to[ do out.add buffer[i]
+               return out.write_to_string
+       end
+
+       fun code_from_block(block: BlockCode): String do
+               var infence = block isa BlockFence
+               var text = new FlatBuffer
+               var line = block.block.first_line
+               while line != null do
+                       if not line.is_empty then
+                               var str = line.value
+                               if not infence and str.has_prefix("    ") then
+                                       text.append str.substring(4, str.length - line.trailing)
+                               else
+                                       text.append str
+                               end
+                       end
+                       text.append "\n"
+                       line = line.next
+               end
+               return text.write_to_string
+       end
+end
+
+private class InlineDecorator
+       super NitdocDecorator
+
+       redef fun add_paragraph(v, block) do
+               v.emit_in block
+       end
+
+       redef fun add_code(v, block) do
+               # Try to parse code
+               var ast = toolcontext.parse_something(block.block.text.to_s)
+               if ast isa AError then
+                       v.add "<code>"
+                       v.emit_in block
+                       v.add "</code>"
+                       return
+               end
+               v.add "<code class=\"nitcode\">"
+               var hl = new HighlightVisitor
+               hl.enter_visit(ast)
+               v.add(hl.html)
+               v.add "</code>"
+       end
+end
+
+# Get a markdown processor for Nitdoc comments.
+private fun nitdoc_md_processor: MarkdownProcessor do
+       var proc = new MarkdownProcessor
+       proc.emitter.decorator = new NitdocDecorator
+       return once proc
+end
+
+# Get a markdown inline processor for Nitdoc comments.
+#
+# This processor is specificaly designed to inlinable doc elements like synopsys.
+private fun nitdoc_inline_processor: MarkdownProcessor do
+       var proc = new MarkdownProcessor
+       proc.emitter.decorator = new InlineDecorator
+       return once proc
+end
index aea6972..65e53ce 100644 (file)
 module doc_model
 
 import model_utils
-import docdown
+import doc_down
 import doc_templates
 import ordered_tree
 import model_ext
 
-
-################################################################################
-# Additions to Nit entities.
-
-redef class MDoc
-       # Comment synopsys HTML escaped
-       fun short_comment: String do return content.first.html_escape
-
-       # Full comment HTML escaped
-       fun full_comment: String do return content.join("\n").html_escape
-
-       # Synopsys in a template
-       fun tpl_short_comment: Streamable do return short_markdown
-
-       # Full comment in a template
-       fun tpl_comment: Streamable do return full_markdown
-end
-
 redef class Location
        # Github url based on this location
        fun github(gitdir: String): String do
@@ -112,7 +94,7 @@ redef class MEntity
                lnk.add tpl_link
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_markdown
+                       lnk.add mdoc.tpl_short_comment
                end
                return new TplListItem.with_content(lnk)
        end
@@ -142,7 +124,7 @@ redef class MConcern
                lnk.add tpl_anchor
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_markdown
+                       lnk.add mdoc.tpl_short_comment
                end
                return new TplListItem.with_content(lnk)
        end
@@ -405,10 +387,10 @@ redef class MClassDef
                lnk.add tpl_link
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_markdown
+                       lnk.add mdoc.tpl_short_comment
                else if mclass.intro.mdoc != null then
                        lnk.add ": "
-                       lnk.add mclass.intro.mdoc.short_markdown
+                       lnk.add mclass.intro.mdoc.tpl_short_comment
                end
                return new TplListItem.with_content(lnk)
        end
@@ -552,10 +534,10 @@ redef class MPropDef
                lnk.add anchor
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_markdown
+                       lnk.add mdoc.tpl_short_comment
                else if mproperty.intro.mdoc != null then
                        lnk.add ": "
-                       lnk.add mproperty.intro.mdoc.short_markdown
+                       lnk.add mproperty.intro.mdoc.tpl_short_comment
                end
                return new TplListItem.with_content(lnk)
        end
@@ -570,7 +552,7 @@ redef class MPropDef
                lnk.add anchor
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_markdown
+                       lnk.add mdoc.tpl_short_comment
                end
                var li = new TplListItem.with_content(lnk)
                li.css_classes.add "signature"
index 5e3acf1..d70281e 100644 (file)
@@ -29,6 +29,14 @@ class HighlightVisitor
        # Used to have a really huge and verbose HTML (mainly for debug)
        var with_ast = false is writable
 
+       # Prefixes used in generated IDs for line `<span>` elements.
+       # Useful if more than one highlighted code is present in the same HTML document.
+       #
+       # If set to the empty string, id for lines are disabled.
+       #
+       # Is `"L"` by default.
+       var line_id_prefix = "L" is writable
+
        # The first line to generate, null if start at the first line
        var first_line: nullable Int = null is writable
 
@@ -82,7 +90,8 @@ class HighlightVisitor
 
                                # Add a div for the whole line
                                var tag = new HTMLTag("span")
-                               tag.attrs["id"] = "L{cline}"
+                               var p = line_id_prefix
+                               if p != "" then tag.attrs["id"] = "{p}{cline}"
                                tag.classes.add "line"
                                stack2.add(html)
                                html.add tag
index 0319572..1f73fab 100644 (file)
@@ -76,11 +76,6 @@ private class DetectVarianceConstraintsPhase
        end
 end
 
-redef class MParameterType
-       # The fully-qualified name of the formal parameter.
-       fun full_name: String do return "{mclass.full_name}::{name}"
-end
-
 # A specific analysis that detects the variance constraints of formal parameters.
 #
 # The client has 3 steps to do:
index c634815..3e3c497 100644 (file)
@@ -88,10 +88,14 @@ class MModule
        # The view of the module in the `model.mmodule_importation_hierarchy`
        var in_importation: POSetElement[MModule] is noinit
 
-       # The canonical name of the module
+       # The canonical name of the module.
+       #
+       # It is usually the `name` prefixed by the project's name.
        # Example: `"project::name"`
-       fun full_name: String
-       do
+       #
+       # If both names are the same (of if the module is project-less), then
+       # the short-name is used alone.
+       redef var full_name is lazy do
                var mgroup = self.mgroup
                if mgroup == null or mgroup.mproject.name == self.name then
                        return self.name
@@ -100,6 +104,20 @@ class MModule
                end
        end
 
+       # Return the name of the global C identifier associated to `self`.
+       # This name is used to prefix files and other C identifiers associated with `self`.
+       redef var c_name: String is lazy do
+               var g = mgroup
+               var res
+               if g != null and g.mproject.name != name then
+                       res = g.mproject.name.to_cmangle + "__" + name.to_cmangle
+               else
+                       res = name.to_cmangle
+               end
+               return res
+       end
+
+
        # Create a new empty module and register it to a model
        init
        do
index 9c7a877..8eabb75 100644 (file)
@@ -358,11 +358,12 @@ class MClass
        redef var name: String
 
        # The canonical name of the class
+       #
+       # It is the name of the class prefixed by the full_name of the `intro_mmodule`
        # Example: `"owner::module::MyClass"`
-       fun full_name: String
-       do
-               return "{self.intro_mmodule.full_name}::{name}"
-       end
+       redef var full_name is lazy do return "{self.intro_mmodule.full_name}::{name}"
+
+       redef var c_name is lazy do return "{intro_mmodule.c_name}__{name.to_cmangle}"
 
        # The number of generic formal parameters
        # 0 if the class is not generic
@@ -528,6 +529,29 @@ class MClassDef
        # Actually the name of the `mclass`
        redef fun name do return mclass.name
 
+       # The module and class name separated by a '#'.
+       #
+       # The short-name of the class is used for introduction.
+       # Example: "my_module#MyClass"
+       #
+       # The full-name of the class is used for refinement.
+       # Example: "my_module#intro_module::MyClass"
+       redef var full_name is lazy do
+               if is_intro then
+                       return "{mmodule.full_name}#{mclass.name}"
+               else
+                       return "{mmodule.full_name}#{mclass.full_name}"
+               end
+       end
+
+       redef var c_name is lazy do
+               if is_intro then
+                       return mclass.c_name
+               else
+                       return "{mmodule.c_name}__{mclass.c_name.to_cmangle}"
+               end
+       end
+
        redef fun model do return mmodule.model
 
        # All declared super-types
@@ -1035,6 +1059,10 @@ class MClassType
 
        redef fun to_s do return mclass.to_s
 
+       redef fun full_name do return mclass.full_name
+
+       redef fun c_name do return mclass.c_name
+
        redef fun need_anchor do return false
 
        redef fun anchor_to(mmodule: MModule, anchor: MClassType): MClassType
@@ -1143,10 +1171,30 @@ class MGenericType
                self.to_s = "{mclass}[{arguments.join(", ")}]"
        end
 
-       # Recursively print the type of the arguments within brackets.
+       # The short-name of the class, then the full-name of each type arguments within brackets.
        # Example: `"Map[String, List[Int]]"`
        redef var to_s: String is noinit
 
+       # The full-name of the class, then the full-name of each type arguments within brackets.
+       # Example: `"standard::Map[standard::String, standard::List[standard::Int]]"`
+       redef var full_name is lazy do
+               var args = new Array[String]
+               for t in arguments do
+                       args.add t.full_name
+               end
+               return "{mclass.full_name}[{args.join(", ")}]}"
+       end
+
+       redef var c_name is lazy do
+               var res = mclass.c_name
+               # Note: because the arity is known, a prefix notation is enough
+               for t in arguments do
+                       res += "__"
+                       res += t.c_name
+               end
+               return res.to_s
+       end
+
        redef var need_anchor: Bool is noinit
 
        redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual)
@@ -1287,6 +1335,10 @@ class MVirtualType
        end
 
        redef fun to_s do return self.mproperty.to_s
+
+       redef fun full_name do return self.mproperty.full_name
+
+       redef fun c_name do return self.mproperty.c_name
 end
 
 # The type associated to a formal parameter generic type of a class
@@ -1331,6 +1383,10 @@ class MParameterType
 
        redef fun to_s do return name
 
+       redef var full_name is lazy do return "{mclass.full_name}::{name}"
+
+       redef var c_name is lazy do return mclass.c_name + "__" + "#{name}".to_cmangle
+
        redef fun lookup_bound(mmodule: MModule, resolved_receiver: MType): MType
        do
                assert not resolved_receiver.need_anchor
@@ -1450,6 +1506,10 @@ class MNullableType
 
        redef var to_s: String is noinit
 
+       redef var full_name is lazy do return "nullable {mtype.full_name}"
+
+       redef var c_name is lazy do return "nullable__{mtype.c_name}"
+
        redef fun need_anchor do return mtype.need_anchor
        redef fun as_nullable do return self
        redef fun as_notnullable do return mtype
@@ -1502,6 +1562,8 @@ class MNullType
        super MType
        redef var model: Model
        redef fun to_s do return "null"
+       redef fun full_name do return "null"
+       redef fun c_name do return "null"
        redef fun as_nullable do return self
        redef fun need_anchor do return false
        redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual) do return self
@@ -1668,11 +1730,16 @@ abstract class MProperty
        # The (short) name of the property
        redef var name: String
 
-       # The canonical name of the property
-       # Example: "owner::my_module::MyClass::my_method"
-       fun full_name: String
-       do
-               return "{self.intro_mclassdef.mmodule.full_name}::{self.intro_mclassdef.mclass.name}::{name}"
+       # The canonical name of the property.
+       #
+       # It is the short-`name` prefixed by the short-name of the class and the full-name of the module.
+       # Example: "my_project::my_module::MyClass::my_method"
+       redef var full_name is lazy do
+               return "{intro_mclassdef.mmodule.full_name}::{intro_mclassdef.mclass.name}::{name}"
+       end
+
+       redef var c_name is lazy do
+               return "{intro_mclassdef.mmodule.c_name}__{intro_mclassdef.mclass.c_name}__{name.to_cmangle}"
        end
 
        # The visibility of the property
@@ -1943,6 +2010,51 @@ abstract class MPropDef
        # Actually the name of the `mproperty`
        redef fun name do return mproperty.name
 
+       # The full-name of mpropdefs combine the information about the `classdef` and the `mproperty`.
+       #
+       # Therefore the combination of identifiers is awful,
+       # the worst case being
+       #
+       # ~~~nitish
+       # "{mclassdef.mmodule.full_name}#{mclassdef.mclass.intro_mmodule.full_name}::{mclassdef.name}#{mproperty.intro_mclassdef.mmodule.full_name}::{mproperty.intro_mclassdef.name}::{name}"
+       # ~~~
+       #
+       # Fortunately, the full-name is simplified when entities are repeated.
+       # The simplest form is "my_module#MyClass#my_property".
+       redef var full_name is lazy do
+               var res = new FlatBuffer
+               res.append mclassdef.mmodule.full_name
+               res.append "#"
+               if not mclassdef.is_intro then
+                       res.append mclassdef.mclass.intro_mmodule.full_name
+                       res.append "::"
+               end
+               res.append mclassdef.name
+               res.append "#"
+               if mproperty.intro_mclassdef.mmodule != mclassdef.mmodule then
+                       res.append mproperty.intro_mclassdef.mmodule.full_name
+                       res.append "::"
+               end
+               if mclassdef.mclass != mproperty.intro_mclassdef.mclass then
+                       res.append mproperty.intro_mclassdef.mclass.name
+                       res.append "::"
+               end
+               res.append name
+               return res.to_s
+       end
+
+       redef var c_name is lazy do
+               var res = new FlatBuffer
+               res.append mclassdef.c_name
+               res.append "__"
+               if is_intro then
+                       res.append name.to_cmangle
+               else
+                       res.append mproperty.c_name.to_cmangle
+               end
+               return res.to_s
+       end
+
        redef fun model do return mclassdef.model
 
        # Internal name combining the module, the class and the property
index 4ee1eb6..fd2e1d1 100644 (file)
@@ -25,9 +25,43 @@ end
 # A named and possibly documented entity in the model.
 # This class is useful to generalize presentation of entities to the human.
 abstract class MEntity
-       # The short (unqualified) name of this model entity
+       # The short (unqualified) name of this model entity.
+       #
+       # The short-name is based from the identifiers used to declare or denote the entity.
+       # It is usually globally ambiguous but is often enough in a precise local context.
+       #
+       # It is suitable to use the short-name in message to the user.
+       # However, special care must be used in case of potential ambiguities or name conflict.
        fun name: String is abstract
 
+       # A fully-qualified name of this model entity.
+       #
+       # The full-name is based on the short name and is usually prefixed by the name of an outer entity.
+       # Usually the quad (`::`) is used to separate the different names.
+       #
+       # The full-name is expected to be unique and unambiguous in lawful Nit models for the same kind of entity.
+       #
+       # It is often suitable to use it in message to the user.
+       # However, some full-name could be long and verbose,
+       #
+       # See the specific implementation in subclasses for details.
+       fun full_name: String is abstract
+
+       # A fully-qualified C-like identifier of this model entity.
+       #
+       # The C-name is a name that respects the rule of identifiers in the C language:
+       # it is only made of alphanumeric characters and starts with a letter (or a underscore).
+       #
+       # The C-name can be seen as a mangled version of the `full_name`.
+       # Therefore, it is expected to be unique and unambiguous in lawful Nit models for the same kind of entity.
+       #
+       # The C-name is used by tools that need some identifiers in generated files to designate the
+       # entity.
+       #
+       # Is is not suitable to use it directly with the user (e.g. in message) and
+       # indirect use should be restricted (e.g. to name a web-page)
+       fun c_name: String is abstract
+
        # A Model Entity has a direct link to its model
        fun model: Model is abstract
 end
index b89eced..9002009 100644 (file)
@@ -69,8 +69,9 @@ class MGroup
        # see `in_nesting` for more
        var parent: nullable MGroup
 
-       # fully qualified name
-       fun full_name: String
+       # Fully qualified name.
+       # It includes each parent group separated by `/`
+       redef fun full_name
        do
                var p = parent
                if p == null then return name
index c996a0c..fef5ca9 100644 (file)
@@ -470,6 +470,7 @@ redef class APropdef
                        return false
 
                end
+               if mprop isa MMethod and mprop.is_root_init then return true
                if kwredef == null then
                        if need_redef then
                                modelbuilder.error(self, "Redef error: {mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
@@ -652,9 +653,20 @@ redef class AMethPropdef
                        if parent isa ATopClassdef then mprop.is_toplevel = true
                        self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mprop)
                else
-                       if not mprop.is_root_init and not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
                        check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
                end
+
+               # Check name conflicts in the local class for constructors.
+               if is_init then
+                       for p, n in mclassdef.mprop2npropdef do
+                               if p != mprop and p isa MMethod and p.name == name then
+                                       check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, p)
+                                       break
+                               end
+                       end
+               end
+
                mclassdef.mprop2npropdef[mprop] = self
 
                var mpropdef = new MMethodDef(mclassdef, mprop, self.location)
index 1bed82a..ce683de 100644 (file)
@@ -43,7 +43,6 @@
 # `MGroup`
 #
 # * labels: `MGroup`, `model_name` and `MEntity`.
-# * `full_name`: fully qualified name.
 # * `(:MGroup)-[:PROJECT]->(:MProject)`: associated project.
 # * `(:MGroup)-[:PARENT]->(:MGroup)`: parent group. Does not exist for the root
 # group.
@@ -55,7 +54,6 @@
 # `MModule`
 #
 # * labels: `MModule`, `model_name` and `MEntity`.
-# * `full_name`: fully qualified name.
 # * `location`: origin of the definition. SEE: `Location.to_s`
 # * `(:MModule)-[:IMPORTS]->(:MModule)`: modules that are imported directly.
 # * `(:MModule)-[:INTRODUCES]->(:MClass)`: all by classes introduced by this
@@ -66,7 +64,6 @@
 # `MClass`
 #
 # * labels: `MClass`, `model_name` and `MEntity`.
-# * `full_name`: fully qualified name.
 # * `kind`: kind of the class (`interface`, `abstract class`, etc.)
 # * `visibility`: visibility of the class.
 # * `parameter_names`: JSON array listing the name of each formal generic
@@ -96,7 +93,6 @@
 # * labels: `MProperty`, `model_name` and `MEntity`. Must also have `MMethod`,
 # `MAttribute` `MVirtualTypeProp` or `MInnerClass`, depending on the class of
 # the represented entity.
-# * `full_name`: fully qualified name.
 # * `visibility`: visibility of the property.
 # * `is_init`: Indicates if the property is a constructor. Exists only if the
 # node is a `MMethod`.
@@ -403,7 +399,6 @@ class NeoModel
        private fun mgroup_node(mgroup: MGroup): NeoNode do
                var node = make_node(mgroup)
                node.labels.add "MGroup"
-               node["full_name"] = mgroup.full_name
                var parent = mgroup.parent
                node.out_edges.add(new NeoEdge(node, "PROJECT", to_node(mgroup.mproject)))
                if parent != null then
@@ -442,7 +437,6 @@ class NeoModel
        private fun mmodule_node(mmodule: MModule): NeoNode do
                var node = make_node(mmodule)
                node.labels.add "MModule"
-               node["full_name"] = mmodule.full_name
                node["location"] = mmodule.location.to_s
                for parent in mmodule.in_importation.direct_greaters do
                        node.out_edges.add(new NeoEdge(node, "IMPORTS", to_node(parent)))
@@ -486,7 +480,6 @@ class NeoModel
        private fun mclass_node(mclass: MClass): NeoNode do
                var node = make_node(mclass)
                node.labels.add "MClass"
-               node["full_name"] = mclass.full_name
                node["kind"] = mclass.kind.to_s
                node["visibility"] = mclass.visibility.to_s
                if not mclass.mparameters.is_empty then
@@ -568,7 +561,6 @@ class NeoModel
        private fun mproperty_node(mproperty: MProperty): NeoNode do
                var node = make_node(mproperty)
                node.labels.add "MProperty"
-               node["full_name"] = mproperty.full_name
                node["visibility"] = mproperty.visibility.to_s
                if mproperty isa MMethod then
                        node.labels.add "MMethod"
index 4c8cf9c..cc35b10 100644 (file)
@@ -26,12 +26,13 @@ toolcontext.cached_phase.disabled = true
 toolcontext.keep_going = true
 
 var opt_fragment = new OptionBool("Omit document header and footer", "-f", "--fragment")
+var opt_line_id_prefix = new OptionString("Prefix of the id of each line <span> element", "--line-id-prefix")
 var opt_first_line = new OptionInt("Start the source file at this line (default: 1)", 0, "--first-line")
 var opt_last_line = new OptionInt("End the source file at this line (default: to the end)", 0, "--last-line")
 var opt_dir = new OptionString("Output html files in a specific directory (required if more than one module)", "-d", "--dir")
 var opt_full = new OptionBool("Process also imported modules", "--full")
 var opt_ast = new OptionBool("Generate specific HTML elements for each Node of the AST", "--ast")
-toolcontext.option_context.add_option(opt_fragment, opt_first_line, opt_last_line, opt_dir, opt_full)
+toolcontext.option_context.add_option(opt_fragment, opt_line_id_prefix, opt_first_line, opt_last_line, opt_dir, opt_full)
 toolcontext.tooldescription = "Usage: nitlight [OPTION]... <file.nit>...\nGenerates HTML of highlited code from Nit source files."
 toolcontext.process_options(args)
 
@@ -57,6 +58,10 @@ for mm in mmodules do
        if dir != null then toolcontext.info("write {dir}/{mm.name}.html", 1)
 
        var v = new HighlightVisitor
+       var prefix = opt_line_id_prefix.value
+       if prefix != null then
+               v.line_id_prefix = prefix.trim
+       end
 
        if opt_first_line.value != 0 then v.first_line = opt_first_line.value
        if opt_last_line.value != 0 then v.last_line = opt_last_line.value
index 27e6fac..2bdbb02 100644 (file)
@@ -79,7 +79,9 @@ class NitUnitExecutor
        var cpt = 0
 
        # The entry point for a new `ndoc` node
-       # Fill the prepated `tc` (testcase) XTM node
+       # Fill `docunits` with new discovered unit of tests.
+       #
+       # `tc` (testcase) is the pre-filled XML node
        fun extract(ndoc: ADoc, tc: HTMLTag)
        do
                blocks.clear
@@ -103,12 +105,123 @@ class NitUnitExecutor
 
                if blocks.is_empty then return
 
-               for block in blocks do test_block(ndoc, tc, block)
+               for block in blocks do
+                       docunits.add new DocUnit(ndoc, tc, block.join(""))
+               end
+       end
+
+       # All extracted docunits
+       var docunits = new Array[DocUnit]
+
+       # Execute all the docunits
+       fun run_tests
+       do
+               var simple_du = new Array[DocUnit]
+               for du in docunits do
+                       var ast = toolcontext.parse_something(du.block)
+                       if ast isa AExpr then
+                               simple_du.add du
+                       else
+                               test_single_docunit(du)
+                       end
+               end
+
+               test_simple_docunits(simple_du)
        end
 
-       # Execute a block
-       fun test_block(ndoc: ADoc, tc: HTMLTag, block: Array[String])
+       # Executes multiples doc-units in a shared program.
+       # Used for docunits simple block of code (without modules, classes, functions etc.)
+       #
+       # In case of compilation error, the method fallbacks to `test_single_docunit` to
+       # * locate exactly the compilation problem in the problematic docunit.
+       # * permit the execution of the other docunits that may be correct.
+       fun test_simple_docunits(dus: Array[DocUnit])
        do
+               if dus.is_empty then return
+
+               var file = "{prefix}-0.nit"
+
+               var dir = file.dirname
+               if dir != "" then dir.mkdir
+               var f
+               f = new OFStream.open(file)
+               f.write("# GENERATED FILE\n")
+               f.write("# Docunits extracted from comments\n")
+               f.write("import {mmodule.name}\n")
+               f.write("\n")
+               var i = 0
+               for du in dus do
+
+                       i += 1
+                       f.write("fun run_{i} do\n")
+                       f.write("# {du.testcase.attrs["name"]}\n")
+                       f.write(du.block)
+                       f.write("end\n")
+               end
+               f.write("var a = args.first.to_i\n")
+               for j in [1..i[ do
+                       f.write("if a == {j} then run_{j}\n")
+               end
+               f.close
+
+               if toolcontext.opt_noact.value then return
+
+               var nit_dir = toolcontext.nit_dir
+               var nitg = nit_dir/"bin/nitg"
+               if not nitg.file_exists then
+                       toolcontext.error(null, "Cannot find nitg. Set envvar NIT_DIR.")
+                       toolcontext.check_errors
+               end
+               var cmd = "{nitg} --ignore-visibility --no-color '{file}' -I {mmodule.location.file.filename.dirname} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
+               var res = sys.system(cmd)
+
+               if res != 0 then
+                       # Compilation error.
+                       # Fall-back to individual modes:
+                       for du in dus do
+                               test_single_docunit(du)
+                       end
+                       return
+               end
+
+               i = 0
+               for du in dus do
+                       var tc = du.testcase
+                       toolcontext.modelbuilder.unit_entities += 1
+                       i += 1
+                       toolcontext.info("Execute doc-unit {du.testcase.attrs["name"]} in {file} {i}", 1)
+                       var res2 = sys.system("{file.to_program_name}.bin {i} >>'{file}.out1' 2>&1 </dev/null")
+
+                       var msg
+                       f = new IFStream.open("{file}.out1")
+                       var n2
+                       n2 = new HTMLTag("system-err")
+                       tc.add n2
+                       msg = f.read_all
+                       f.close
+
+                       n2 = new HTMLTag("system-out")
+                       tc.add n2
+                       n2.append(du.block)
+
+                       if res2 != 0 then
+                               var ne = new HTMLTag("error")
+                               ne.attr("message", msg)
+                               tc.add ne
+                               toolcontext.warning(du.ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                               toolcontext.modelbuilder.failed_entities += 1
+                       end
+                       toolcontext.check_errors
+
+                       testsuite.add(tc)
+               end
+       end
+
+       # Executes a single doc-unit in its own program.
+       # Used for docunits larger than a single block of code (with modules, classes, functions etc.)
+       fun test_single_docunit(du: DocUnit)
+       do
+               var tc = du.testcase
                toolcontext.modelbuilder.unit_entities += 1
 
                cpt += 1
@@ -124,9 +237,7 @@ class NitUnitExecutor
                f.write("# Example extracted from a documentation\n")
                f.write("import {mmodule.name}\n")
                f.write("\n")
-               for text in block do
-                       f.write(text)
-               end
+               f.write(du.block)
                f.close
 
                if toolcontext.opt_noact.value then return
@@ -154,20 +265,20 @@ class NitUnitExecutor
 
                n2 = new HTMLTag("system-out")
                tc.add n2
-               for text in block do n2.append(text)
+               n2.append(du.block)
 
 
                if res != 0 then
                        var ne = new HTMLTag("failure")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(ndoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.ndoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                else if res2 != 0 then
                        var ne = new HTMLTag("error")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                end
                toolcontext.check_errors
@@ -176,6 +287,18 @@ class NitUnitExecutor
        end
 end
 
+# A unit-test to run
+class DocUnit
+       # The original comment node
+       var ndoc: ADoc
+
+       # The XML node that contains the information about the execution
+       var testcase: HTMLTag
+
+       # The text of the code to execute
+       var block: String
+end
+
 class SearchAssertVisitor
        super Visitor
        var foundit = false
@@ -265,6 +388,8 @@ redef class ModelBuilder
                        end
                end
 
+               d2m.run_tests
+
                return ts
        end
 end
index 53a99fa..ba4d7ff 100644 (file)
@@ -18,7 +18,6 @@
 module vm
 
 import interpreter::naive_interpreter
-import model_utils
 import perfect_hashing
 
 redef class ModelBuilder
@@ -160,7 +159,7 @@ class VirtualMachine super NaiveInterpreter
 
                assert recv isa MutableInstance
 
-               recv.internal_attributes = init_internal_attributes(initialization_value, recv.mtype.as(MClassType).mclass.all_mattributes(mainmodule, none_visibility).length)
+               recv.internal_attributes = init_internal_attributes(initialization_value, recv.mtype.as(MClassType).mclass.mattributes.length)
                super
        end
 
@@ -389,6 +388,18 @@ redef class MClass
        # introduced by self class in the vtable
        var positions_methods: HashMap[MClass, Int] = new HashMap[MClass, Int]
 
+       # The `MAttribute` this class introduced
+       var intro_mattributes = new Array[MAttribute]
+
+       # The `MMethod` this class introduced
+       var intro_mmethods = new Array[MMethod]
+
+       # All `MAttribute` this class contains
+       var mattributes = new Array[MAttribute]
+
+       # All `MMethod` this class contains
+       var mmethods = new Array[MMethod]
+
        # Allocates a VTable for this class and gives it an id
        private fun make_vt(v: VirtualMachine)
        do
@@ -418,13 +429,12 @@ redef class MClass
                        if not parent.loaded then parent.make_vt(v)
 
                        # Get the number of introduced methods and attributes for this class
-                       var methods = 0
-                       var attributes = 0
+                       var methods = parent.intro_mmethods.length
+                       var attributes = parent.intro_mattributes.length
 
-                       for p in parent.intro_mproperties(none_visibility) do
-                               if p isa MMethod then methods += 1
-                               if p isa MAttribute then attributes += 1
-                       end
+                       # Updates `mmethods` and `mattributes`
+                       mmethods.add_all(parent.intro_mmethods)
+                       mattributes.add_all(parent.intro_mattributes)
 
                        ids.push(parent.vtable.id)
                        nb_methods.push(methods)
@@ -490,21 +500,36 @@ redef class MClass
                # Fixing offsets for self attributes and methods
                var relative_offset_attr = 0
                var relative_offset_meth = 0
-               for p in intro_mproperties(none_visibility) do
-                       if p isa MMethod then
-                               self_methods += 1
-                               p.offset = relative_offset_meth
-                               p.absolute_offset = offset_methods + relative_offset_meth
-                               relative_offset_meth += 1
-                       end
-                       if p isa MAttribute then
-                               nb_introduced_attributes += 1
-                               p.offset = relative_offset_attr
-                               p.absolute_offset = offset_attributes + relative_offset_attr
-                               relative_offset_attr += 1
+
+               # Update `intro_mmethods` and `intro_mattributes`
+               # For each MClassdef this MClass has
+               for classdef in mclassdefs do
+                       # For each property this MClassdef introduce
+                       for p in classdef.intro_mproperties do
+                               # Collect properties and fixing offsets
+                               if p isa MMethod then
+                                       self_methods += 1
+                                       p.offset = relative_offset_meth
+                                       p.absolute_offset = offset_methods + relative_offset_meth
+                                       relative_offset_meth += 1
+
+                                       intro_mmethods.add(p)
+                               end
+                               if p isa MAttribute then
+                                       nb_introduced_attributes += 1
+                                       p.offset = relative_offset_attr
+                                       p.absolute_offset = offset_attributes + relative_offset_attr
+                                       relative_offset_attr += 1
+
+                                       intro_mattributes.add(p)
+                               end
                        end
                end
 
+               # Updates caches with introduced attributes of `self` class
+               mattributes.add_all(intro_mattributes)
+               mmethods.add_all(intro_mmethods)
+
                nb_methods_total.add_all(nb_methods)
                nb_methods_total.push(self_methods)
 
@@ -525,12 +550,10 @@ redef class MClass
        private fun fill_vtable(v:VirtualMachine, table: VTable, cl: MClass)
        do
                var methods = new Array[MMethodDef]
-               for m in cl.intro_mproperties(none_visibility) do
-                       if m isa MMethod then
-                               # `propdef` is the most specific implementation for this MMethod
-                               var propdef = m.lookup_first_definition(v.mainmodule, self.intro.bound_mtype)
-                               methods.push(propdef)
-                       end
+               for m in cl.intro_mmethods do
+                       # `propdef` is the most specific implementation for this MMethod
+                       var propdef = m.lookup_first_definition(v.mainmodule, self.intro.bound_mtype)
+                       methods.push(propdef)
                end
 
                # Call a method in C to put propdefs of self methods in the vtables
@@ -593,7 +616,7 @@ redef class MClass
                        for cl in direct_parents do
                                # If we never have visited this class
                                if not res.has(cl) then
-                                       var properties_length = cl.all_mproperties(v.mainmodule, none_visibility).length
+                                       var properties_length = cl.mmethods.length + cl.mattributes.length
                                        if properties_length > max then
                                                max = properties_length
                                                prefix = cl
diff --git a/tests/base_attr_lazy2.nit b/tests/base_attr_lazy2.nit
new file mode 100644 (file)
index 0000000..078097d
--- /dev/null
@@ -0,0 +1,49 @@
+# 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 kernel
+
+class A
+       var foo: Object is lazy do
+               1.output
+               do
+                       2.output
+                       if true then break
+                       3.output
+               end
+               return 4
+       end
+
+       var bar: Object = baz is lazy
+
+       fun baz: Object do
+               10.output
+               do
+                       20.output
+                       if true then break
+                       30.output
+               end
+               return 40
+       end
+end
+
+var a = new A
+a.foo.output
+a.bar.output
+
+'\n'.output
+
+var na: nullable A = a
+na.foo.output
+na.bar.output
diff --git a/tests/base_attr_lazy3.nit b/tests/base_attr_lazy3.nit
new file mode 100644 (file)
index 0000000..e0679bc
--- /dev/null
@@ -0,0 +1,37 @@
+# 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 kernel
+
+class A
+       var prev: nullable A
+       var value: Int is lazy do
+               if prev == null then return 0
+               var v = prev.value + 1
+               v.output
+               return v
+       end
+end
+
+var a0 = new A(null)
+var a1 = new A(a0)
+var a2 = new A(a1)
+var a3 = new A(a2)
+
+'\n'.output
+a2.value.output
+'\n'.output
+a1.value.output
+'\n'.output
+a3.value.output
diff --git a/tests/error_defs_init.nit b/tests/error_defs_init.nit
new file mode 100644 (file)
index 0000000..adff5f2
--- /dev/null
@@ -0,0 +1,33 @@
+# 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 kernel
+
+class A
+       #1alt1#init do abort
+       #1alt2#init(a: Int) do abort
+       #1alt3#new do abort
+       #1alt4#new(c: Int) do abort
+       #1alt5#init foo(a: Int) do abort
+       #1alt6#new foo(c: Int) do abort
+       #1alt7#fun foo do end
+
+       #alt1#init do abort
+       #alt2#init(b: Float) do abort
+       #alt3#new do abort
+       #alt4#new(d: Float) do abort
+       #alt5#init foo(a: Float) do abort
+       #alt6#new foo(c: Float) do abort
+       #alt7#fun foo do end
+end
index 4046c7f..abd29fc 100644 (file)
@@ -5,3 +5,4 @@
 --src-lang java -- foo ../contrib/neo_doxygen/tests/java-project/xml
 --src-lang java -- root-namespace ../contrib/neo_doxygen/tests/root-namespace/xml
 --src-lang java -- inner-class ../contrib/neo_doxygen/tests/inner-class/xml
+-- python-def ../contrib/neo_doxygen/tests/python-def/xml
index 8725c3e..d25129d 100644 (file)
@@ -5,7 +5,8 @@ neo_doxygen_dump
 neo_doxygen_file_compound
 neo_doxygen_graph_empty_project
 neo_doxygen_member_resolve_introducer
+neo_doxygen_namespace_members
 test_docdown
 nith
-nit_pretty
+nitpretty
 nitmetrics
index cb551a2..a78f621 100644 (file)
@@ -20,3 +20,6 @@ nitunit_args
 nitpretty_args
 hamming_number
 hailstone
+test_map
+nitls
+nituml
diff --git a/tests/sav/base_attr_lazy2.res b/tests/sav/base_attr_lazy2.res
new file mode 100644 (file)
index 0000000..dacdf17
--- /dev/null
@@ -0,0 +1,9 @@
+1
+2
+4
+10
+20
+40
+
+4
+40
diff --git a/tests/sav/base_attr_lazy3.res b/tests/sav/base_attr_lazy3.res
new file mode 100644 (file)
index 0000000..ab373e6
--- /dev/null
@@ -0,0 +1,9 @@
+
+1
+2
+2
+
+1
+
+3
+3
diff --git a/tests/sav/error_defs_init_1alt1_alt1.res b/tests/sav/error_defs_init_1alt1_alt1.res
new file mode 100644 (file)
index 0000000..fc4db99
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt1_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt1_alt2.res b/tests/sav/error_defs_init_1alt1_alt2.res
new file mode 100644 (file)
index 0000000..d8121d9
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt1_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt2_alt1.res b/tests/sav/error_defs_init_1alt2_alt1.res
new file mode 100644 (file)
index 0000000..428ec4f
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt2_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt2_alt2.res b/tests/sav/error_defs_init_1alt2_alt2.res
new file mode 100644 (file)
index 0000000..f3971f5
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt2_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt3_alt3.res b/tests/sav/error_defs_init_1alt3_alt3.res
new file mode 100644 (file)
index 0000000..497d5c5
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt3_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt3_alt4.res b/tests/sav/error_defs_init_1alt3_alt4.res
new file mode 100644 (file)
index 0000000..bf6b758
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt3_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt4_alt3.res b/tests/sav/error_defs_init_1alt4_alt3.res
new file mode 100644 (file)
index 0000000..42194cf
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt4_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt4_alt4.res b/tests/sav/error_defs_init_1alt4_alt4.res
new file mode 100644 (file)
index 0000000..56af643
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt4_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt5_alt5.res b/tests/sav/error_defs_init_1alt5_alt5.res
new file mode 100644 (file)
index 0000000..4db55bb
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt5_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt5_alt6.res b/tests/sav/error_defs_init_1alt5_alt6.res
new file mode 100644 (file)
index 0000000..c0863fd
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt5_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt5_alt7.res b/tests/sav/error_defs_init_1alt5_alt7.res
new file mode 100644 (file)
index 0000000..23f59bb
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt5_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt6_alt5.res b/tests/sav/error_defs_init_1alt6_alt5.res
new file mode 100644 (file)
index 0000000..0f733f8
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt6_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt6_alt6.res b/tests/sav/error_defs_init_1alt6_alt6.res
new file mode 100644 (file)
index 0000000..842b525
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt6_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt6_alt7.res b/tests/sav/error_defs_init_1alt6_alt7.res
new file mode 100644 (file)
index 0000000..21fb680
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt6_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt7_alt5.res b/tests/sav/error_defs_init_1alt7_alt5.res
new file mode 100644 (file)
index 0000000..446f89e
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt7_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt7_alt6.res b/tests/sav/error_defs_init_1alt7_alt6.res
new file mode 100644 (file)
index 0000000..c3761f1
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt7_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
diff --git a/tests/sav/error_defs_init_1alt7_alt7.res b/tests/sav/error_defs_init_1alt7_alt7.res
new file mode 100644 (file)
index 0000000..f834897
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_init_1alt7_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
index 743b9a2..fd65e88 100644 (file)
@@ -22,8 +22,8 @@ Edge
 35:empty project with default settings
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty project with default settings"}
+=properties=JsonObject(1):
+{"name":"empty project with default settings"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 35:empty project with default settings
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty project with default settings"}
+=properties=JsonObject(1):
+{"name":"empty project with default settings"}
 ----
 =to=Node
 =labels=Array(3):
index 724e242..08f87af 100644 (file)
@@ -22,8 +22,8 @@ Edge
 13:empty-project
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 13:empty-project
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
 ----
 =to=Node
 =labels=Array(3):
index 724e242..08f87af 100644 (file)
@@ -22,8 +22,8 @@ Edge
 13:empty-project
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 13:empty-project
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
 ----
 =to=Node
 =labels=Array(3):
index f44e8ea..3a3c933 100644 (file)
@@ -22,8 +22,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
 =to=Node
 =labels=Array(3):
@@ -49,6 +49,50 @@ Edge
 
 
 Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespaceorg
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#12:namespaceorg
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
+
+
+Edge
 =type=8:DECLARES
 =properties=JsonObject(0):
 {}
@@ -58,16 +102,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 
 
 Edge
@@ -80,16 +124,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -102,16 +146,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 
 
 Edge
@@ -124,16 +168,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 
 
 Edge
@@ -146,16 +190,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -168,16 +212,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -190,16 +234,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 
 
 Edge
@@ -212,16 +256,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -234,16 +278,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -256,16 +300,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 
 
 Edge
@@ -278,16 +322,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -300,16 +344,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -369,8 +413,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -378,8 +422,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -393,8 +437,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -532,8 +576,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -541,8 +585,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -556,16 +600,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -578,8 +622,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -587,8 +631,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -601,16 +645,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -623,8 +667,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -632,8 +676,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -647,16 +691,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 
 
 Edge
@@ -669,8 +713,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_a_1add415ae4129969055d678c7e7e048852
 =labels=Array(4):
@@ -678,8 +722,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 
 
 Edge
@@ -693,8 +737,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -702,8 +746,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 
 
 Edge
@@ -717,8 +761,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -787,8 +831,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -796,8 +840,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -811,8 +855,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -951,8 +995,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -960,8 +1004,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -975,8 +1019,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1022,8 +1066,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1031,8 +1075,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 
 
 Edge
@@ -1046,16 +1090,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -1068,8 +1112,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1077,8 +1121,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 
 
 Edge
@@ -1091,16 +1135,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -1113,8 +1157,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1122,8 +1166,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -1136,8 +1180,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1145,8 +1189,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1159,8 +1203,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1168,8 +1212,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 
 
 Edge
@@ -1183,16 +1227,16 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -1205,8 +1249,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1ac6b627949b10b9357eefc0cafcae1d87
 =labels=Array(4):
@@ -1214,8 +1258,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 
 
 Edge
@@ -1228,8 +1272,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1237,8 +1281,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -1252,16 +1296,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -1274,8 +1318,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1a11e157943665cc9e3a9be1502ebeb3b5
 =labels=Array(4):
@@ -1283,8 +1327,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 
 
 Edge
@@ -1297,8 +1341,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1a733f4e076f29c7d0c41ed258199ea1d9
 =labels=Array(4):
@@ -1306,8 +1350,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 
 
 Edge
@@ -1320,8 +1364,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1329,8 +1373,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 
 
 Edge
@@ -1344,16 +1388,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -1366,8 +1410,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1375,8 +1419,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 
 
 Edge
@@ -1389,16 +1433,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"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
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -1412,8 +1456,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1421,8 +1465,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 
 
 Edge
@@ -1436,8 +1480,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1460,8 +1504,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1469,8 +1513,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -1484,8 +1528,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1531,8 +1575,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"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):
@@ -1540,8 +1584,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1555,16 +1599,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -1577,8 +1621,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1586,8 +1630,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1600,16 +1644,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -1622,8 +1666,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1631,8 +1675,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 
 
 Edge
@@ -1646,16 +1690,16 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -1668,8 +1712,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1677,8 +1721,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 
 
 Edge
@@ -1691,8 +1735,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1700,8 +1744,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -1715,16 +1759,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -1737,8 +1781,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1746,8 +1790,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 
 
 Edge
@@ -1760,8 +1804,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1777,65 +1821,21 @@ Edge
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#12:namespaceorg
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-
-
-Edge
-=type=5:NESTS
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-----
-=to=Entity#12:namespaceorg
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
-
-
-Edge
-=type=6:PARENT
-=properties=JsonObject(0):
-{}
-----
 =from=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#12:namespaceorg
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1848,16 +1848,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1870,8 +1870,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1892,16 +1892,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1914,16 +1914,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#30:namespaceorg_1_1example_1_1foo
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 
 
 Edge
@@ -1936,8 +1936,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
index ae6cb05..95633f3 100644 (file)
@@ -22,8 +22,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
 =to=Node
 =labels=Array(3):
@@ -49,6 +49,50 @@ Edge
 
 
 Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespaceorg
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#12:namespaceorg
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
+
+
+Edge
 =type=8:DECLARES
 =properties=JsonObject(0):
 {}
@@ -58,16 +102,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 
 
 Edge
@@ -80,16 +124,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -102,16 +146,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:1,1--1,1","name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 
 
 Edge
@@ -124,16 +168,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 
 
 Edge
@@ -146,16 +190,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -168,16 +212,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:1,1--1,1","name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -190,16 +234,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 
 
 Edge
@@ -212,16 +256,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -234,16 +278,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:1,1--1,1","name":"C"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -256,16 +300,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 
 
 Edge
@@ -278,16 +322,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -300,16 +344,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:1,1--1,1","name":"EmptyClass"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -369,8 +413,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -378,8 +422,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -393,8 +437,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -532,8 +576,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -541,8 +585,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -556,16 +600,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -578,8 +622,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -587,8 +631,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -601,16 +645,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_a
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"abstract class","visibility":"public","full_name":"org::example::foo::A","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
+=properties=JsonObject(4):
+{"kind":"abstract class","visibility":"public","name":"A","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1"}
 
 
 Edge
@@ -623,8 +667,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -632,8 +676,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -647,16 +691,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 
 
 Edge
@@ -669,8 +713,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:18,1--23,1","is_intro":true,"name":"A"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_a_1add415ae4129969055d678c7e7e048852
 =labels=Array(4):
@@ -678,8 +722,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true,"full_name":"org::example::foo::A::bar"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:22,1--1,1","is_intern":false,"is_extern":false,"is_abstract":true,"visibility":"public","name":"bar","mdoc":["Does something..."],"is_intro":true}
 
 
 Edge
@@ -693,8 +737,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -702,8 +746,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 
 
 Edge
@@ -717,8 +761,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -787,8 +831,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -796,8 +840,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -811,8 +855,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -951,8 +995,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -960,8 +1004,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -975,8 +1019,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1022,8 +1066,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1031,8 +1075,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 
 
 Edge
@@ -1046,16 +1090,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -1068,8 +1112,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1077,8 +1121,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
 
 
 Edge
@@ -1091,16 +1135,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#32:classorg_1_1example_1_1foo_1_1_b
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(5):
-{"kind":"class","visibility":"public","full_name":"org::example::foo::B","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"B","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1"}
 
 
 Edge
@@ -1113,8 +1157,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1122,8 +1166,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
 
 
 Edge
@@ -1136,8 +1180,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1145,8 +1189,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1159,8 +1203,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1168,8 +1212,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 
 
 Edge
@@ -1183,16 +1227,16 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"protected","name":"qux","full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(2):
+{"visibility":"protected","name":"qux"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -1205,8 +1249,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1ac6b627949b10b9357eefc0cafcae1d87
 =labels=Array(4):
@@ -1214,8 +1258,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true,"full_name":"org::example::foo::B::qux"}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:19,1---1,1","visibility":"protected","name":"qux","is_intro":true}
 
 
 Edge
@@ -1228,8 +1272,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1237,8 +1281,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 
 
 Edge
@@ -1252,16 +1296,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"bar","full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 
 
 Edge
@@ -1274,8 +1318,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1a11e157943665cc9e3a9be1502ebeb3b5
 =labels=Array(4):
@@ -1283,8 +1327,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(8):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true,"full_name":"org::example::foo::B::bar"}
+=properties=JsonObject(7):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:21,1--23,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","is_intro":true}
 
 
 Edge
@@ -1297,8 +1341,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:18,1--29,1","is_intro":true,"name":"B"}
 ----
 =to=Entity#67:classorg_1_1example_1_1foo_1_1_b_1a733f4e076f29c7d0c41ed258199ea1d9
 =labels=Array(4):
@@ -1306,8 +1350,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false,"full_name":"org::example::foo::B::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/B.java:28,1--28,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["Some overriden documentation."],"is_intro":false}
 
 
 Edge
@@ -1320,8 +1364,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1329,8 +1373,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 
 
 Edge
@@ -1344,16 +1388,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 ----
 =to=Entity#42:classorg_1_1example_1_1foo_1_1_empty_class
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -1366,8 +1410,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1375,8 +1419,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
 
 
 Edge
@@ -1389,16 +1433,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"name":"EmptyClass","full_name":"org::example::foo::EmptyClass","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","is_intro":true,"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
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"org::example::foo::EmptyClass","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"package","name":"EmptyClass","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/EmptyClass.java:21,1--21,1","mdoc":["This class is empty and is only visible in this package."]}
 
 
 Edge
@@ -1412,8 +1456,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1421,8 +1465,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 
 
 Edge
@@ -1436,8 +1480,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1460,8 +1504,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1469,8 +1513,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -1484,8 +1528,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -1531,8 +1575,8 @@ Edge
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"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):
@@ -1540,8 +1584,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1555,16 +1599,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 ----
 =to=Entity#36:interfaceorg_1_1example_1_1foo_1_1_c
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -1577,8 +1621,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1586,8 +1630,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
 
 
 Edge
@@ -1600,16 +1644,16 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
 3:foo
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"interface","visibility":"public","full_name":"org::example::foo::C","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
+=properties=JsonObject(5):
+{"kind":"interface","visibility":"public","name":"C","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","mdoc":["An interface"]}
 
 
 Edge
@@ -1622,8 +1666,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1631,8 +1675,8 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 
 
 Edge
@@ -1646,16 +1690,16 @@ Edge
 7:MEntity
 9:MProperty
 10:MAttribute
-=properties=JsonObject(3):
-{"visibility":"public","name":"THE_ANSWER","full_name":"org::example::foo::C::THE_ANSWER"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"THE_ANSWER"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -1668,8 +1712,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1677,8 +1721,8 @@ Edge
 7:MEntity
 8:MPropDef
 13:MAttributeDef
-=properties=JsonObject(6):
-{"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,"full_name":"org::example::foo::C::THE_ANSWER"}
+=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}
 
 
 Edge
@@ -1691,8 +1735,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1700,8 +1744,8 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 
 
 Edge
@@ -1715,16 +1759,16 @@ Edge
 7:MEntity
 9:MProperty
 7:MMethod
-=properties=JsonObject(4):
-{"visibility":"public","is_init":false,"name":"baz","full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"baz"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","mdoc":["An interface"]}
 
 
 Edge
@@ -1737,8 +1781,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:21,1--31,1","is_intro":true,"name":"C","full_name":"org::example::foo::C","mdoc":["An interface"]}
+=properties=JsonObject(4):
+{"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):
@@ -1746,8 +1790,8 @@ Edge
 7:MEntity
 8:MPropDef
 10:MMethodDef
-=properties=JsonObject(9):
-{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true,"full_name":"org::example::foo::C::baz"}
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/C.java:30,1--1,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"baz","mdoc":["A function with implicit modifiers."],"is_intro":true}
 
 
 Edge
@@ -1760,8 +1804,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1777,65 +1821,21 @@ Edge
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#12:namespaceorg
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-
-
-Edge
-=type=5:NESTS
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-----
-=to=Entity#12:namespaceorg
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
-
-
-Edge
-=type=6:PARENT
-=properties=JsonObject(0):
-{}
-----
 =from=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#12:namespaceorg
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1848,16 +1848,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org","name":"org","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"org","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1870,8 +1870,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1892,16 +1892,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Entity#23:namespaceorg_1_1example
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 
 
 Edge
@@ -1914,16 +1914,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example","name":"example","location":"\/dev\/null:1,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"example","location":"\/dev\/null:1,1--1,1"}
 ----
 =to=Entity#30:namespaceorg_1_1example_1_1foo
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 
 
 Edge
@@ -1936,8 +1936,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(5):
-{"kind":"namespace","visibility":"","full_name":"org::example::foo","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/org\/example\/foo\/A.java:16,1--1,1"}
 ----
 =to=Node
 =labels=Array(3):
index 65d20ff..5436c24 100644 (file)
@@ -22,8 +22,8 @@ Edge
 14:root-namespace
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"root-namespace"}
+=properties=JsonObject(1):
+{"name":"root-namespace"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 14:root-namespace
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"root-namespace"}
+=properties=JsonObject(1):
+{"name":"root-namespace"}
 ----
 =to=Node
 =labels=Array(3):
@@ -58,8 +58,8 @@ Edge
 14:root-namespace
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"Foo","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+=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"]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -67,8 +67,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Foo","full_name":"Foo"}
+=properties=JsonObject(1):
+{"name":"Foo"}
 
 
 Edge
@@ -82,16 +82,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Foo","full_name":"Foo"}
+=properties=JsonObject(1):
+{"name":"Foo"}
 ----
 =to=Entity#9:class_foo
 =labels=Array(3):
 14:root-namespace
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"Foo","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+=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"]}
 
 
 Edge
@@ -104,8 +104,8 @@ Edge
 14:root-namespace
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","full_name":"Foo","mdoc":["A class in the root namespace"]}
+=properties=JsonObject(4):
+{"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):
@@ -113,8 +113,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Foo","full_name":"Foo"}
+=properties=JsonObject(1):
+{"name":"Foo"}
 
 
 Edge
@@ -127,16 +127,16 @@ Edge
 14:root-namespace
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","full_name":"Foo","mdoc":["A class in the root namespace"]}
+=properties=JsonObject(4):
+{"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):
 14:root-namespace
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"Foo","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+=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"]}
 
 
 Edge
@@ -149,16 +149,16 @@ Edge
 14:root-namespace
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"root-namespace"}
+=properties=JsonObject(1):
+{"name":"root-namespace"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","full_name":"Foo"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
 
 
 Edge
@@ -171,16 +171,16 @@ Edge
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","full_name":"Foo"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
 ----
 =to=Entity#9:class_foo
 =labels=Array(3):
 14:root-namespace
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"package","full_name":"Foo","name":"Foo","location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","mdoc":["A class in the root namespace"]}
+=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"]}
 
 
 Edge
@@ -193,16 +193,16 @@ Edge
 14:root-namespace
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo","full_name":"Foo"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:1,1--1,1","name":"Foo"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 14:root-namespace
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","full_name":"Foo","mdoc":["A class in the root namespace"]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/Foo.java:19,1--19,1","is_intro":true,"name":"Foo","mdoc":["A class in the root namespace"]}
 
 
 ---===DONE===---
index 308f58a..ed4bd1d 100644 (file)
@@ -22,8 +22,8 @@ Edge
 11:inner-class
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"inner-class"}
+=properties=JsonObject(1):
+{"name":"inner-class"}
 
 
 Edge
@@ -36,8 +36,8 @@ Edge
 11:inner-class
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"inner-class"}
+=properties=JsonObject(1):
+{"name":"inner-class"}
 ----
 =to=Node
 =labels=Array(3):
@@ -58,8 +58,8 @@ Edge
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -67,8 +67,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass"}
 
 
 Edge
@@ -82,16 +82,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass"}
 ----
 =to=Entity#17:class_outer_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
 
 
 Edge
@@ -104,8 +104,8 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -113,8 +113,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass"}
 
 
 Edge
@@ -127,16 +127,16 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 ----
 =to=Entity#17:class_outer_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
 
 
 Edge
@@ -149,8 +149,8 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -158,8 +158,8 @@ Edge
 7:MEntity
 9:MProperty
 11:MInnerClass
-=properties=JsonObject(3):
-{"visibility":"public","full_name":"OuterClass::InnerClass","name":"InnerClass"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"InnerClass"}
 
 
 Edge
@@ -173,16 +173,16 @@ Edge
 7:MEntity
 9:MProperty
 11:MInnerClass
-=properties=JsonObject(3):
-{"visibility":"public","full_name":"OuterClass::InnerClass","name":"InnerClass"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"InnerClass"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 
 
 Edge
@@ -195,8 +195,8 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -204,8 +204,8 @@ Edge
 7:MEntity
 8:MPropDef
 14:MInnerClassDef
-=properties=JsonObject(5):
-{"location":"\/dev\/null:1,1--1,1","full_name":"OuterClass::InnerClass","name":"InnerClass","visibility":"public","is_intro":true}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","name":"InnerClass","visibility":"public","is_intro":true}
 
 
 Edge
@@ -219,8 +219,8 @@ Edge
 7:MEntity
 8:MPropDef
 14:MInnerClassDef
-=properties=JsonObject(5):
-{"location":"\/dev\/null:1,1--1,1","full_name":"OuterClass::InnerClass","name":"InnerClass","visibility":"public","is_intro":true}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","name":"InnerClass","visibility":"public","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -228,8 +228,8 @@ Edge
 7:MEntity
 9:MProperty
 11:MInnerClass
-=properties=JsonObject(3):
-{"visibility":"public","full_name":"OuterClass::InnerClass","name":"InnerClass"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"InnerClass"}
 
 
 Edge
@@ -243,16 +243,16 @@ Edge
 7:MEntity
 8:MPropDef
 14:MInnerClassDef
-=properties=JsonObject(5):
-{"location":"\/dev\/null:1,1--1,1","full_name":"OuterClass::InnerClass","name":"InnerClass","visibility":"public","is_intro":true}
+=properties=JsonObject(4):
+{"location":"\/dev\/null:1,1--1,1","name":"InnerClass","visibility":"public","is_intro":true}
 ----
 =to=Entity#0:
 =labels=Array(3):
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
 
 
 Edge
@@ -266,16 +266,16 @@ Edge
 7:MEntity
 9:MProperty
 11:MInnerClass
-=properties=JsonObject(3):
-{"visibility":"public","full_name":"OuterClass::InnerClass","name":"InnerClass"}
+=properties=JsonObject(2):
+{"visibility":"public","name":"InnerClass"}
 ----
 =to=Entity#33:class_outer_class_1_1_inner_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass::InnerClass","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
 
 
 Edge
@@ -288,8 +288,8 @@ Edge
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass::InnerClass","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -297,8 +297,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass::InnerClass"}
 
 
 Edge
@@ -312,16 +312,16 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass::InnerClass"}
 ----
 =to=Entity#33:class_outer_class_1_1_inner_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass::InnerClass","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
 
 
 Edge
@@ -334,8 +334,8 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -343,8 +343,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass::InnerClass"}
 
 
 Edge
@@ -357,16 +357,16 @@ Edge
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
 ----
 =to=Entity#33:class_outer_class_1_1_inner_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass::InnerClass","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
 
 
 Edge
@@ -379,16 +379,16 @@ Edge
 11:inner-class
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"inner-class"}
+=properties=JsonObject(1):
+{"name":"inner-class"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 11:inner-class
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass"}
 
 
 Edge
@@ -401,16 +401,16 @@ Edge
 11:inner-class
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass"}
 ----
 =to=Entity#17:class_outer_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","mdoc":["A class with an inner class."]}
 
 
 Edge
@@ -423,16 +423,16 @@ Edge
 11:inner-class
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","full_name":"OuterClass","mdoc":["A class with an inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:19,1--24,1","is_intro":true,"name":"OuterClass","mdoc":["A class with an inner class."]}
 
 
 Edge
@@ -445,16 +445,16 @@ Edge
 11:inner-class
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass"}
 ----
 =to=Entity#33:class_outer_class_1_1_inner_class
 =labels=Array(3):
 11:inner-class
 7:MEntity
 6:MClass
-=properties=JsonObject(6):
-{"kind":"class","visibility":"public","full_name":"OuterClass::InnerClass","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(5):
+{"kind":"class","visibility":"public","name":"OuterClass::InnerClass","location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","mdoc":["An instance (non-static) inner class."]}
 
 
 Edge
@@ -467,16 +467,16 @@ Edge
 11:inner-class
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:1,1--1,1","name":"OuterClass"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 11:inner-class
 7:MEntity
 9:MClassDef
-=properties=JsonObject(5):
-{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
+=properties=JsonObject(4):
+{"location":"%SOURCE_DIRECTORY%\/OuterClass.java:23,1--23,1","is_intro":true,"name":"OuterClass::InnerClass","mdoc":["An instance (non-static) inner class."]}
 
 
 ---===DONE===---
diff --git a/tests/sav/neo_doxygen_dump_args8.res b/tests/sav/neo_doxygen_dump_args8.res
new file mode 100644 (file)
index 0000000..b311247
--- /dev/null
@@ -0,0 +1,415 @@
+Reading ../contrib/neo_doxygen/tests/python-def/xml... Done.
+3 files read.
+Linking nodes...\e[s \e[u\e[J Done.
+Saving 11 nodes...
+---===DONE===---
+Saving 18 edges...
+Edge
+=type=4:ROOT
+=properties=JsonObject(0):
+{}
+----
+=from=Node
+=labels=Array(3):
+10:python-def
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"python-def"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"python-def"}
+
+
+Edge
+=type=7:PROJECT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"python-def"}
+----
+=to=Node
+=labels=Array(3):
+10:python-def
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"python-def"}
+
+
+Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"python-def"}
+
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"python-def"}
+----
+=to=Entity#12:namespacefoo
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+
+
+Edge
+=type=8:DECLARES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","name":"foo"}
+
+
+Edge
+=type=10:INTRODUCES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MClass
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"(self)","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+
+
+Edge
+=type=7:DEFINES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+
+
+Edge
+=type=7:DEFINES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#47:namespacefoo_1aab1e88a2212b202c20f3c9bd799a1ad4
+=labels=Array(4):
+10:python-def
+7:MEntity
+8:MPropDef
+10:MMethodDef
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:16,1--20,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["A bar function in the foo namespace.","By default, Doxygen recognizes anything in the docstrings as verbatim\ndetailed description."],"is_intro":true}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+9:MProperty
+7:MMethod
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
+
+
+Edge
+=type=9:SIGNATURE
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#47:namespacefoo_1aab1e88a2212b202c20f3c9bd799a1ad4
+=labels=Array(4):
+10:python-def
+7:MEntity
+8:MPropDef
+10:MMethodDef
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:16,1--20,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["A bar function in the foo namespace.","By default, Doxygen recognizes anything in the docstrings as verbatim\ndetailed description."],"is_intro":true}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+10:MSignature
+=properties=JsonObject(0):
+{}
+
+
+Edge
+=type=10:RETURNTYPE
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+10:MSignature
+=properties=JsonObject(0):
+{}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+8:MRawType
+=properties=JsonObject(1):
+{"text":["def"]}
+
+
+Edge
+=type=7:PROJECT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MGroup
+=properties=JsonObject(4):
+{"kind":"namespace","visibility":"","name":"foo","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+----
+=to=Node
+=labels=Array(3):
+10:python-def
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"python-def"}
+
+
+Edge
+=type=9:CLASSTYPE
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MClass
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"(self)","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+
+
+Edge
+=type=5:CLASS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MClass
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"(self)","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+
+
+Edge
+=type=9:BOUNDTYPE
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+
+
+Edge
+=type=6:MCLASS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+6:MClass
+=properties=JsonObject(4):
+{"kind":"class","visibility":"public","name":"(self)","location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1"}
+
+
+Edge
+=type=10:INTRODUCES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+----
+=to=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+9:MProperty
+7:MMethod
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
+
+
+Edge
+=type=14:INTRO_CLASSDEF
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+10:python-def
+7:MEntity
+9:MProperty
+7:MMethod
+=properties=JsonObject(3):
+{"visibility":"public","is_init":false,"name":"bar"}
+----
+=to=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+
+
+Edge
+=type=8:DECLARES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+10:python-def
+7:MEntity
+9:MClassDef
+=properties=JsonObject(3):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:1,1--1,1","is_intro":true,"name":"(self)"}
+----
+=to=Entity#47:namespacefoo_1aab1e88a2212b202c20f3c9bd799a1ad4
+=labels=Array(4):
+10:python-def
+7:MEntity
+8:MPropDef
+10:MMethodDef
+=properties=JsonObject(8):
+{"location":"%SOURCE_DIRECTORY%\/foo.py:16,1--20,1","is_intern":false,"is_extern":false,"is_abstract":false,"visibility":"public","name":"bar","mdoc":["A bar function in the foo namespace.","By default, Doxygen recognizes anything in the docstrings as verbatim\ndetailed description."],"is_intro":true}
+
+
+---===DONE===---
index ab885c0..9b16eb8 100644 (file)
@@ -18,8 +18,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
 =type=7:PROJECT
@@ -31,8 +31,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
 =to=Node
 =labels=Array(3):
@@ -43,6 +43,132 @@ Edge
 {"name":"foo"}
 
 Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"a"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"a"}
+
+Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#10:namespacec
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"c"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#10:namespacec
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"c"}
+
+Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#10:namespaced
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"d"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#10:namespaced
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"d"}
+
+Edge
 =type=8:DECLARES
 =properties=JsonObject(0):
 {}
@@ -52,16 +178,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=10:INTRODUCES
@@ -73,8 +199,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -82,7 +208,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=7:DEFINES
@@ -94,16 +220,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 
 Edge
 =type=8:DECLARES
@@ -115,16 +241,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"c"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"c::Bar"}
+=properties=JsonObject(2):
+{"location":"Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=8:DECLARES
@@ -136,16 +262,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"d"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"d::Bar"}
+=properties=JsonObject(2):
+{"location":"Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=9:CLASSTYPE
@@ -158,7 +284,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -166,8 +292,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 
 Edge
 =type=5:CLASS
@@ -180,8 +306,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -189,7 +315,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=9:BOUNDTYPE
@@ -201,8 +327,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -210,8 +336,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 
 Edge
 =type=6:MCLASS
@@ -223,8 +349,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -232,7 +358,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=9:CLASSTYPE
@@ -245,7 +371,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -253,8 +379,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 
 Edge
 =type=5:CLASS
@@ -267,8 +393,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -276,7 +402,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 
 Edge
 =type=9:BOUNDTYPE
@@ -288,8 +414,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(3):
+{"location":"Baz.jar:1,1--1,1","is_intro":true,"name":"Baz"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -297,8 +423,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 
 Edge
 =type=6:MCLASS
@@ -310,8 +436,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(3):
+{"location":"Baz.jar:1,1--1,1","is_intro":true,"name":"Baz"}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -319,7 +445,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 
 Edge
 =type=7:PROJECT
@@ -331,8 +457,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
 ----
 =to=Node
 =labels=Array(3):
@@ -352,16 +478,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"a"}
 
 Edge
 =type=5:NESTS
@@ -373,19 +499,19 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"a"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"b"}
 
 Edge
-=type=6:PARENT
+=type=7:PROJECT
 =properties=JsonObject(0):
 {}
 ----
@@ -394,50 +520,50 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
-=to=Entity#0:
+=to=Node
 =labels=Array(3):
 3:foo
 7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
-=type=5:NESTS
+=type=7:PROJECT
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#0:
+=from=Entity#10:namespacec
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"c"}
 ----
-=to=Entity#0:
+=to=Node
 =labels=Array(3):
 3:foo
 7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
 =type=7:PROJECT
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#0:
+=from=Entity#10:namespaced
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"d"}
 ----
 =to=Node
 =labels=Array(3):
@@ -447,50 +573,53 @@ Edge
 =properties=JsonObject(1):
 {"name":"foo"}
 
+
+---===WITH GLOBALS===---
+# Graph
 Edge
-=type=7:PROJECT
+=type=4:ROOT
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#10:namespacec
+=from=Node
 =labels=Array(3):
 3:foo
 7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
-=to=Node
+=to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
-8:MProject
+6:MGroup
 =properties=JsonObject(1):
 {"name":"foo"}
 
 Edge
-=type=6:PARENT
+=type=7:PROJECT
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#10:namespacec
+=from=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
-=to=Entity#0:
+=to=Node
 =labels=Array(3):
 3:foo
 7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
-=type=5:NESTS
+=type=6:PARENT
 =properties=JsonObject(0):
 {}
 ----
@@ -499,58 +628,58 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"a"}
 ----
-=to=Entity#10:namespacec
+=to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
-=type=7:PROJECT
+=type=5:NESTS
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#10:namespaced
+=from=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
-=to=Node
+=to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
-8:MProject
+6:MGroup
 =properties=JsonObject(1):
-{"name":"foo"}
+{"name":"a"}
 
 Edge
 =type=6:PARENT
 =properties=JsonObject(0):
 {}
 ----
-=from=Entity#10:namespaced
+=from=Entity#10:namespacec
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"c"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
 =type=5:NESTS
@@ -562,43 +691,40 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
-=to=Entity#10:namespaced
+=to=Entity#10:namespacec
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
-
+=properties=JsonObject(1):
+{"name":"c"}
 
----===WITH GLOBALS===---
-# Graph
 Edge
-=type=4:ROOT
+=type=6:PARENT
 =properties=JsonObject(0):
 {}
 ----
-=from=Node
+=from=Entity#10:namespaced
 =labels=Array(3):
 3:foo
 7:MEntity
-8:MProject
+6:MGroup
 =properties=JsonObject(1):
-{"name":"foo"}
+{"name":"d"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
-=type=7:PROJECT
+=type=5:NESTS
 =properties=JsonObject(0):
 {}
 ----
@@ -607,16 +733,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
-=to=Node
+=to=Entity#10:namespaced
 =labels=Array(3):
 3:foo
 7:MEntity
-8:MProject
+6:MGroup
 =properties=JsonObject(1):
-{"name":"foo"}
+{"name":"d"}
 
 Edge
 =type=8:DECLARES
@@ -628,16 +754,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=10:INTRODUCES
@@ -649,8 +775,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -658,7 +784,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=7:DEFINES
@@ -670,16 +796,16 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 
 Edge
 =type=8:DECLARES
@@ -691,16 +817,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"c"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"c::Bar"}
+=properties=JsonObject(2):
+{"location":"Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=8:DECLARES
@@ -712,16 +838,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"d"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"d::Bar"}
+=properties=JsonObject(2):
+{"location":"Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=9:CLASSTYPE
@@ -734,7 +860,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -742,8 +868,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 
 Edge
 =type=5:CLASS
@@ -756,8 +882,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -765,7 +891,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=9:BOUNDTYPE
@@ -777,8 +903,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -786,8 +912,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(1):
+{"name":"Bar"}
 
 Edge
 =type=6:MCLASS
@@ -799,8 +925,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Bar","full_name":"a::b::Bar"}
+=properties=JsonObject(3):
+{"location":"a\/b\/Bar.class:5,1--100,10","is_intro":true,"name":"Bar"}
 ----
 =to=Entity#12:classa_b_bar
 =labels=Array(3):
@@ -808,7 +934,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"a::b::Bar","name":"Bar"}
+{"kind":"class","visibility":"public","name":"Bar","location":"a\/b\/Bar.class:5,1--100,10"}
 
 Edge
 =type=9:CLASSTYPE
@@ -821,7 +947,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -829,8 +955,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 
 Edge
 =type=5:CLASS
@@ -843,8 +969,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -852,7 +978,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 
 Edge
 =type=9:BOUNDTYPE
@@ -864,8 +990,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(3):
+{"location":"Baz.jar:1,1--1,1","is_intro":true,"name":"Baz"}
 ----
 =to=Entity#0:
 =labels=Array(4):
@@ -873,8 +999,8 @@ Edge
 7:MEntity
 5:MType
 10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
 
 Edge
 =type=6:MCLASS
@@ -886,8 +1012,8 @@ Edge
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(3):
+{"location":"Baz.jar:1,1--1,1","is_intro":true,"name":"Baz"}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -895,7 +1021,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 
 Edge
 =type=7:PROJECT
@@ -907,8 +1033,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
 ----
 =to=Node
 =labels=Array(3):
@@ -928,58 +1054,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-
-Edge
-=type=5:NESTS
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
-
-Edge
-=type=6:PARENT
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
 
 Edge
 =type=5:NESTS
@@ -991,16 +1075,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 
 Edge
 =type=7:PROJECT
@@ -1012,8 +1096,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a::b","name":"b"}
+=properties=JsonObject(1):
+{"name":"b"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1033,8 +1117,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"c"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1045,48 +1129,6 @@ Edge
 {"name":"foo"}
 
 Edge
-=type=6:PARENT
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#10:namespacec
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-
-Edge
-=type=5:NESTS
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-----
-=to=Entity#10:namespacec
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
-
-Edge
 =type=7:PROJECT
 =properties=JsonObject(0):
 {}
@@ -1096,8 +1138,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"d"}
 ----
 =to=Node
 =labels=Array(3):
@@ -1108,48 +1150,6 @@ Edge
 {"name":"foo"}
 
 Edge
-=type=6:PARENT
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#10:namespaced
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
-----
-=to=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-
-Edge
-=type=5:NESTS
-=properties=JsonObject(0):
-{}
-----
-=from=Entity#0:
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
-----
-=to=Entity#10:namespaced
-=labels=Array(3):
-3:foo
-7:MEntity
-6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
-
-Edge
 =type=8:DECLARES
 =properties=JsonObject(0):
 {}
@@ -1159,16 +1159,16 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 
 Edge
 =type=10:INTRODUCES
@@ -1180,8 +1180,8 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#8:classbaz
 =labels=Array(3):
@@ -1189,7 +1189,7 @@ Edge
 7:MEntity
 6:MClass
 =properties=JsonObject(4):
-{"kind":"class","visibility":"public","full_name":"Baz","name":"Baz"}
+{"kind":"class","visibility":"public","name":"Baz","location":"Baz.jar:1,1--1,1"}
 
 Edge
 =type=7:DEFINES
@@ -1201,15 +1201,15 @@ Edge
 3:foo
 7:MEntity
 7:MModule
-=properties=JsonObject(3):
-{"location":"\/dev\/null:1,1--1,1","name":"Bar","full_name":"Bar"}
+=properties=JsonObject(2):
+{"location":"a\/b\/Bar.java:1,1--1,1","name":"Bar"}
 ----
 =to=Entity#0:
 =labels=Array(3):
 3:foo
 7:MEntity
 9:MClassDef
-=properties=JsonObject(4):
-{"location":"\/dev\/null:1,1--1,1","is_intro":true,"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(3):
+{"location":"Baz.jar:1,1--1,1","is_intro":true,"name":"Baz"}
 
 
index d57edd6..21f7eef 100644 (file)
@@ -17,8 +17,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 
 Edge
 =type=7:PROJECT
@@ -30,8 +30,8 @@ Edge
 3:foo
 7:MEntity
 6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
 ----
 =to=Node
 =labels=Array(3):
diff --git a/tests/sav/neo_doxygen_namespace_members.res b/tests/sav/neo_doxygen_namespace_members.res
new file mode 100644 (file)
index 0000000..c785591
--- /dev/null
@@ -0,0 +1,346 @@
+# Graph
+Edge
+=type=4:ROOT
+=properties=JsonObject(0):
+{}
+----
+=from=Node
+=labels=Array(3):
+3:foo
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=7:PROJECT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Node
+=labels=Array(3):
+3:foo
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=6:PARENT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=5:NESTS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#12:namespacefoo
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=8:DECLARES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+
+Edge
+=type=10:INTRODUCES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+----
+=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"}
+
+Edge
+=type=7:DEFINES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(3):
+3:foo
+7:MEntity
+7:MModule
+=properties=JsonObject(2):
+{"location":"\/dev\/null:1,1--1,1","name":"foo"}
+----
+=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)"}
+
+Edge
+=type=7:DEFINES
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+8:MPropDef
+13:MAttributeDef
+=properties=JsonObject(3):
+{"location":"\/dev\/null:1,1--1,1","name":"bar","is_intro":true}
+----
+=to=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+9:MProperty
+10:MAttribute
+=properties=JsonObject(2):
+{"visibility":"public","name":"bar"}
+
+Edge
+=type=7:PROJECT
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#12:namespacefoo
+=labels=Array(3):
+3:foo
+7:MEntity
+6:MGroup
+=properties=JsonObject(1):
+{"name":"foo"}
+----
+=to=Node
+=labels=Array(3):
+3:foo
+7:MEntity
+8:MProject
+=properties=JsonObject(1):
+{"name":"foo"}
+
+Edge
+=type=9:CLASSTYPE
+=properties=JsonObject(0):
+{}
+----
+=from=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"}
+----
+=to=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+
+Edge
+=type=5:CLASS
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+----
+=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"}
+
+Edge
+=type=9:BOUNDTYPE
+=properties=JsonObject(0):
+{}
+----
+=from=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)"}
+----
+=to=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+5:MType
+10:MClassType
+=properties=JsonObject(1):
+{"name":"(self)"}
+
+Edge
+=type=6:MCLASS
+=properties=JsonObject(0):
+{}
+----
+=from=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)"}
+----
+=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"}
+
+Edge
+=type=10:INTRODUCES
+=properties=JsonObject(0):
+{}
+----
+=from=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)"}
+----
+=to=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+9:MProperty
+10:MAttribute
+=properties=JsonObject(2):
+{"visibility":"public","name":"bar"}
+
+Edge
+=type=14:INTRO_CLASSDEF
+=properties=JsonObject(0):
+{}
+----
+=from=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+9:MProperty
+10:MAttribute
+=properties=JsonObject(2):
+{"visibility":"public","name":"bar"}
+----
+=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)"}
+
+Edge
+=type=8:DECLARES
+=properties=JsonObject(0):
+{}
+----
+=from=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)"}
+----
+=to=Entity#0:
+=labels=Array(4):
+3:foo
+7:MEntity
+8:MPropDef
+13:MAttributeDef
+=properties=JsonObject(3):
+{"location":"\/dev\/null:1,1--1,1","name":"bar","is_intro":true}
+
+
index 980ce17..0856809 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:411)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
 11
 21
 31
index 980ce17..0856809 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:411)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
 11
 21
 31
index 980ce17..0856809 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:411)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
 11
 21
 31
diff --git a/tests/sav/test_file_read2.res b/tests/sav/test_file_read2.res
new file mode 100644 (file)
index 0000000..d830b19
--- /dev/null
@@ -0,0 +1,181 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
+
+---
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
+---
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
+---
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
+
+---
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
+---
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.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.
+
+var f = new IFStream.open("test_file_read.nit")
+var s: String
+while not f.eof do
+    s = f.read_line
+    printn(s)
+    printn("\n")
+end
+f.close
+
+f.reopen
+printn(f.read(10))
+printn("|")
+printn(f.read_all)
index b05a1b7..c4db140 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `E`, got `Bool` (../lib/standard/collection/array.nit:785)
+Runtime error: Cast failed. Expected `E`, got `Bool` (../lib/standard/collection/array.nit:786)
 NativeString
 N
 Nit
diff --git a/tests/test_file_read2.nit b/tests/test_file_read2.nit
new file mode 100644 (file)
index 0000000..bc2943b
--- /dev/null
@@ -0,0 +1,36 @@
+# 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.
+
+var f = new IFStream.open("test_file_read.nit")
+print f.read_all
+
+print "---"
+
+f = new IFStream.open("test_file_read.nit")
+print f.read_lines.join("\n")
+
+print "---"
+
+f = new IFStream.open("test_file_read.nit")
+print f.each_line.to_a.join("\n")
+
+print "---"
+
+var p = "test_file_read.nit".to_path
+
+print p.read_all
+print "---"
+print p.read_lines.join("\n")
+print "---"
+print p.each_line.to_a.join("\n")