private IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition> CreateParameters(AnalysisNet.Types.MethodDefinition methodDefinition, Mono.Cecil.MethodDefinition methodDef) { IDictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition> parameterDefinitions = new Dictionary <AnalysisNet.ThreeAddressCode.Values.IVariable, Cecil.ParameterDefinition>(); for (int idx = 0; idx < methodDefinition.Parameters.Count; idx++) { AnalysisNet.Types.MethodParameter methodParameter = methodDefinition.Parameters.ElementAt(idx); //if (methodParameter.Name.Equals("this")) // continue; Cecil.ParameterDefinition paramDef = new Cecil.ParameterDefinition(ReferenceGenerator.TypeReference(methodParameter.Type)); if (methodParameter.DefaultValue != null) { paramDef.Constant = methodParameter.DefaultValue.Value; paramDef.HasDefault = true; } if (methodParameter.Kind == AnalysisNet.Types.MethodParameterKind.In) { paramDef.IsIn = true; } else if (methodParameter.Kind == AnalysisNet.Types.MethodParameterKind.Out) { paramDef.IsOut = true; } methodDef.Parameters.Add(paramDef); // map body parameters to cecil parameters if (methodDefinition.HasBody && methodDefinition.Body.Parameters.Count > 0) { // body parameters contain 'this' while analysis-net's parameters do not int localIdx = (methodDefinition.IsStatic ? 0 : 1) + idx; AnalysisNet.ThreeAddressCode.Values.IVariable localVariable = methodDefinition.Body.Parameters.ElementAt(localIdx); parameterDefinitions[localVariable] = paramDef; } } return(parameterDefinitions); }
private void ExtractParameters(IList <AnalysisNet.Types.MethodParameter> dest, IEnumerable <Cecil.ParameterDefinition> source) { foreach (Cecil.ParameterDefinition parameterdef in source) { string name = parameterdef.Name; AnalysisNet.Types.IType type = ExtractType(parameterdef.ParameterType); AnalysisNet.Types.MethodParameter parameter = new AnalysisNet.Types.MethodParameter((ushort)parameterdef.Index, name, type); ExtractCustomAttributes(parameter.Attributes, parameterdef.CustomAttributes); if (parameterdef.HasConstant) { parameter.DefaultValue = new AnalysisNet.ThreeAddressCode.Values.Constant(parameterdef.Constant) { Type = parameter.Type }; } parameter.Kind = GetMethodParameterKind(parameterdef); dest.Add(parameter); } }