private BfMethod GetBfMethod(MethodReference methodReference) { var bfType = _cache.GetBfType(((TypeSpecification)methodReference.DeclaringType).ElementType); var hashSet = new HashSet <string>(); BfMethod bfMethod = null; if (bfType != null) { bfType.GetTypeDefinition().GenericParameters.ForEach(g => hashSet.Add(g.FullName)); MethodReference definition = null; var list = new List <MethodReference>(); list.AddRange(bfType.GetTypeDefinition().Methods); foreach (var reference in list) { var methodDefinition = (MethodDefinition)reference; if (methodDefinition.Name == methodReference.Name && methodDefinition.Parameters.Count == methodReference.Parameters.Count) { var flag = true; for (var index = 0; index < methodDefinition.Parameters.Count; ++index) { var parameterDefinition = methodDefinition.Parameters[index]; var parameterReference = methodReference.Parameters[index]; if (hashSet.Contains(BfCache.GetTypeReference(parameterDefinition.ParameterType).FullName)) { if (!parameterReference.ToString().StartsWith("A_")) { flag = false; } } else if (Regex.Replace(parameterReference.ParameterType.FullName, "<[^>]*>", "") != Regex.Replace(parameterDefinition.ParameterType.FullName, "<[^>]*>", "")) { flag = false; } } if (flag) { definition = methodDefinition; } } } if (definition == null) { } else { GetSignature(definition); // ??? bfMethod = _cache.GetBfMethod(definition); } } return(bfMethod); }
internal BfMethod GetBfMethod(MethodReference methodReference) { BfMethod bfMethod = null; var bfAssembly = GetAssembly(methodReference, methodReference.DeclaringType.Scope as AssemblyNameReference); if (bfAssembly != null) { var key = BfMethod.GetSignature(methodReference); BfMethod method; bfAssembly.GetMethodsDictionary().TryGetValue(key, out method); if (method == null) { var type = GetBfType(methodReference.DeclaringType); var list = new List <MethodDefinition>(); if (type != null) { list.AddRange(type.GetTypeDefinition().Methods); var methodDef = list.FirstOrDefault(m => key == BfMethod.GetSignature(m)); if (methodDef != null) { method = new BfMethod(this, methodDef, type); Methods.Add(method); type.Methods.Add(method); bfAssembly.GetMethodsDictionary().Add(method.UniqueName, method); } } } bfMethod = method; } return(bfMethod); }
internal void Populate() { if (IsInCoreAssembly) { BaseType = _bfCache.GetBfType(_typeDefinition.BaseType); if (BaseType != null && BaseType.FullName != "System.Object") { BaseType.DerivedTypes.Add(this); } _typeDefinition.Interfaces.Select(t => _bfCache.GetBfType(t)) .Where(t => t != null) .ForEach(t => { Interfaces.Add(t); t.DerivedTypes.Add(this); }); _typeDefinition.Fields.ForEach(f => Fields.Add(new BfField(_bfCache, f, this))); _typeDefinition.Methods.ForEach(m => { var bfMethod = new BfMethod(_bfCache, m, this); Methods.Add(bfMethod); Assembly.GetMethodsDictionary().Add(bfMethod.UniqueName, bfMethod); }); _typeDefinition.Events.ForEach(e => Events.Add(new BfEvent(_bfCache, e, this))); Interfaces.Clear(); Fields.Clear(); Methods.Clear(); Events.Clear(); } }