test_neo: Fix error when mparameter is duplicated
[nit.git] / src / neo.nit
index f0e2911..15b1de6 100644 (file)
 #
 # Note : All nodes described here are MEntities.
 #
-# `MProject`
+# `MPackage`
 #
-# * labels: `MProject`, `model_name` and `MEntity`.
-# * `(:MProject)-[:ROOT]->(:MGroup)`: root of the group tree.
+# * labels: `MPackage`, `model_name` and `MEntity`.
+# * `(:MPackage)-[:ROOT]->(:MGroup)`: root of the group tree.
 #
 # `MGroup`
 #
 # * labels: `MGroup`, `model_name` and `MEntity`.
-# * `(:MGroup)-[:PROJECT]->(:MProject)`: associated project.
+# * `(:MGroup)-[:PROJECT]->(:MPackage)`: associated package.
 # * `(:MGroup)-[:PARENT]->(:MGroup)`: parent group. Does not exist for the root
 # group.
 # * `(:MGroup)-[:DECLARES]->(:MModule)`: modules that are direct children of
@@ -233,9 +233,9 @@ class NeoModel
        fun load(model: Model): Model do
                var nodes: Array[NeoNode]
 
-               toolcontext.info("Loading project node...", 1)
-               nodes = client.nodes_with_labels([model_name, "MProject"])
-               for node in nodes do to_mproject(model, node)
+               toolcontext.info("Loading package node...", 1)
+               nodes = client.nodes_with_labels([model_name, "MPackage"])
+               for node in nodes do to_mpackage(model, node)
                toolcontext.info("Loading groups...", 1)
                nodes = client.nodes_with_labels([model_name, "MGroup"])
                for node in nodes do to_mgroup(model, node)
@@ -304,9 +304,9 @@ class NeoModel
 
        # Collect all nodes from the current `model`.
        private fun collect_model_nodes(model: Model): Collection[NeoNode] do
-               for mproject in model.mprojects do
-                       to_node(mproject)
-                       for mgroup in mproject.mgroups do to_node(mgroup)
+               for mpackage in model.mpackages do
+                       to_node(mpackage)
+                       for mgroup in mpackage.mgroups do to_node(mgroup)
                end
                return nodes.values
        end
@@ -332,7 +332,7 @@ class NeoModel
        # `mentities` are stored locally to avoid duplication.
        fun to_node(mentity: MEntity): NeoNode do
                if nodes.has_key(mentity) then return nodes[mentity]
-               if mentity isa MProject then return mproject_node(mentity)
+               if mentity isa MPackage then return mpackage_node(mentity)
                if mentity isa MGroup then return mgroup_node(mentity)
                if mentity isa MModule then return mmodule_node(mentity)
                if mentity isa MClass then return mclass_node(mentity)
@@ -346,7 +346,7 @@ class NeoModel
 
        # Get the `MEntity` associated with `node`.
        fun to_mentity(model: Model, node: NeoNode): MEntity do
-               if node.labels.has("MProject") then return to_mproject(model, node)
+               if node.labels.has("MPackage") then return to_mpackage(model, node)
                if node.labels.has("MGroup") then return to_mgroup(model, node)
                if node.labels.has("MModule") then return to_mmodule(model, node)
                if node.labels.has("MClass") then return to_mclass(model, node)
@@ -365,37 +365,43 @@ class NeoModel
                node.labels.add "MEntity"
                node.labels.add model_name
                node["name"] = mentity.name
-               if mentity.mdoc != null then
-                       node["mdoc"] = new JsonArray.from(mentity.mdoc.content)
-                       node["mdoc_location"] = mentity.mdoc.location.to_s
+               if not mentity isa MSignature then
+                       #FIXME: MSignature is a MEntity, but has no model :/
+                       node["location"] = mentity.location.to_s
+               end
+               var mdoc = mentity.mdoc
+               if mdoc != null then
+                       node["mdoc"] = new JsonArray.from(mdoc.content)
+                       node["mdoc_location"] = mdoc.location.to_s
                end
                return node
        end
 
