private bool PropagateRuleTypes(IRFact fact) { bool updated = false; PropagateSignatureIfRequired(fact.Database.Name, FunctionType.Database, fact.Elements, ref updated); return(updated); }
private void VerifyIRFact(IRFact fact) { if (fact.Database == null) { return; } var db = Context.LookupSignature(fact.Database.Name); if (db == null) { Context.Log.Error(fact.Location, DiagnosticCode.UnresolvedSymbol, "Database \"{0}\" could not be resolved", fact.Database.Name); return; } if (db.Type != FunctionType.Database && db.Type != FunctionType.Call && db.Type != FunctionType.SysCall && db.Type != FunctionType.Proc) { Context.Log.Error(fact.Location, DiagnosticCode.InvalidSymbolInFact, "Init/Exit actions can only reference databases, calls and PROCs; \"{0}\" is a {1}", fact.Database.Name, db.Type); return; } if (fact.Not) { db.Deleted = true; } else { db.Inserted = true; } int index = 0; foreach (var param in db.Params) { var ele = fact.Elements[index]; index++; if (ele.Type == null) { Context.Log.Error(ele.Location, DiagnosticCode.InternalError, "No type information available for fact argument"); continue; } VerifyParamCompatibility(db, index, param, ele); } }
private IRFact ASTFactToIR(ASTFact astFact) { var fact = new IRFact { Database = new IRSymbolRef(new FunctionNameAndArity(astFact.Database, astFact.Elements.Count)), Not = astFact.Not, Elements = new List <IRConstant>(astFact.Elements.Count), Location = astFact.Location }; foreach (var element in astFact.Elements) { fact.Elements.Add(ASTConstantToIR(element)); } return(fact); }
private IRFact ASTFactToIR(IRGoal goal, ASTBaseFact astFact) { if (astFact is ASTFact) { var f = astFact as ASTFact; var fact = new IRFact { Database = new IRSymbolRef(new FunctionNameAndArity(f.Database, f.Elements.Count)), Not = f.Not, Elements = new List <IRConstant>(f.Elements.Count), Goal = null, Location = f.Location }; foreach (var element in f.Elements) { fact.Elements.Add(ASTConstantToIR(element)); } return(fact); } else if (astFact is ASTGoalCompletedFact) { var f = astFact as ASTGoalCompletedFact; return(new IRFact { Database = null, Not = false, Elements = new List <IRConstant>(), Goal = goal, Location = f.Location }); } else { throw new InvalidOperationException("Cannot convert unknown AST fact type to IR"); } }
private void PropagateRuleTypes(IRFact fact) { PropagateSignatureIfRequired(fact.Database.Name, FunctionType.Database, fact.Elements); }