public void ExtractData(AST root) { if (root is IProcedureList) { foreach (Procedure procedure in root as IProcedureList) { Procedures.AddProcedure(procedure); } foreach (Procedure procedure in root as IProcedureList) { ExtractProcedure(procedure); } foreach (Procedure procedure in Procedures) { IProcedureList calledProcedures = CallsTable.GetCalledBy(procedure); if (calledProcedures.GetSize() == 0) { ExtractProcedureCalls(procedure); } } ExtractAffects(); } }
private void ExtractCall(Call call, Procedure procedureContext) { Procedure calledProcedure = Procedures.GetProcedureByName(call.ProcedureName); call.Procedure = calledProcedure; CallsTable.SetCalls(procedureContext, calledProcedure); if (!calls.ContainsKey(procedureContext)) { calls[procedureContext] = new List <Call>(); } calls[procedureContext].Add(call); }
private void ExtractProcedureCalls(Procedure procedure) { IProcedureList callingProcedures = CallsTable.GetCalling(procedure); foreach (Procedure callingProcedure in callingProcedures) { List <Call> procedureCalls = calls[callingProcedure].Where(x => x.Procedure == procedure).ToList(); foreach (Call call in procedureCalls) { IStatementList callParents = ParentTable.GetParentT(call); IVariableList modifiedVariables = ModifiesTable.GetModifiedBy(procedure); IVariableList usedVariables = UsesTable.GetUsedBy(procedure); foreach (Variable variable in modifiedVariables) { ModifiesTable.SetModifies(call, variable); ModifiesTable.SetModifies(callingProcedure, variable); foreach (Statement parent in callParents) { ModifiesTable.SetModifies(parent, variable); } } foreach (Variable variable in usedVariables) { UsesTable.SetUses(call, variable); UsesTable.SetUses(callingProcedure, variable); foreach (Statement parent in callParents) { UsesTable.SetUses(parent, variable); } } ExtractProcedureCalls(callingProcedure); } } }