-       # Build a `NeoNode` representing `mproject`.
-       private fun mproject_node(mproject: MProject): NeoNode do
-               var node = make_node(mproject)
-               node.labels.add "MProject"
-               var root = mproject.root
+       # Build a `NeoNode` representing `mpackage`.
+       private fun mpackage_node(mpackage: MPackage): NeoNode do
+               var node = make_node(mpackage)
+               node.labels.add "MPackage"
+               var root = mpackage.root
                if root != null then
                        node.out_edges.add(new NeoEdge(node, "ROOT", to_node(root)))
                end
                return node
        end
 
-       # Build a new `MProject` from a `node`.
+       # Build a new `MPackage` from a `node`.
        #
-       # REQUIRE `node.labels.has("MProject")`
-       private fun to_mproject(model: Model, node: NeoNode): MProject do
+       # REQUIRE `node.labels.has("MPackage")`
+       private fun to_mpackage(model: Model, node: NeoNode): MPackage do
                var m = mentities.get_or_null(node.id.as(Int))
-               if m isa MProject then return m
+               if m isa MPackage then return m
 
-               assert node.labels.has("MProject")
-               var mproject = new MProject(node["name"].to_s, model)
-               mentities[node.id.as(Int)] = mproject
-               set_doc(node, mproject)
-               mproject.root = to_mgroup(model, node.out_nodes("ROOT").first)
-               return mproject
+               assert node.labels.has("MPackage")
+               var location = to_location(node["location"].to_s)
+               var mpackage = new MPackage(node["name"].to_s, model, location)
+               mentities[node.id.as(Int)] = mpackage
+               set_doc(node, mpackage)
+               mpackage.root = to_mgroup(model, node.out_nodes("ROOT").first)
+               return mpackage
        end
 
        # Build a `NeoNode` representing `mgroup`.
@@ -403,7 +409,7 @@ class NeoModel
                var node = make_node(mgroup)
                node.labels.add "MGroup"
                var parent = mgroup.parent
-               node.out_edges.add(new NeoEdge(node, "PROJECT", to_node(mgroup.mproject)))
+               node.out_edges.add(new NeoEdge(node, "PROJECT", to_node(mgroup.mpackage)))
                if parent != null then
                        node.out_edges.add(new NeoEdge(node, "PARENT", to_node(parent)))
                end
@@ -424,13 +430,14 @@ class NeoModel
                if m isa MGroup then return m
 
                assert node.labels.has("MGroup")
-               var mproject = to_mproject(model, node.out_nodes("PROJECT").first)
+               var location = to_location(node["location"].to_s)
+               var mpackage = to_mpackage(model, node.out_nodes("PROJECT").first)
                var parent: nullable MGroup = null
                var out = node.out_nodes("PARENT")
                if not out.is_empty then
                        parent = to_mgroup(model, out.first)
                end
-               var mgroup = new MGroup(node["name"].to_s, mproject, parent)
+               var mgroup = new MGroup(node["name"].to_s, location, mpackage, parent)
                mentities[node.id.as(Int)] = mgroup
                set_doc(node, mgroup)
                return mgroup
@@ -440,7 +447,6 @@ class NeoModel
        private fun mmodule_node(mmodule: MModule): NeoNode do
                var node = make_node(mmodule)
                node.labels.add "MModule"
-               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)))
                end
@@ -504,6 +510,7 @@ class NeoModel
                assert node.labels.has("MClass")
                var mmodule = to_mmodule(model, node.in_nodes("INTRODUCES").first)
                var name = node["name"].to_s
+               var location = to_location(node["location"].to_s)
                var kind = to_kind(node["kind"].to_s)
                var visibility = to_visibility(node["visibility"].to_s)
                var parameter_names = new Array[String]
@@ -512,7 +519,7 @@ class NeoModel
                                parameter_names.add e.to_s
                        end
                end
-               var mclass = new MClass(mmodule, name, parameter_names, kind, visibility)
+               var mclass = new MClass(mmodule, name, location, parameter_names, kind, visibility)
                mentities[node.id.as(Int)] = mclass
                set_doc(node, mclass)
                return mclass
@@ -522,7 +529,6 @@ class NeoModel
        private fun mclassdef_node(mclassdef: MClassDef): NeoNode do
                var node = make_node(mclassdef)
                node.labels.add "MClassDef"
-               node["location"] = mclassdef.location.to_s
                node.out_edges.add(new NeoEdge(node, "BOUNDTYPE", to_node(mclassdef.bound_mtype)))
                node.out_edges.add(new NeoEdge(node, "MCLASS", to_node(mclassdef.mclass)))
                for mproperty in mclassdef.intro_mproperties do
