示例#1
0
        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;
        }
示例#2
0
        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);
        }