Exemplo n.º 1
0
        Relation GetOrCreateRelation(ParsedInRelationExpression rel, Dictionary<string, KAOSTools.MetaModel.Entity> declarations)
        {
            dynamic identifierOrName = rel.Relation;

            Relation type;
            if (identifierOrName is NameExpression) {
                type = model.Relations().SingleOrDefault (t => t.Name == identifierOrName.Value);

            } else if (identifierOrName is IdentifierExpression) {
                type = model.Relations().SingleOrDefault (t => t.Identifier == identifierOrName.Value);

            } else {
                throw new NotImplementedException ();
            }

            if (type == null) {
                if (identifierOrName is NameExpression) {
                    type = new Relation(model) { Name = identifierOrName.Value, Implicit = true };
                } else if (identifierOrName is IdentifierExpression) {
                    type = new Relation(model) { Identifier = identifierOrName.Value, Implicit = true };
                }

                foreach (var arg in rel.Variables) {
                    type.Links.Add (new Link(model) { Target = declarations[arg] });
                }

                model.Add (type);

                Declarations.Add (type, new List<Declaration> () {
                    new Declaration (identifierOrName.Line, identifierOrName.Col, identifierOrName.Filename, relativePath, DeclarationType.Reference)
                });
            } else {
                // Check that types matches
                // TODO make this shit more robust. In the case of two links to a same entity, this
                // check will fail...
                foreach (var arg in rel.Variables) {
                    if (type.Links.Count(x => x.Target == declarations[arg]) == 0) {
                        throw new CompilationException ("Relation and formal spec are incompatible.");
                    }
                }
                Declarations[type].Add (
                    new Declaration (identifierOrName.Line, identifierOrName.Col, identifierOrName.Filename, relativePath, DeclarationType.Reference)
                    );

             }

            return type;
        }
Exemplo n.º 2
0
 public static MvcHtmlString GetLink(this HtmlHelper helper, Relation relation)
 {
     return helper.ActionLink (relation.FriendlyName, "GoalModel");
 }