@@ -590,18 +596,19 @@ class NeoModel
                assert node.labels.has("MProperty")
                var intro_mclassdef = to_mclassdef(model, node.out_nodes("INTRO_CLASSDEF").first)
                var name = node["name"].to_s
+               var location = to_location(node["location"].to_s)
                var visibility = to_visibility(node["visibility"].to_s)
                var mprop: nullable MProperty = null
                if node.labels.has("MMethod") then
-                       mprop = new MMethod(intro_mclassdef, name, visibility)
+                       mprop = new MMethod(intro_mclassdef, name, location, visibility)
                        mprop.is_init = node["is_init"].as(Bool)
                else if node.labels.has("MAttribute") then
-                       mprop = new MAttribute(intro_mclassdef, name, visibility)
+                       mprop = new MAttribute(intro_mclassdef, name, location, visibility)
                else if node.labels.has("MVirtualTypeProp") then
-                       mprop = new MVirtualTypeProp(intro_mclassdef, name, visibility)
+                       mprop = new MVirtualTypeProp(intro_mclassdef, name, location, visibility)
                else if node.labels.has("MInnerClass") then
                        var inner = to_mclass(model, node.out_nodes("NESTS").first)
-                       mprop = new MInnerClass(intro_mclassdef, name, visibility, inner)
+                       mprop = new MInnerClass(intro_mclassdef, name, location, visibility, inner)
                end
                if mprop == null then
                        print "not yet implemented to_mproperty for {node.labels.join(",")}"
@@ -616,7 +623,6 @@ class NeoModel
        private fun mpropdef_node(mpropdef: MPropDef): NeoNode do
                var node = make_node(mpropdef)
                node.labels.add "MPropDef"
-               node["location"] = mpropdef.location.to_s
                node.out_edges.add(new NeoEdge(node, "DEFINES", to_node(mpropdef.mproperty)))
                if mpropdef isa MMethodDef then
                        node.labels.add "MMethodDef"
@@ -718,7 +724,7 @@ class NeoModel
                        var rank = 0
                        for mparameter in mtype.mparameters do
                                names.add mparameter.name
-                               var pnode = mparameter_node(mparameter)
+                               var pnode = to_node(mparameter)
                                pnode["rank"] = rank
                                node.out_edges.add(new NeoEdge(node, "PARAMETER", pnode))
                                rank += 1
@@ -845,7 +851,6 @@ class NeoModel
                node.labels.add "MParameter"
                node["name"] = mparameter.name
                node["is_vararg"] = mparameter.is_vararg
-               node["is_default"] = mparameter.is_default
                node.out_edges.add(new NeoEdge(node, "TYPE", to_node(mparameter.mtype)))
                return node
        end
@@ -861,29 +866,14 @@ class NeoModel
                var name = node["name"].to_s
                var mtype = to_mtype(model, node.out_nodes("TYPE").first)
                var is_vararg = node["is_vararg"].as(Bool)
-               var is_default = node["is_default"].as(Bool)
-               var mparameter = new MParameter(name, mtype, is_vararg, is_default)
+               var mparameter = new MParameter(name, mtype, is_vararg)
                mentities[node.id.as(Int)] = mparameter
                return mparameter
        end
 
        # Get a `Location` from its string representation.
-       private fun to_location(loc: String): Location do
-               #TODO filepath
-               var parts = loc.split_with(":")
-               var file = new SourceFile.from_string(parts[0], "")
-               if parts.length == 1 then
-                       return new Location(file, 0, 0, 0, 0)
-               end
-               var pos = parts[1].split_with("--")
-               var pos1 = pos[0].split_with(",")
-               var pos2 = pos[1].split_with(",")
-               var line_s = pos1[0].to_i
-               var line_e = pos2[0].to_i
-               var column_s = pos1[1].to_i
-               var column_e = 0
-               if pos2.length == 2 then pos2[1].to_i
-               return new Location(file, line_s, line_e, column_s, column_e)
+       private fun to_location(loc: String): nitc::Location do
+               return new nitc::Location.from_string(loc)
        end
 
        # Get a `MVisibility` from its string representation.