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; }
Relation GetOrCreateRelation(ParsedInRelationExpression rel, Dictionary <string, KAOSTools.Core.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); } 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 BuilderException("Relation and formal spec are incompatible.", rel.Filename, rel.Line, rel.Col); } } } return(type); }