X-Git-Url: http://nitlanguage.org diff --git a/src/neo.nit b/src/neo.nit index f0e2911..15b1de6 100644 --- a/src/neo.nit +++ b/src/neo.nit @@ -35,15 +35,15 @@ # # 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.