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>
module brainfuck
# Interpreter for Brainfuck source code.
-class BFInterpret
+class BFInterpreter
# Data cells
var dr = new Array[Char]
# Data pointer
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
end
end
-var i = new BFInterpret(args[0])
+new BFInterpreter.from_file(args[0]).start
# 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}
# 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:
module doxml::compounddef
import memberdef
+import doxyname
import more_collections
# Processes the content of a `compounddef` element.
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
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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
import neo4j
import console
-import flush_stdout
# A storage medium for a graph.
#
#
# 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.
# For use in the implementation of `save_all` only.
protected fun show_done do
print "{term_rewind} Done."
- flush_stdout
end
end
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
#
# 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
# 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)
# 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
end
# The short (unqualified) name.
- #
- # May be also set by `full_name=`.
fun name=(name: String) do
self["name"] = name
end
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.
# 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).
#
super Compound
# The inner namespaces.
- #
- # Left empty for the root namespace.
var inner_namespaces: SimpleCollection[NamespaceRef] = new Array[NamespaceRef]
init do
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)
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
# 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
# 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.
# 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
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
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
import module_compound
import member
import inner_class
+import namespace_members
import graph
import class_compound
+import namespace_members
# A source file.
#
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
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
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
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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
import doxml
import graph_store
import console
-import flush_stdout
import opts
# An importation task.
else
printn "Reading {dir}... "
end
- flush_stdout
loop
for f in list_files(dir) do
var path = dir/f
else
print "{file_count} files read."
end
- flush_stdout
end
# List files in a directory.
# 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
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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import tests
+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
--- /dev/null
+/*/Makefile
+/*/.nx_config
For test scripts, see `../src/tests`. To regenerate the XML documents, run
`make`.
+
+## Required to Generate the XML documents
+
+* [Doxygen](http://www.doxygen.org/)
--- /dev/null
+# 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
--- /dev/null
+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.
# 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
--- /dev/null
+<!-- 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>
--- /dev/null
+<?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>
+
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
+
--- /dev/null
+<?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>
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"
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
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)
end
end
+ if verbose > 1 then print "Done testing: {task}"
+
self.results_count = c
end
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
redef fun rendering do
add """
</div>
-</body>
<div class="footer">
<div class="well well-sm">
<p class="text-muted text-center">
</p>
</div>
</div>
+</body>
</html>
"""
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
--- /dev/null
+all:
+ mkdir -p bin/
+ ../../bin/nitc --dir bin/ src/*.nit
--- /dev/null
+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
--- /dev/null
+# 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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import 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"])
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/
class MarkdownProcessor
# `MarkdownEmitter` used for ouput.
- var emitter: MarkdownEmitter is noinit
+ var emitter: MarkdownEmitter is noinit, protected writable
# Work in extended mode (default).
#
# 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
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 "<"
+ pos = -1
+ else if tag.is_html_unsafe then
+ is_valid = false
out.append "<"
if is_close_tag then out.add '/'
out.append tmp
if pos == -1 then return -1
end
if self[pos] == '>' then
- out.add '>'
+ if is_valid then
+ out.add '>'
+ else
+ out.append ">"
+ end
return pos
end
return -1
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
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
assert exp == res
end
+ fun test_escape_bad_html do
+ var test = "-1 if < , +1 if > and 0 otherwise"
+ var exp = "<p>-1 if < , +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 = """
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
# var x: Collection[U]
# # ...
# for u in x do
-# # u is a U
-# # ...
+# # u is a U
+# # ...
# end
# ~~~
#
# 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
# 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
# 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
# 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.
# 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.
# Resizable one dimension array of objects.
#
# Arrays have a literal representation.
+#
# var a = [12, 32, 8]
# # is equivalent with:
# var b = new Array[Int]
#
# 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
end
# Append `l` to `self` but clear `l`.
- ##
+ #
# O(1)
fun link(l: List[E])
do
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
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
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")
last_error = new IOError("Close failed due to error {sys.errno.strerror}")
end
_is_writable = false
+ _file = null
end
redef var is_writable = false
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`
# 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("/")
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)
# 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
# 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
# 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)
# 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`
# 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
#
# 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
# #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
# `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
#
# 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
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.
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
# * 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 "
#
# 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
#
# 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
#
# 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
# 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`.
# 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'
# 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')
# 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
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/
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).
border: 1px solid #ddd;
}
+pre code {
+ border: none;
+}
+
.navbar-default .navbar-toggle {
margin-top: 2px;
padding: 5px 10px;
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
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
# 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
# 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
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
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
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
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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
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
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
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
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
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
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"
# 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
# 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
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:
# 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
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
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
# 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
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
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)
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
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
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
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
# 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
# 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
# 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
# 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
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.")
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)
# `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.
# `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
# `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
# * 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`.
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
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)))
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
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"
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)
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
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
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
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
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
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
end
end
+ d2m.run_tests
+
return ts
end
end
module vm
import interpreter::naive_interpreter
-import model_utils
import perfect_hashing
redef class ModelBuilder
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
# 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
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)
# 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)
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
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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import 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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import 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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import 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
--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
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
nitpretty_args
hamming_number
hailstone
+test_map
+nitls
+nituml
--- /dev/null
+1
+2
+4
+10
+20
+40
+
+4
+40
--- /dev/null
+
+1
+2
+2
+
+1
+
+3
+3
--- /dev/null
+alt/error_defs_init_1alt1_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt1_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt2_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt2_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt3_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt3_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt4_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt4_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt5_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt5_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt5_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt6_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt6_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt6_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt7_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt7_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
--- /dev/null
+alt/error_defs_init_1alt7_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
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
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):
13:empty-project
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
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):
13:empty-project
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"empty-project"}
+=properties=JsonObject(1):
+{"name":"empty-project"}
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):
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
Edge
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
----
=to=Node
=labels=Array(3):
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):
{}
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
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
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
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
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
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
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
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
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
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
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
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
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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
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):
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
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
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):
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
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):
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
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):
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):
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
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):
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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):
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
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
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):
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
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):
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
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
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):
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
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
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
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):
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
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):
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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
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):
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
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
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):
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
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):
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
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
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):
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
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):
=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
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
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):
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
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
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):
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
Edge
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
----
=to=Node
=labels=Array(3):
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):
{}
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
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
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
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
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
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
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
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
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
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
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
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
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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
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):
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
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
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):
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
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):
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
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):
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):
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
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):
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"B","full_name":"org::example::foo::B"}
+=properties=JsonObject(1):
+{"name":"B"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"A","full_name":"org::example::foo::A"}
+=properties=JsonObject(1):
+{"name":"A"}
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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):
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
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
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):
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
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):
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
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
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):
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
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"EmptyClass","full_name":"org::example::foo::EmptyClass"}
+=properties=JsonObject(1):
+{"name":"EmptyClass"}
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
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):
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
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):
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):
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
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"C","full_name":"org::example::foo::C"}
+=properties=JsonObject(1):
+{"name":"C"}
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
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):
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
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
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):
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
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):
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
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
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):
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
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):
=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
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
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):
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
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
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):
14:root-namespace
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"root-namespace"}
+=properties=JsonObject(1):
+{"name":"root-namespace"}
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Foo","full_name":"Foo"}
+=properties=JsonObject(1):
+{"name":"Foo"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Foo","full_name":"Foo"}
+=properties=JsonObject(1):
+{"name":"Foo"}
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
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
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
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===---
11:inner-class
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"inner-class"}
+=properties=JsonObject(1):
+{"name":"inner-class"}
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):
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass","full_name":"OuterClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass"}
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
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):
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
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
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):
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
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):
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
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
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass::InnerClass"}
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"OuterClass::InnerClass","full_name":"OuterClass::InnerClass"}
+=properties=JsonObject(1):
+{"name":"OuterClass::InnerClass"}
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
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
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
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
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
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===---
--- /dev/null
+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===---
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
Edge
=type=7:PROJECT
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
----
=to=Node
=labels=Array(3):
{"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):
{}
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
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):
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
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
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
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
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):
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
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):
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
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):
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
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
Edge
=type=5:CLASS
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
Edge
=type=6:MCLASS
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):
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
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
----
=to=Node
=labels=Array(3):
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
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):
{}
----
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):
=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):
{}
----
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
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):
{}
----
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
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
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):
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
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
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
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
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):
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
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):
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
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):
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
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
Edge
=type=5:CLASS
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):
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
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):
7:MEntity
5:MType
10:MClassType
-=properties=JsonObject(2):
-{"name":"Baz","full_name":"Baz"}
+=properties=JsonObject(1):
+{"name":"Baz"}
Edge
=type=6:MCLASS
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):
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
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"a","name":"a"}
+=properties=JsonObject(1):
+{"name":"a"}
----
=to=Node
=labels=Array(3):
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
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
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):
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"c","name":"c"}
+=properties=JsonObject(1):
+{"name":"c"}
----
=to=Node
=labels=Array(3):
{"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):
{}
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"d","name":"d"}
+=properties=JsonObject(1):
+{"name":"d"}
----
=to=Node
=labels=Array(3):
{"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):
{}
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
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):
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
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"}
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
Edge
=type=7:PROJECT
3:foo
7:MEntity
6:MGroup
-=properties=JsonObject(2):
-{"full_name":"","name":"foo"}
+=properties=JsonObject(1):
+{"name":"foo"}
----
=to=Node
=labels=Array(3):
--- /dev/null
+# 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}
+
+
-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
-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
-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
--- /dev/null
+# 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)
-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
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+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")