private void ResolveStateVariables() { ResolutionHelper resolutionHelper = new ResolutionHelper(context); List <ContractDefinition> sortedContracts = resolutionHelper.TopologicalSortByDependency(context.ContractDefinitions); foreach (ContractDefinition contract in sortedContracts) { // create a deep copy List <int> linearizedBaseContractIds = new List <int>(contract.LinearizedBaseContracts); linearizedBaseContractIds.Reverse(); foreach (int id in linearizedBaseContractIds) { ContractDefinition baseContract = context.GetASTNodeById(id) as ContractDefinition; Debug.Assert(baseContract != null); if (baseContract == contract) { HashSet <VariableDeclaration> stateVars = context.GetStateVarsByContract(contract); foreach (VariableDeclaration stateVar in stateVars) { string name = stateVar.Name; context.AddStateVarToDynamicType(name, contract, stateVar); } } else { HashSet <VariableDeclaration> stateVars = context.GetStateVarsByContract(baseContract); foreach (VariableDeclaration stateVar in stateVars) { if (stateVar.Visibility == EnumVisibility.PRIVATE) { continue; } string name = stateVar.Name; context.AddStateVarToDynamicType(name, contract, stateVar); } } } } // PrintStateVarResolutionMap(); }
private List <BoogieVariable> CollectLocalVars(ContractDefinition contract) { List <ContractDefinition> contracts = new List <ContractDefinition>() { contract }; if (context.TranslateFlags.TxnsOnFields) { HashSet <VariableDeclaration> contractFields = context.GetStateVarsByContract(contract); foreach (VariableDeclaration contractField in contractFields) { if (contractField.TypeDescriptions.IsContract() && contractField.TypeName is UserDefinedTypeName) { String fieldContractName = contractField.TypeName.ToString(); ContractDefinition fieldDef = context.GetContractByName(fieldContractName); contracts.Add(fieldDef); } } } return(TransUtils.CollectLocalVars(contracts, context)); }