Predicate GetOrCreatePredicate(ParsedPredicateReferenceExpression parsedPred, Dictionary<string, KAOSTools.MetaModel.Entity> declarations) { var idOrName = parsedPred.PredicateSignature; Predicate predicate; if (idOrName is NameExpression) predicate = model.Predicates().SingleOrDefault (t => t.Name == idOrName.Value); else if (idOrName is IdentifierExpression) predicate = model.Predicates().SingleOrDefault (t => t.Identifier == idOrName.Value); else throw new NotImplementedException (idOrName.GetType().Name + " is not yet supported"); if (predicate == null) { if (idOrName is NameExpression) predicate = new Predicate(model) { Name = idOrName.Value, Implicit = true }; else if (idOrName is IdentifierExpression) predicate = new Predicate(model) { Identifier = idOrName.Value, Implicit = true }; else throw new NotImplementedException (); foreach (var arg in parsedPred.ActualArguments) { predicate.Arguments.Add (new PredicateArgument() { Name = arg, Type = declarations[arg] }); } model.Add (predicate); Declarations.Add (predicate, new List<Declaration> () { new Declaration (idOrName.Line, idOrName.Col, idOrName.Filename, relativePath, DeclarationType.Reference) }); } else { // Check that same number of arguments are used (if none is already declared) if (predicate.Arguments.Count > 0 && parsedPred.ActualArguments.Count != predicate.Arguments.Count) { throw new CompilationException ("Predicate '" + idOrName.Value + "' arguments mismatch. " + "Expect " + predicate.Arguments.Count + " arguments but " + parsedPred.ActualArguments.Count + " received."); } else { // Check that arguments match the declared type (if none is already declared) if (predicate.Arguments.Count > 0) { for (int i = 0; i < parsedPred.ActualArguments.Count; i++) { var parsedArg = parsedPred.ActualArguments[i]; if (!declarations[parsedArg].Ancestors().Contains(predicate.Arguments[i].Type)) { throw new BuilderException ("Predicate '" + idOrName + "' arguments mismatch. " + "Argument '" + parsedArg + "' is type '" + declarations[parsedArg].FriendlyName + "' " + "but type '" + predicate.Arguments[i].Type.FriendlyName + "' is expected. Make sure that you do not mix names and identifiers.", parsedPred.Filename, parsedPred.Line, parsedPred.Col); } } } // Otherwise, create all needed arguments else { for (int i = 0; i < parsedPred.ActualArguments.Count; i++) { var parsedArg = parsedPred.ActualArguments[i]; predicate.Arguments.Add (new PredicateArgument () { Name = parsedArg, Type = declarations[parsedArg] }); } } } Declarations[predicate].Add ( new Declaration (idOrName.Line, idOrName.Col, idOrName.Filename, relativePath, DeclarationType.Reference) ); } return predicate; }
Predicate GetOrCreatePredicate(ParsedPredicateReferenceExpression parsedPred, Dictionary <string, KAOSTools.Core.Entity> declarations) { var idOrName = parsedPred.PredicateSignature; Predicate predicate; if (idOrName is NameExpression) { predicate = model.Predicates().SingleOrDefault(t => t.Name == idOrName.Value); } else if (idOrName is IdentifierExpression) { predicate = model.Predicates().SingleOrDefault(t => t.Identifier == idOrName.Value); } else { throw new NotImplementedException(idOrName.GetType().Name + " is not yet supported"); } if (predicate == null) { if (idOrName is NameExpression) { predicate = new Predicate(model) { Name = idOrName.Value, Implicit = true } } ; else if (idOrName is IdentifierExpression) { predicate = new Predicate(model) { Identifier = idOrName.Value, Implicit = true } } ; else { throw new NotImplementedException(); } foreach (var arg in parsedPred.ActualArguments) { predicate.Arguments.Add(new PredicateArgument() { Name = arg, Type = declarations[arg] }); } model.Add(predicate); } else { // Check that same number of arguments are used (if none is already declared) if (predicate.Arguments.Count > 0 && parsedPred.ActualArguments.Count != predicate.Arguments.Count) { throw new BuilderException("Predicate '" + idOrName.Value + "' arguments mismatch. " + "Expect " + predicate.Arguments.Count + " arguments but " + parsedPred.ActualArguments.Count + " received.", parsedPred.Filename, parsedPred.Line, parsedPred.Col); } else { // Check that arguments match the declared type (if none is already declared) if (predicate.Arguments.Count > 0) { for (int i = 0; i < parsedPred.ActualArguments.Count; i++) { var parsedArg = parsedPred.ActualArguments[i]; if (!declarations[parsedArg].Ancestors().Contains(predicate.Arguments[i].Type)) { throw new BuilderException("Predicate '" + idOrName + "' arguments mismatch. " + "Argument '" + parsedArg + "' is type '" + declarations[parsedArg].FriendlyName + "' " + "but type '" + predicate.Arguments[i].Type.FriendlyName + "' is expected. Make sure that you do not mix names and identifiers.", parsedPred.Filename, parsedPred.Line, parsedPred.Col); } } } // Otherwise, create all needed arguments else { for (int i = 0; i < parsedPred.ActualArguments.Count; i++) { var parsedArg = parsedPred.ActualArguments[i]; predicate.Arguments.Add(new PredicateArgument() { Name = parsedArg, Type = declarations[parsedArg] }); } } } } return(predicate); }